Search code examples
arrayscsortingstructure

How to sort an array inside a structure in c?


I want to sort elements of the marks[] array inside a structure student using a sort function, so that marks/elements print in ascending order. But marks/elements are printing in same order.

Problem:

*Write a ‘C’ program to accept n student details as roll number, name, marks of three subjects. Calculate sum, percentage and sort student details based on percentage using following function prototypes.

void accept(struct student s[10], int n);
void display(struct student s[10], int n);
void sort(struct student s[10], int n);

Here is my code:

#include <stdio.h>
#include <stdlib.h>
 
struct student{
    char name[10];
    int rollno;
    int marks[3];  //array of 3 subjects marks
    int totalMarks;
    float percent;
};

void calculate(struct student s[10], int n) {
    //calculate total marks, &percent using loop
    int i, m;
    for (i = 0; i < n; i++) {
         s[i].totalMarks = 0;
         s[i].percent = 0.0;
         for (m = 0; m < 3; m++) {  
              s[i].totalMarks += s[i].marks[m];
         }
         s[i].percent = s[i].totalMarks / 3.0;
    }
}

void display(struct student s[10], int n) {
    int i, m;
    for (i = 0; i < n; i++) {
        printf("Student's Name: %s\n", s[i].name);
        printf("Student's Rollno: %d\n", s[i].rollno);
        for (m = 0; m < 3; m++) {
            printf("Subject %d Marks: %d\n", m+1, s[i].marks[m]);
        }
        printf("Total Marks: %d\n", s[i].totalMarks);
        printf("Total Percent: %.2f\n", s[i].percent);
        printf("\n");
    }  
}

void sort(struct student s[10], int n) {
    int i, j, m;

    //Sort elements of Array(marks[] ) inside Structure (student) in C
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (s[i].marks[m] > s[j].marks[m]) {
                struct student temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
    }

    //DISPLAY
    for (i = 0; i < n; i++) {
        printf("Student's Name: %s\n", s[i].name);
        printf("Student's Rollno: %d\n", s[i].rollno);
        for (m = 0; m < 3; m++) {
            printf("%d ", s[i].marks[m]);
        }
        printf("Total Marks: %d\n", s[i].totalMarks);
        printf("Total Percent: %.2f\n", s[i].percent);
        printf("\n");
    } 
}

int main() {
    struct student s[10]; //minimum of 10 students

    int i, n, m;
    printf("Enter the number of students: ");
    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        printf("\nEnter student's name: ");
        scanf("%s", s[i].name);
        printf("Enter student's rollno: ");
        scanf("%d", &s[i].rollno);
        for (m = 0; m < 3; m++) {
            printf("Enter the student's marks: ", m + 1);
            scanf("%d", &s[i].marks[m]);
        }
        printf("\n");
    }

    calculate(s, n);  //structure,number of students

    printf("\nstudent's Information-------------\n");
    display(s, n);
    printf("\n");

    printf("\nSort the Array in ascending order of marks:");
    sort(s, n);
    printf("\n");
}

The marks don't get sorted.


Solution

  • There is a confusion in your code between the index i into the student array and the index m into the marks array of each student, which is not even initialized, giving the code undefined behavior. Compiling with warnings enabled (eg: gcc -Wall -Wextra -Werror) would have caught this problem.

    You should iterate on the student array, and for each student, sort its mark array using 2 nested loops.

    Here is a modified version:

    #include <stdio.h>
     
    struct student {
        char name[10];
        int rollno;
        int marks[3];  //array of 3 subjects marks
        int totalMarks;
        float percent;
    };
    
    void calculate(struct student s[10], int n) {
        //calculate total marks and percentage using loop
        for (int i = 0; i < n; i++) {
             s[i].totalMarks = 0;
             s[i].percent = 0.0;
             for (int m = 0; m < 3; m++) {  
                 s[i].totalMarks += s[i].marks[m];
             }
             s[i].percent = s[i].totalMarks / 3.0;
        }
    }
    
    void display(struct student s[10], int n) {
        for (int i = 0; i < n; i++) {
            printf("Student's Name: %s\n", s[i].name);
            printf("Student's Rollno: %d\n", s[i].rollno);
            for (int m = 0; m < 3; m++) {
                printf("Subject %d Marks: %d\n", m + 1, s[i].marks[m]);
            }
            printf("Total Marks: %d\n", s[i].totalMarks);
            printf("Total Percent: %.2f\n", s[i].percent);
            printf("\n");
        }
    }
    
    /* sort an array of marks */
    void sort_marks(int *marks, int n) {
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < i; j++) {
                if (marks[i] > marks[j]) {
                    int temp = marks[i];
                    marks[i] = marks[j];
                    marks[j] = temp;
                }
            }
        }
    }
    
    void sort(struct student s[10], int n) {
        //Sort elements of Array(marks[]) inside Structure (student) in C
        for (int i = 0; i < n; i++) {
            sort_marks(s[i].marks, 3);
        }
    }
    
    int main() {
        struct student s[10] = { 0 }; //maximum of 10 students
        int n;
    
        printf("Enter the number of students: ");
        if (scanf("%d", &n) != 1 || n <= 0 || n > 10)
            return 1;
    
        for (int i = 0; i < n; i++) {
            printf("\nEnter student's name: ");
            scanf("%9s", s[i].name);
            printf("Enter student's rollno: ");
            scanf("%d", &s[i].rollno);
            for (int m = 0; m < 3; m++) {
                printf("Enter the student's marks: ", m + 1);
                scanf("%d", &s[i].marks[m]);
            }
            printf("\n");
        }
    
        calculate(s, n);  //structure,number of students
    
        printf("\nstudent's Information-------------\n");
        display(s, n);
        printf("\n");
    
        printf("\nSort the Array in ascending order of marks:");
        sort(s, n);
        display(s, n);
        printf("\n");
        return 0;
    }