C program to store Student records as Structures and Sort them by Age or ID

29 May, 2019
Given student’s records with each record containing id, name and age of a student. Write a C program to read these records and display them in sorted order by age or id.
Examples:
Input: Student Records = {
{Id = 1, Name = bd, Age = 12 },
{Id = 2, Name = ba, Age = 10 },
{Id = 3, Name = bc, Age = 8 },
{Id = 4, Name = aaz, Age = 9 },
{Id = 5, Name = az, Age = 10 } }

Output:
{{Id = 3, Name = bc, Age = 8 },
{Id = 4, Name = aaz, Age = 9 },
{Id = 2, Name = ba, Age = 10 },
{Id = 5, Name = az, Age = 10 },
{Id = 1, Name = bd, Age = 12 } }

Approach: This problem is solved in the following steps:
Create a structure with fields id, name and age.
Read the students records in the structure
Define a comparator by setting up rules for comparison. Here age can be sorted with the help of difference of the age of 2 students. (Student1 -> age – Student2 -> age)
Now sort the structure based on the defined comparator with the help of qsort() method.
Print the sorted students’ records.
Program:
// C program to read Student records// like id, name and age,// and display them in sorted order by Age  #include <stdio.h>#include <stdlib.h>#include <string.h>  // struct person with 3 fieldsstruct Student {    char* name;    int id;    char age;};  // setting up rules for comparison// to sort the students based on ageint comparator(const void* p, const void* q){    return (((struct Student*)p)->age - ((struct Student*)q)->age);}  // Driver programint main(){    int i = 0, n = 5;      struct Student arr[n];      // Get the students data    arr[0].id = 1;    arr[0].name = "bd";    arr[0].age = 12;      arr[1].id = 2;    arr[1].name = "ba";    arr[1].age = 10;      arr[2].id = 3;    arr[2].name = "bc";    arr[2].age = 8;      arr[3].id = 4;    arr[3].name = "aaz";    arr[3].age = 9;      arr[4].id = 5;    arr[4].name = "az";    arr[4].age = 10;      // Print the Unsorted Structure    printf("Unsorted Student Records:\n");    for (i = 0; i < n; i++) {        printf("Id = %d, Name = %s, Age = %d \n",               arr[i].id, arr[i].name, arr[i].age);    }    // Sort the structure    // based on the specified comparator    qsort(arr, n, sizeof(struct Student), comparator);      // Print the Sorted Structure    printf("\n\nStudent Records sorted by Age:\n");    for (i = 0; i < n; i++) {        printf("Id = %d, Name = %s, Age = %d \n",               arr[i].id, arr[i].name, arr[i].age);    }      return 0;}
Unsorted Student Records:
Id = 1, Name = bd, Age = 12 
Id = 2, Name = ba, Age = 10 
Id = 3, Name = bc, Age = 8 
Id = 4, Name = aaz, Age = 9 
Id = 5, Name = az, Age = 10 


Student Records sorted by Age:
Id = 3, Name = bc, Age = 8 
Id = 4, Name = aaz, Age = 9 
Id = 2, Name = ba, Age = 10 
Id = 5, Name = az, Age = 10 
Id = 1, Name = bd, Age = 12

Examples:
Input: Student Records = {
{Id = 1, Name = bd, Age = 12 },
{Id = 2, Name = ba, Age = 10 },
{Id = 3, Name = bc, Age = 8 },
{Id = 4, Name = aaz, Age = 9 },
{Id = 5, Name = az, Age = 10 } }

Output:
{{Id = 1, Name = bd, Age = 12 },
{Id = 2, Name = ba, Age = 10 },
{Id = 3, Name = bc, Age = 8 },
{Id = 4, Name = aaz, Age = 9 },
{Id = 5, Name = az, Age = 10 } }

Approach: This problem is solved in the following steps:
Create a structure with fields id, name and age.
Read the students records in the structure
Define a comparator by setting up rules for comparison. Here id can be sorted with the help of difference of the id of 2 students. (Student1 -> id – Student2 -> id)
Now sort the structure based on the defined comparator with the help of qsort() method.
Print the sorted students’ records.
Program:
// C program to read Student records// like id, name and age,// and display them in sorted order by ID  #include <stdio.h>#include <stdlib.h>#include <string.h>  // struct person with 3 fieldsstruct Student {    char* name;    int id;    char age;};  // setting up rules for comparison// to sort the students based on IDint comparator(const void* p, const void* q){    return (((struct Student*)p)->id - ((struct Student*)q)->id);}  // Driver programint main(){    int i = 0, n = 5;      struct Student arr[n];      // Get the students data    arr[0].id = 1;    arr[0].name = "bd";    arr[0].age = 12;      arr[1].id = 2;    arr[1].name = "ba";    arr[1].age = 10;      arr[2].id = 3;    arr[2].name = "bc";    arr[2].age = 8;      arr[3].id = 4;    arr[3].name = "aaz";    arr[3].age = 9;      arr[4].id = 5;    arr[4].name = "az";    arr[4].age = 10;      // Print the Unsorted Structure    printf("Unsorted Student Records:\n");    for (i = 0; i < n; i++) {        printf("Id = %d, Name = %s, Age = %d \n",               arr[i].id, arr[i].name, arr[i].age);    }    // Sort the structure    // based on the specified comparator    qsort(arr, n, sizeof(struct Student), comparator);      // Print the Sorted Structure    printf("\n\nStudent Records sorted by ID:\n");    for (i = 0; i < n; i++) {        printf("Id = %d, Name = %s, Age = %d \n",               arr[i].id, arr[i].name, arr[i].age);    }      return 0;}
Unsorted Student Records:
Id = 1, Name = bd, Age = 12 
Id = 2, Name = ba, Age = 10 
Id = 3, Name = bc, Age = 8 
Id = 4, Name = aaz, Age = 9 
Id = 5, Name = az, Age = 10 


Student Records sorted by ID:
Id = 1, Name = bd, Age = 12 
Id = 2, Name = ba, Age = 10 
Id = 3, Name = bc, Age = 8 
Id = 4, Name = aaz, Age = 9 
Id = 5, Name = az, Age = 10

C-Structure & Union
C Programs
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.