C Programming Exercises and Solutions
C Programming Exercises and Solutions
1. Greatest Common Divisor and Least Common Multiple
#include
#include
int main()
{
int calculateGCD(int first, int second);
int calculateLCM(int first, int second);
int num1, num2, temp;
printf("Enter two numbers:\n");
scanf("%d%d", &num1, &num2);
if (num1 < num2)
{
temp = num1;
num1 = num2;
num2 = temp;
}
int gcd = calculateGCD(num1, num2);
int lcm = calculateLCM(num1, num2);
printf("Greatest Common Divisor: %d\n", gcd);
printf("Least Common Multiple: %d\n", lcm);
return 0;
}
int calculateGCD(int first, int second)
{
int remainder;
while (second != 0)
{
remainder = first % second;
first = second;
second = remainder;
}
return first;
}
int calculateLCM(int first, int second)
{
int product = first * second;
return product / calculateGCD(first, second);
}
2. Quadratic Equation Solver
1. Define real numbers a, b, c
2. Check if a is zero
3. Handle cases where b²-4ac is greater than, equal to, or less than zero
#include
#include
int main()
{
void solveQuadratic(double, double, double);
double a, b, c;
printf("Enter coefficients a, b, c: ");
scanf("%lf %lf %lf", &a, &b, &c);
solveQuadratic(a, b, c);
return 0;
}
void solveQuadratic(double a, double b, double c)
{
double root1, root2, realPart, imagPart;
if (fabs(a) <= 1e-6)
{
printf("Invalid input: coefficient 'a' cannot be zero\n");
}
else
{
double discriminant = b * b - 4 * a * c;
if (discriminant > 0) // Two distinct real roots
{
root1 = (-b + sqrt(discriminant)) / (2 * a);
root2 = (-b - sqrt(discriminant)) / (2 * a);
printf("Root 1 = %.2lf; Root 2 = %.2lf", root1, root2);
}
else if (discriminant == 0) // Two equal real roots
{
root1 = root2 = -b / (2 * a);
printf("Root 1 = Root 2 = %.2lf", root1);
}
else // Complex roots
{
realPart = -b / (2 * a);
imagPart = sqrt(-discriminant) / (2 * a);
printf("Root 1 = %.2lf + %.2lfi; Root 2 = %.2lf - %.2lfi",
realPart, imagPart, realPart, imagPart);
}
}
}
3. Prime Number Checker
#include
#include
int main()
{
void checkPrime(int);
int number;
printf("Enter an integer: ");
scanf("%d", &number);
checkPrime(number);
return 0;
}
void checkPrime(int num)
{
int i;
if (num <= 1)
printf("%d is not a prime number\n", num);
else if (num == 2)
printf("%d is a prime number\n", num);
else
{
for (i = 2; i <= sqrt(num); i++)
{
if (num % i == 0)
{
printf("%d is not a prime number\n", num);
return;
}
}
printf("%d is a prime number\n", num);
}
}
4. Matrix Operations
Matrix Transposition
#include
int main()
{
void transposeMatrix(int matrix[3][3]);
int matrix[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int row, col;
// Print original matrix
printf("Original Matrix:\n");
for (row = 0; row < 3; row++)
{
for (col = 0; col < 3; col++)
{
printf("%d ", matrix[row][col]);
}
printf("\n");
}
transposeMatrix(matrix); // Transpose the matrix
printf("\nTransposed Matrix:\n");
// Print transposed matrix
for (row = 0; row < 3; row++)
{
for (col = 0; col < 3; col++)
{
printf("%d ", matrix[row][col]);
}
printf("\n");
}
return 0;
}
void transposeMatrix(int matrix[3][3])
{
int row, col, temp;
for (row = 0; row < 3; row++)
{
for (col = row; col < 3; col++)
{
temp = matrix[row][col];
matrix[row][col] = matrix[col][row];
matrix[col][row] = temp;
}
}
}
Copy Matrix to Transpose
#include
int main()
{
int source[2][3] = {{1,2,3},{4,5,6}};
int target[3][2];
int i, j;
// Print original matrix
printf("Original Matrix:\n");
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", source[i][j]);
}
printf("\n");
}
// Transpose by copying
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
target[j][i] = source[i][j];
}
}
// Print transposed matrix
printf("Transposed Matrix:\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
printf("%d ", target[i][j]);
}
printf("\n");
}
return 0;
}
Find Maximum Element in Matrix
#include
int main()
{
int matrix[2][3] = {{1,2,3},{4,5,6}};
int i, j, maxValue, maxRow = 0, maxCol = 0;
maxValue = matrix[0][0];
// Find maximum element and its position
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
if (maxValue < matrix[i][j])
{
maxValue = matrix[i][j];
maxRow = i;
maxCol = j;
}
}
}
printf("Maximum value: %d at row %d, column %d\n", maxValue, maxRow+1, maxCol+1);
return 0;
}
5. String Reversal
#include
#include
void reverseString(char str[])
{
int startIndex = 0;
int endIndex = strlen(str) - 1;
char temp;
while (startIndex < endIndex)
{
temp = str[startIndex];
str[startIndex] = str[endIndex];
str[endIndex] = temp;
endIndex--;
startIndex++;
}
}
int main()
{
char input[100];
printf("Enter a string: ");
fgets(input, sizeof(input), stdin);
printf("Original string: %s", input);
reverseString(input);
printf("Reversed string: %s", input);
return 0;
}
6. String Concatenation
#include
#include
void concatenateStrings(char dest[], char src[])
{
int destLength = strlen(dest);
int i = 0;
while (src[i] != '\0')
{
dest[destLength] = src[i];
i++;
destLength++;
}
dest[destLength] = '\0';
}
int main()
{
char first[100];
char second[50];
printf("Enter first string: ");
fgets(first, sizeof(first), stdin);
printf("Enter second string: ");
fgets(second, sizeof(second), stdin);
// Remove newline characters if present
if (first[strlen(first)-1] == '\n') first[strlen(first)-1] = '\0';
if (second[strlen(second)-1] == '\n') second[strlen(second)-1] = '\0';
concatenateStrings(first, second);
printf("Concatenated string: %s", first);
return 0;
}
7. String Copy
#include
#include
void copyString(char dest[], char src[])
{
int i;
for (i = 0; src[i] != '\0'; i++)
{
dest[i] = src[i];
}
dest[i] = '\0';
}
int main()
{
char source[100];
char destination[100];
printf("Enter source string: ");
fgets(source, sizeof(source), stdin);
// Remove newline character if present
if (source[strlen(source)-1] == '\n') source[strlen(source)-1] = '\0';
copyString(destination, source);
printf("Copied string: %s\n", destination);
return 0;
}
8. Format Four-Digit Number
Method 1: String Processing
#include
void formatNumberString(char str[])
{
int i = 0;
while (str[i] != '\0')
{
printf("%c", str[i]);
if (str[i + 1] == '\0') break; // Don't add space after last character
printf(" ");
i++;
}
}
int main()
{
char numberStr[5]; // 4 digits + null terminator
printf("Enter a 4-digit number: ");
scanf("%4s", numberStr);
formatNumberString(numberStr);
return 0;
}
Method 2: Mathematical Processing
#include
int main()
{
void separateDigits(int number);
int input;
printf("Enter a 4-digit number: ");
scanf("%d",&input);
separateDigits(input);
return 0;
}
void separateDigits(int number)
{
int i,digits[4];
// Extract digits from right to left
for(i=3;i>=0;i--)
{
digits[i] = number % 10;
number /= 10;
}
// Print digits with spaces
for(i=0;i<3;i++)
{
printf("%d ",digits[i]);
}
printf("%d",digits[3]);
}
9. Find Longest Word in a String
#include
#include
int main()
{
void findLongestWord(char text[], char longestWord[]);
char text[100], longestWord[100];
printf("Enter a line of text: ");
fgets(text, sizeof(text), stdin);
findLongestWord(text, longestWord);
printf("Longest word: %s", longestWord);
return 0;
}
void findLongestWord(char text[], char longestWord[])
{
int i = 0, j = 0;
int maxLength = 0;
int currentLength = 0;
// Initialize longestWord as empty
longestWord[0] = '\0';
while (text[i] != '\0')
{
j = i;
currentLength = 0;
// Find end of current word
while (text[j] != ' ' && text[j] != '\0')
{
j++;
currentLength++;
}
// Update longest word if current word is longer
if (currentLength > maxLength)
{
maxLength = currentLength;
strncpy(longestWord, text + i, currentLength);
longestWord[currentLength] = '\0';
}
// Skip to next word
while (text[j] == ' ') j++;
i = j;
}
}
10. Character Sorting
#include
void bubbleSort(char arr[], int n)
{
int i, j;
char temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
char characters[11];
printf("Enter 10 characters: ");
for (int i = 0; i < 10; i++)
scanf(" %c", &characters[i]);
printf("Before sorting: %s\n", characters);
bubbleSort(characters, 10);
printf("After sorting: %s\n", characters);
return 0;
}
11. Recursive Legendre Polynomial Calculation
Recursive formula:
- n = 0: return 1
- n = 1: return x
- n > 1: return ((2n-1)x * P(n-1,x) - (n-1) * P(n-2,x)) / n
#include
double legendrePoly(int n, int x)
{
if (n == 0)
return 1;
else if (n == 1)
return x;
else
return ((2 * n - 1) * x * legendrePoly(n - 1, x) - (n - 1) * legendrePoly(n - 2, x)) / n;
}
int main()
{
int degree, value;
printf("Enter degree (n) and value (x) for Legendre polynomial: ");
scanf("%d%d", °ree, &value);
double result = legendrePoly(degree, value);
printf("Value of %d-degree Legendre polynomial at x=%d: %.4f", degree, value, result);
return 0;
}
12. Recursive Factorial Calculation
Factorial definition:
- n! = 1, if n = 0 or n = 1
- n! = n * (n-1)!, if n > 1
#include
long long factorial(int n)
{
if (n < 0)
{
printf("Error: Negative input\n");
return -1;
}
else if (n == 0 || n == 1)
return 1;
else
return n * factorial(n - 1);
}
int main()
{
long long sum = 0;
printf("Sum of factorials from 1! to 20!:\n");
for (int i = 1; i <= 20; i++)
{
sum += factorial(i);
printf("%2d! = %lld\n", i, factorial(i));
}
printf("Total sum: %lld\n", sum);
return 0;
}
13. Student Grade Processing
Program to process grades for 10 students across 5 courses:
- Calculate average grade for each student
- Calculate average grade for each course
- Find the highest score and identify student and course
- Calculate variance of average grades
#include
#include
#define STUDENTS 10
#define COURSES 5
void calculateStudentAverages(int grades[][COURSES]);
void calculateCourseAverages(int grades[][COURSES]);
void findHighestScore(int grades[][COURSES]);
double calculateVariance(float averages[], int count);
int main()
{
int studentGrades[STUDENTS][COURSES];
int i, j;
// Input grades
printf("Enter grades for %d students across %d courses:\n", STUDENTS, COURSES);
for (i = 0; i < STUDENTS; i++)
{
printf("Student %d: ", i + 1);
for (j = 0; j < COURSES; j++)
{
scanf("%d", &studentGrades[i][j]);
}
}
calculateStudentAverages(studentGrades);
calculateCourseAverages(studentGrades);
findHighestScore(studentGrades);
return 0;
}
void calculateStudentAverages(int grades[][COURSES])
{
int i, j;
float sum, average;
printf("\nStudent Averages:\n");
for (i = 0; i < STUDENTS; i++)
{
sum = 0.0;
for (j = 0; j < COURSES; j++)
{
sum += grades[i][j];
}
average = sum / COURSES;
printf("Student %d: %.2f\n", i + 1, average);
}
}
void calculateCourseAverages(int grades[][COURSES])
{
int i, j;
float sum, average;
printf("\nCourse Averages:\n");
for (j = 0; j < COURSES; j++)
{
sum = 0.0;
for (i = 0; i < STUDENTS; i++)
{
sum += grades[i][j];
}
average = sum / STUDENTS;
printf("Course %d: %.2f\n", j + 1, average);
}
}
void findHighestScore(int grades[][COURSES])
{
int i, j, maxScore = 0, studentNum = 0, courseNum = 0;
for (i = 0; i < STUDENTS; i++)
{
for (j = 0; j < COURSES; j++)
{
if (grades[i][j] > maxScore)
{
maxScore = grades[i][j];
studentNum = i + 1;
courseNum = j + 1;
}
}
}
printf("\nHighest Score: %d (Student %d, Course %d)\n", maxScore, studentNum, courseNum);
}
14. Employee Information System
Program to manage employee data with the following features:
- Input employee numbers and names
- Sort employees by number using bubble sort
- Search for employee by number using binary search
#include
#include
#define NUM_EMPLOYEES 3
#define NAME_LENGTH 20
void inputEmployeeData(int ids[], char names[][NAME_LENGTH]);
void sortEmployees(int ids[], char names[][NAME_LENGTH]);
void searchEmployee(int targetId, int ids[], char names[][NAME_LENGTH]);
int main()
{
int employeeIds[NUM_EMPLOYEES];
char employeeNames[NUM_EMPLOYEES][NAME_LENGTH];
inputEmployeeData(employeeIds, employeeNames);
printf("\nEmployee List (before sorting):\n");
for (int i = 0; i < NUM_EMPLOYEES; i++)
{
printf("%d: %s\n", employeeIds[i], employeeNames[i]);
}
sortEmployees(employeeIds, employeeNames);
printf("\nEmployee List (after sorting):\n");
for (int i = 0; i < NUM_EMPLOYEES; i++)
{
printf("%d: %s\n", employeeIds[i], employeeNames[i]);
}
printf("\nEnter employee ID to search: ");
int searchId;
scanf("%d", &searchId);
searchEmployee(searchId, employeeIds, employeeNames);
return 0;
}
void inputEmployeeData(int ids[], char names[][NAME_LENGTH])
{
for (int i = 0; i < NUM_EMPLOYEES; i++)
{
printf("Enter employee ID and name for employee %d: ", i + 1);
scanf("%d", &ids[i]);
getchar(); // Consume newline
fgets(names[i], NAME_LENGTH, stdin);
// Remove newline character if present
if (names[i][strlen(names[i])-1] == '\n')
names[i][strlen(names[i])-1] = '\0';
}
}
void sortEmployees(int ids[], char names[][NAME_LENGTH])
{
int i, j, tempId;
char tempName[NAME_LENGTH];
for (i = 0; i < NUM_EMPLOYEES - 1; i++)
{
for (j = 0; j < NUM_EMPLOYEES - i - 1; j++)
{
if (ids[j] > ids[j + 1])
{
// Swap IDs
tempId = ids[j];
ids[j] = ids[j + 1];
ids[j + 1] = tempId;
// Swap names
strcpy(tempName, names[j]);
strcpy(names[j], names[j + 1]);
strcpy(names[j + 1], tempName);
}
}
}
}
void searchEmployee(int targetId, int ids[], char names[][NAME_LENGTH])
{
int low = 0, high = NUM_EMPLOYEES - 1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (targetId < ids[mid])
high = mid - 1;
else if (targetId > ids[mid])
low = mid + 1;
else
{
printf("Employee ID %d found: %s\n", targetId, names[mid]);
return;
}
}
printf("Employee ID %d not found\n", targetId);
}
15. Number Base Conversion
Hexadecimal to Decimal Conversion
#include
#include
int hexToDecimal(char hex[])
{
int length, decimal = 0;
for (int i = 0; hex[i] != '\0'; i++) {
if (hex[i] >= 'a' && hex[i] <= 'f')
decimal = decimal * 16 + (hex[i] - 'a' + 10);
else if (hex[i] >= 'A' && hex[i] <= 'F')
decimal = decimal * 16 + (hex[i] - 'A' + 10);
else
decimal = decimal * 16 + (hex[i] - '0');
}
return decimal;
}
int main() {
char hexNumber[9]; // 8 hex digits + null terminator
printf("Enter an 8-digit hexadecimal number: ");
scanf("%8s", hexNumber);
int decimalValue = hexToDecimal(hexNumber);
printf("Decimal equivalent: %d\n", decimalValue);
return 0;
}
Decimal to Hexadecimal Conversion
#include
void decimalToHex(int decimal)
{
if (decimal == 0)
{
printf("0\n");
return;
}
char hexDigits[16] = "0123456789ABCDEF";
char hexString[50];
int i = 0;
// Convert to hexadecimal
while (decimal > 0)
{
hexString[i++] = hexDigits[decimal % 16];
decimal /= 16;
}
hexString[i] = '\0';
// Print in reverse order
printf("Hexadecimal equivalent: ");
for (int j = i - 1; j >= 0; j--)
{
printf("%c", hexString[j]);
}
printf("\n");
}
int main()
{
int number;
printf("Enter a decimal number: ");
scanf("%d", &number);
decimalToHex(number);
return 0;
}
16. Recursive Number to String Conversion
#include
void numberToString(int num)
{
if (num / 10 != 0)
numberToString(num / 10);
printf("%c", (num % 10) + '0');
}
int main()
{
int number;
printf("Enter an integer: ");
scanf("%d", &number);
printf("String representation: ");
if (number < 0)
{
printf("-");
numberToString(-number);
}
else
{
numberToString(number);
}
printf("\n");
return 0;
}
17. Day of Year Calculation
Program to calculate the day of the year for a given date (year, month, day)
#include
int isLeapYear(int year);
int dayOfYear(int year, int month, int day);
int daysInMonth(int month, int year);
int main()
{
int year, month, day;
printf("Enter year, month, day (e.g., 2023 12 31): ");
scanf("%d%d%d", &year, &month, &day);
if (month < 1 || month > 12 || day < 1 || day > daysInMonth(month, year))
{
printf("Invalid date\n");
return 1;
}
int dayNumber = dayOfYear(year, month, day);
printf("Day of the year: %d\n", dayNumber);
return 0;
}
int isLeapYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int daysInMonth(int month, int year)
{
int daysPerMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && isLeapYear(year))
return 29;
return daysPerMonth[month - 1];
}
int dayOfYear(int year, int month, int day)
{
int dayCount = 0;
// Add days for all months before the current month
for (int m = 1; m < month; m++)
{
dayCount += daysInMonth(m, year);
}
// Add days in the current month
dayCount += day;
return dayCount;
}