C Programming Core Concepts: Arrays, Operators, and Control Flow

Write a program with a function that takes an array as an argument and returns its sum to the main function.

(Note: The following code demonstrates passing array elements to a function, not summing an array as per the heading’s question.)

#include <stdio.h>

void display(int age1, int age2) {
  printf("%d\n", age1);
  printf("%d\n", age2);
}

int main() {
  int ageArray[] = {2, 8, 4, 12};
  // pass second and third elements to display()
  display(ageArray[1], ageArray[2]); 
  return 0;
}

Output

8
4

What is operator associativity? Explain conditional and logical operators briefly.

Operator associativity defines the order in which operators of the same precedence are evaluated in an expression. It can be either:

  1. Left-associative (evaluated left to right) – e.g., a + b + c is (a + b) + c.
  2. Right-associative (evaluated right to left) – e.g., a = b = c is a = (b = c).

Most operators (like +, -, *, /) are left-associative, while assignment (=) and exponentiation (** in some languages) are right-associative.

Conditional and Logical Operators

1. Logical Operators

Used to combine boolean expressions:

  • && (AND) → true if both operands are true.
  • || (OR) → true if at least one operand is true.
  • ! (NOT) → Inverts the boolean value.

Example:

if (a > 0 && b /* < some_value ... rest of condition */) {
  // Code here
}

2. Conditional (Ternary) Operator

A shorthand for if-else:

  • Syntax: condition ? expr1 : expr2
  • If condition is true, expr1 executes; else, expr2.

Example:

int max = (a > b) ? a : b; // Returns the larger value

How is a keyword different from a variable? Discuss basic data types with their ranges.

Difference between Keyword and Variable

Keyword:

  • A keyword is a reserved word in a programming language that has a fixed meaning and purpose.
  • Keywords cannot be used as identifiers (e.g., variable names, function names).
  • Examples: int, if, else, return, while.

Variable:

  • A variable is a user-defined name that stores data values.
  • Variables can be changed during program execution.
  • They must follow naming rules (e.g., cannot start with a number, cannot be a keyword).
  • Example: int age = 25; (Here, age is a variable).

Basic Data Types with Their Ranges

Data TypeSize (Bytes)Range
int4-2,147,483,648 to 2,147,483,647
float43.4E-38 to 3.4E+38 (approx. 6-7 decimal digits)
double81.7E-308 to 1.7E+308 (approx. 15 decimal digits)
char1-128 to 127 (or 0 to 255 for unsigned)
bool1true or false (typically in C++, C uses _Bool or int)

Write a program to find the sum of diagonal elements of an n x n matrix.

#include <stdio.h>

int main() {
  static int array[10][10];
  int i, j, m, n, a = 0, sum = 0;
  printf("Enter the order of the matrix: \n");
  scanf("%d %d", &m, &n);
  if (m == n) {
    printf("Enter the coefficients of the matrix:\n");
    for (i = 0; i < m; i++) {
      for (j = 0; j < n; j++) {
        scanf("%d", &array[i][j]);
      }
    }
    printf("The given matrix is: \n");
    for (i = 0; i < m; i++) {
      for (j = 0; j < n; j++) {
        printf(" %d", array[i][j]);
      }
      printf("\n");
    }
    for (i = 0; i < m; i++) {
      sum = sum + array[i][i];
      a = a + array[i][m - i - 1];
    }
    printf("\nThe sum of the main diagonal elements is = %d\n", sum);
    printf("The sum of the off-diagonal elements is = %d\n", a);
  } else {
    printf("The given order is not a square matrix.\n");
  }
  return 0; // Added return 0 for int main()
}

Why are arrays and pointers similar? Write a program to show the similarity between an array and a pointer.

Arrays and pointers are similar in the following ways:

  1. Array Name as a Pointer: The name of an array acts like a constant pointer to the first element of the array. For example, arr is equivalent to &arr[0].
  2. Pointer Arithmetic: Both arrays and pointers support pointer arithmetic. For instance, *(arr + i) is the same as arr[i].
  3. Passing to Functions: When an array is passed to a function, it decays into a pointer to its first element. Hence, function parameters like int arr[] are treated as int *arr.

Programming Example

#include <stdio.h>

int main() {
  int i, x[6], sum = 0;
  printf("Enter 6 numbers: ");
  for(i = 0; i < 6; i++) {
    // Equivalent to scanf("%d", &x[i]);
    scanf("%d", x + i);
    // Equivalent to sum += x[i]
    sum += *(x + i);
  }
  printf("Sum = %d\n", sum); // Added newline for better output formatting
  return 0;
}

