Lab Sheet 1: Basics & Arrays

DSA Programming Solutions | Instructor: Prof. N L Bhanu Murthy

Authors

PARTH MUNJAL

AKARSH JAIN

Published

March 30, 2026

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).

NoteSample Input
2
101 Alice 80 90 85
102 Bob 60 50 55
NoteSample Output
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).

NoteSample Input
2 2
1 2
3 4
2 2
1 0
0 1
NoteSample Output
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.

NoteSample Input
Hello World
NoteSample Output
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.

NoteSample Input
3
1 2 3
3
2 3 4
NoteSample Output
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.

NoteSample Input
3
1 3 5
3
2 4 6
NoteSample Output
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.

NoteSample Input
8
10 20 20 10 10 20 5 20
NoteSample Output
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.

NoteSample Input
aaabbc
NoteSample Output
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.

NoteSample Input
5
1 2 3 4 5
0
1
NoteSample Output
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;
}