C program to store Student records as Structures and Sort them by Age or ID
Last Updated :
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.
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:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
char * name;
int id;
char age;
};
int comparator( const void * p, const void * q)
{
return ((( struct Student*)p)->age - (( struct Student*)q)->age);
}
int main()
{
int i = 0, n = 5;
struct Student arr[n];
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;
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);
}
qsort (arr, n, sizeof ( struct Student), comparator);
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:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
char * name;
int id;
char age;
};
int comparator( const void * p, const void * q)
{
return ((( struct Student*)p)->id - (( struct Student*)q)->id);
}
int main()
{
int i = 0, n = 5;
struct Student arr[n];
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;
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);
}
qsort (arr, n, sizeof ( struct Student), comparator);
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
Share your thoughts in the comments
Please Login to comment...