Explain any four input/output functions used in the C language with suitable examples.

In C programming, input/output (I/O) functions are used to read input from the user and display output. Here are four commonly used I/O functions with examples:

  1. printf() – Formatted Output Function

    Used to display output on the screen.

    Syntax:

    printf("format string", arguments);

    Example:

    #include <stdio.h>
    
    int main() {
      int age = 25;
      printf("My age is %d\n", age); // Output: My age is 25
      return 0;
    }
  2. scanf() – Formatted Input Function

    Used to read input from the user.

    Syntax:

    scanf("format string", &variable);

    Example:

    #include <stdio.h>
    
    int main() {
      int num;
      printf("Enter a number: ");
      scanf("%d", &num); // Reads an integer input
      printf("You entered: %d\n", num);
      return 0;
    }
  3. getchar() – Single Character Input

    Reads a single character from the standard input (keyboard).

    Syntax:

    char ch = getchar();

    Example:

    #include <stdio.h>
    
    int main() {
      char c;
      printf("Enter a character: ");
      c = getchar(); // Reads a single character
      printf("You entered: %c\n", c);
      return 0;
    }
  4. putchar() – Single Character Output

    Displays a single character on the screen.

    Syntax:

    putchar(char_variable);

    Example:

    #include <stdio.h>
    
    int main() {
      char ch = 'A';
      putchar(ch); // Output: A
      putchar('\n'); // Added for newline
      return 0;
    }

Write a program to create a file “duplicate” that contains the exact copy of the file “original”.

#include <stdio.h>
// It's good practice to include stdlib.h for EXIT_FAILURE/EXIT_SUCCESS if used
// #include <stdlib.h> 

int main() {
  FILE *original, *duplicate;
  char ch;
  // Open the original file in read mode
  original = fopen("original.txt", "r"); // Assuming .txt for clarity, original name was "original"
  if (original == NULL) {
    perror("Error opening original file"); // perror provides more error info
    return 1;
  }
  // Open the duplicate file in write mode
  duplicate = fopen("duplicate.txt", "w"); // Assuming .txt for clarity
  if (duplicate == NULL) {
    perror("Error opening duplicate file");
    fclose(original);
    return 1;
  }
  // Read and write characters until EOF
  while ((ch = fgetc(original)) != EOF) {
    fputc(ch, duplicate);
  }
  // Close both files
  fclose(original);
  fclose(duplicate);
  printf("File duplicated successfully.\n");
  return 0;
}

What do you mean by a multi-dimensional array?

A multi-dimensional array is an array that contains one or more arrays as its elements, effectively extending the concept of a single-dimensional array to multiple dimensions. It organizes data in a tabular or matrix-like structure with rows, columns, and possibly higher dimensions.

Definition

A multi-dimensional array is an array of arrays, where each element can itself be an array, forming a nested structure.

Common Types

  • 2D Array (Matrix): Has rows and columns (e.g., a table).
  • 3D Array: Extends to depth (e.g., a cube).
  • Higher dimensions (4D, 5D, etc.) are possible but less common.

Example

A 2D array in C (declaration and initialization):

int matrix[3][3] = {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
};

A 2D array in Python (using nested lists, as originally mentioned):

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Use Cases

  • Representing grids (e.g., chessboard, spreadsheet).
  • Storing images (e.g., 2D for grayscale, 3D for height × width × color channels).
  • Scientific computing (e.g., tensors in machine learning, matrices in linear algebra).

Advantage

Simplifies storage and manipulation of structured data (e.g., mathematical matrices) by providing a systematic indexing mechanism (e.g., arr[i][j] for 2D, arr[i][j][k] for 3D).

How is the break statement different from the continue statement? Explain with examples.

The break statement and continue statement are control flow statements in C that alter the execution of loops. Here are their key differences and characteristics:

Break Statement

  • The break statement has the ability to halt the entire execution flow within a loop (for, while, do-while) or a switch statement.
  • It is particularly useful when a specific condition is satisfied, allowing for early termination of the loop without the need to iterate through any remaining iterations.
  • It can be utilized to enhance code efficiency and flexibility of control flow structures. It can be used in switch, for, while, and do-while loop statements.
  • It provides the ability to swiftly exit the loop (or switch) as soon as it is encountered.
  • In this, the flow control of the loop (or switch) is interrupted entirely, and execution resumes at the statement immediately following the terminated loop or switch.
  • Syntax: break;
  • Example:
    for (int i = 0; i < 10; i++) {
      if (i == 5) {
        break; // Exits the loop when i is 5
      }
      printf("%d ", i);
    }
    // Output: 0 1 2 3 4

