Lab Sheet 1: Basics & Arrays
DSA Programming Solutions | Instructor: Prof. N L Bhanu Murthy
Q1: The Student Merit System
Description: Define a structure Student with fields: ID (int), Name (string), and Marks (float array of 3 subjects). Write a program to: 1. Read details for N students. 2. Calculate the Average for each student. 3. Print a “Merit List” of students who scored above 75% average. 4. Identify and print the details of the Topper (Highest Average).
2
101 Alice 80 90 85
102 Bob 60 50 55
Merit List:
101 Alice (Avg: 85.00)
Topper: Alice
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int id;
char name[50];
float marks[3];
float average;
} Student;
int main() {
int n, topper_idx = 0;
if (scanf("%d", &n) != 1 || n <= 0) return 1;
Student *students = (Student *)malloc(n * sizeof(Student));
if (students == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < n; i++) {
if (scanf("%d %s %f %f %f", &students[i].id, students[i].name,
&students[i].marks[0], &students[i].marks[1], &students[i].marks[2]) != 5) break;
float sum = 0;
for (int j = 0; j < 3; j++) sum += students[i].marks[j];
students[i].average = sum / 3.0;
if (students[i].average > students[topper_idx].average) {
topper_idx = i;
}
}
printf("\nMerit List (Average > 75%%):\n");
for (int i = 0; i < n; i++) {
if (students[i].average > 75.0) {
printf("%d %s (Avg: %.2f)\n", students[i].id, students[i].name, students[i].average);
}
}
printf("Topper: %s\n", students[topper_idx].name);
free(students);
return 0;
}Q2: Matrix Multiplication
Description: Write a program to multiply two matrices. Read two matrices A and B. Check if multiplication is possible (C1 == R2).
2 2
1 2
3 4
2 2
1 0
0 1
1 2
3 4
#include <stdio.h>
#include <stdlib.h>
void multiplyMatrices(int r1, int c1, int **A, int r2, int c2, int **B, int **C) {
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
C[i][j] = 0;
for (int k = 0; k < c1; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
int **allocateMatrix(int r, int c) {
int **mat = (int **)malloc(r * sizeof(int *));
for (int i = 0; i < r; i++) mat[i] = (int *)malloc(c * sizeof(int));
return mat;
}
void freeMatrix(int **mat, int r) {
for (int i = 0; i < r; i++) free(mat[i]);
free(mat);
}
int main() {
int r1, c1, r2, c2;
if (scanf("%d %d", &r1, &c1) != 2) return 1;
int **A = allocateMatrix(r1, c1);
for (int i = 0; i < r1; i++)
for (int j = 0; j < c1; j++) scanf("%d", &A[i][j]);
if (scanf("%d %d", &r2, &c2) != 2) return 1;
if (c1 != r2) {
printf("Not Possible\n");
freeMatrix(A, r1);
return 0;
}
int **B = allocateMatrix(r2, c2);
for (int i = 0; i < r2; i++)
for (int j = 0; j < c2; j++) scanf("%d", &B[i][j]);
int **C = allocateMatrix(r1, c2);
multiplyMatrices(r1, c1, A, r2, c2, B, C);
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) printf("%d ", C[i][j]);
printf("\n");
}
freeMatrix(A, r1); freeMatrix(B, r2); freeMatrix(C, r1);
return 0;
}Q3: The Text Analyzer
Description: Count words, vowels, and reverse a sentence.
Hello World
Words: 2
Vowels: 3
Reversed: dlroW olleH
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
void analyze(char *str) {
int words = 0, vowels = 0, len = strlen(str);
int in_word = 0;
for (int i = 0; i < len; i++) {
char c = tolower(str[i]);
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') vowels++;
if (isspace(str[i])) in_word = 0;
else if (in_word == 0) {
in_word = 1;
words++;
}
}
printf("Words: %d\nVowels: %d\nReversed: ", words, vowels);
for (int i = len - 1; i >= 0; i--) putchar(str[i]);
printf("\n");
}
int main() {
char *str = (char *)malloc(1000 * sizeof(char));
if (fgets(str, 1000, stdin)) {
str[strcspn(str, "\n")] = 0; // Remove newline
analyze(str);
}
free(str);
return 0;
}Q4: Set Operations
Description: Implement findUnion() and findIntersection() for two arrays.
3
1 2 3
3
2 3 4
Union: 1 2 3 4
Intersection: 2 3
#include <stdio.h>
#include <stdlib.h>
void findUnion(int A[], int n1, int B[], int n2) {
printf("Union: ");
for (int i = 0; i < n1; i++) printf("%d ", A[i]);
for (int i = 0; i < n2; i++) {
int found = 0;
for (int j = 0; j < n1; j++) {
if (B[i] == A[j]) { found = 1; break; }
}
if (!found) printf("%d ", B[i]);
}
printf("\n");
}
void findIntersection(int A[], int n1, int B[], int n2) {
printf("Intersection: ");
int first = 1;
for (int i = 0; i < n1; i++) {
for (int j = 0; j < n2; j++) {
if (A[i] == B[j]) {
if (!first) printf(" ");
printf("%d", A[i]);
first = 0;
break;
}
}
}
if (first) printf("(None)");
printf("\n");
}
int main() {
int n1, n2;
if (scanf("%d", &n1) != 1) return 1;
int *A = (int *)malloc(n1 * sizeof(int));
for (int i = 0; i < n1; i++) scanf("%d", &A[i]);
if (scanf("%d", &n2) != 1) return 1;
int *B = (int *)malloc(n2 * sizeof(int));
for (int i = 0; i < n2; i++) scanf("%d", &B[i]);
findUnion(A, n1, B, n2);
findIntersection(A, n1, B, n2);
free(A); free(B);
return 0;
}Q5: Merge Sorted Arrays
Description: Merge two sorted arrays using the two-pointer method.
3
1 3 5
3
2 4 6
1 2 3 4 5 6
#include <stdio.h>
#include <stdlib.h>
void merge(int A[], int n1, int B[], int n2) {
int *res = (int *)malloc((n1 + n2) * sizeof(int));
int i = 0, j = 0, k = 0;
while (i < n1 && j < n2) {
if (A[i] < B[j]) res[k++] = A[i++];
else res[k++] = B[j++];
}
while (i < n1) res[k++] = A[i++];
while (j < n2) res[k++] = B[j++];
for (int m = 0; m < n1 + n2; m++) printf("%d%s", res[m], (m == n1 + n2 - 1) ? "" : " ");
printf("\n");
free(res);
}
int main() {
int n1, n2;
if (scanf("%d", &n1) != 1) return 1;
int *A = (int *)malloc(n1 * sizeof(int));
for (int i = 0; i < n1; i++) scanf("%d", &A[i]);
if (scanf("%d", &n2) != 1) return 1;
int *B = (int *)malloc(n2 * sizeof(int));
for (int i = 0; i < n2; i++) scanf("%d", &B[i]);
merge(A, n1, B, n2);
free(A); free(B);
return 0;
}Q6: Frequency Counter
Description: Count frequency of each distinct element.
8
10 20 20 10 10 20 5 20
10 -> 3
20 -> 4
5 -> 1
#include <stdio.h>
#include <stdlib.h>
void countFrequency(int arr[], int n) {
int *visited = (int *)calloc(n, sizeof(int));
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int count = 1;
for (int j = i + 1; j < n; j++) {
if (arr[i] == arr[j]) {
count++;
visited[j] = 1;
}
}
printf("%d -> %d\n", arr[i], count);
}
free(visited);
}
int main() {
int n;
if (scanf("%d", &n) != 1) return 1;
int *arr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
countFrequency(arr, n);
free(arr);
return 0;
}Q7: String Compression
Description: Compress aaabbc to a3b2c1.
aaabbc
a3b2c1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void compress(char *s) {
int n = strlen(s);
char *res = (char *)malloc((2 * n + 1) * sizeof(char));
int k = 0;
for (int i = 0; i < n; i++) {
int count = 1;
while (i < n - 1 && s[i] == s[i+1]) {
count++;
i++;
}
res[k++] = s[i];
k += sprintf(&res[k], "%d", count);
}
res[k] = '\0';
printf("%s\n", res);
free(res);
}
int main() {
char *str = (char *)malloc(1000 * sizeof(char));
if (scanf("%s", str) == 1) compress(str);
free(str);
return 0;
}Q8: The Array Rotator
Description: Rotate array Left or Right by K positions.
5
1 2 3 4 5
0
1
2 3 4 5 1
#include <stdio.h>
#include <stdlib.h>
void reverse(int arr[], int start, int end) {
while (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++; end--;
}
}
void rotate(int arr[], int n, int d, int k) {
if (n == 0) return;
k %= n;
if (d == 0) { // Left
reverse(arr, 0, k - 1);
reverse(arr, k, n - 1);
reverse(arr, 0, n - 1);
} else { // Right
reverse(arr, 0, n - 1);
reverse(arr, 0, k - 1);
reverse(arr, k, n - 1);
}
}
int main() {
int n, d, k;
if (scanf("%d", &n) != 1) return 1;
int *arr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
if (scanf("%d %d", &d, &k) != 2) { free(arr); return 1; }
rotate(arr, n, d, k);
for (int i = 0; i < n; i++) printf("%d%s", arr[i], (i == n - 1) ? "" : " ");
printf("\n");
free(arr);
return 0;
}