C program to store Student records as Structures and Sort them by Age or ID
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.
Sorting by Age
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 fields struct Student { char * name; int id; char age; }; // setting up rules for comparison // to sort the students based on age int comparator( const void * p, const void * q) { return ((( struct Student*)p)->age - (( struct Student*)q)->age); } // Driver program int 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; } |
Output:
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
Sorting by 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 = 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 fields struct Student { char * name; int id; char age; }; // setting up rules for comparison // to sort the students based on ID int comparator( const void * p, const void * q) { return ((( struct Student*)p)->id - (( struct Student*)q)->id); } // Driver program int 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; } |
Output:
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
Want to learn from the best curated videos and practice problems, check out the C Foundation Course for Basic to Advanced C.