Continue Statement

  • The continue statement has the ability to skip the current iteration in a loop (for, while, do-while) and proceed to the next iteration.
  • It allows the loop to smoothly move on to the next iteration, effectively bypassing the remaining code in the current iteration.
  • It is not used for switch statements but primarily used in for, while, and do-while loops.
  • By skipping the remaining code within the current iteration, it seamlessly proceeds to the next iteration (after evaluating the loop’s condition/increment).
  • In this, only the current iteration’s flow is interrupted; the loop itself continues.
  • Syntax: continue;
  • Example:
    for (int i = 0; i < 10; i++) {
      if (i % 2 == 0) {
        continue; // Skips the rest of the loop for even numbers
      }
      printf("%d ", i);
    }
    // Output: 1 3 5 7 9

What is the basic structure of a C program? Explain each part.

A basic C program structure typically includes documentation, preprocessor directives (like header files), global declarations, the main() function (where execution begins), and optional user-defined functions. Here’s a breakdown of each part:

1. Documentation Section

This section provides comments that explain the program’s purpose, author, date, and other relevant details. Comments are ignored by the compiler and are for human readers.

/* 
 * Program: My First C Program
 * Author: Jane Doe
 * Date: 2023-10-26
 */

2. Preprocessor Directives (e.g., Header Files)

These lines begin with # and are processed by the preprocessor before compilation. The most common is #include, which includes the content of a specified file (often a header file like stdio.h for standard input/output functions).

#include <stdio.h>  // For printf, scanf, etc.
#define PI 3.14159   // Defines a macro

3. Global Declarations

Variables, functions, and structures declared outside any function are global. They are accessible from any part of the program (within the same file, or other files if declared with extern). Global variables are generally used sparingly.

int global_variable = 100; // A global variable
void utility_function();    // Declaration of a global function

4. main() Function

The main() function is the entry point of every C program. Execution begins here. It typically returns an integer value to the operating system (0 for success, non-zero for error).

int main() {
  // Program logic starts here
  printf("Hello, World!\n");
  return 0; // Indicates successful execution
}

5. User-Defined Functions

These are blocks of code that perform specific tasks. They can be called from main() or other functions to promote modularity and code reuse. They must be declared before use or defined before main() if not declared separately.

// Function definition
int add(int a, int b) {
  return a + b;
}

// main function might call it
int main() {
  int sum = add(5, 3);
  printf("Sum is: %d\n", sum);
  return 0;
}

What do you mean by a flowchart?

A flowchart is a diagrammatic representation of a process, workflow, or algorithm. It uses standardized symbols (like rectangles for processes, diamonds for decisions, ovals for start/end points, and arrows for flow direction) to illustrate the sequence of steps, decisions, and the overall flow of control. Flowcharts help in visualizing, analyzing, designing, documenting, and managing a process or program in a clear and logical manner.

Example Algorithm (Find the largest of three numbers A, B, C):

  1. Start
  2. Input A, B, C
  3. If (A > B) and (A > C) then print “A is greater”.
  4. Else if (B > A) and (B > C) then print “B is greater”.
  5. Else print “C is greater”.
  6. Stop

Flowchart:

Zj6KAAAAAElFTkSuQmCC

Write a program to display the sum of two m x n matrices.

#include <stdio.h>

int main() {
  int rows, columns;
  printf("Enter the number of rows and columns: ");
  scanf("%d %d", &rows, &columns);

  // Declare matrices using Variable Length Arrays (VLAs - C99 standard)
  int A[rows][columns], B[rows][columns], C[rows][columns];

  printf("Enter elements of Matrix A:\n");
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < columns; j++) {
      printf("Enter A[%d][%d]: ", i, j); // Prompt for each element
      scanf("%d", &A[i][j]);
    }
  }

  printf("Enter elements of Matrix B:\n");
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < columns; j++) {
      printf("Enter B[%d][%d]: ", i, j); // Prompt for each element
      scanf("%d", &B[i][j]);
    }
  }

  // Calculate the sum of matrices A and B, store in C
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < columns; j++) {
      C[i][j] = A[i][j] + B[i][j];
    }
  }

  printf("Resultant Matrix (A + B):\n");
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < columns; j++) {
      printf("%d ", C[i][j]);
    }
    printf("\n");
  }

  return 0;
}