Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PLAYERS 500
#define INPUT_FILE "input.txt"
typedef struct {
char name[20];
char team[20];
int batting_avg;
} Cricket;
int read_players(Cricket *list)
{
FILE *in;
char *newline;
int i;
if ((in = fopen(INPUT_FILE, "r")) == NULL)
return -1;
for (i = 0;; i++) {
if (fgets(list[i].name, sizeof list[i].name, in) == NULL)
break;
if ((newline = strchr(list[i].name, '\n')) != NULL)
*newline = '\0';
if (fgets(list[i].team, sizeof list[i].team, in) == NULL)
return -1;
if ((newline = strchr(list[i].team, '\n')) != NULL)
*newline = '\0';
if (fscanf(in, "%d", &list[i].batting_avg) != 1)
return -1;
fgetc(in);
}
fclose(in);
return i;
}
int cmp_name(const void *a, const void *b)
{
return strcmp(((Cricket*)a)->name, ((Cricket*)b)->name);
}
int cmp_team(const void *a, const void *b)
{
return strcmp(((Cricket*)a)->team, ((Cricket*)b)->team);
}
int cmp_avg(const void *a, const void *b)
{
if (((Cricket*)a)->batting_avg > ((Cricket*)b)->batting_avg)
return -1;
else if (((Cricket*)a)->batting_avg < ((Cricket*)b)->batting_avg)
return 1;
else
return 0;
}
int main(void)
{
Cricket Player[MAX_PLAYERS];
int n;
int i;
if ((n = read_players(Player)) != -1) {
puts("SORT BY NAME");
qsort(Player, n, sizeof Player[0], cmp_name);
for (i = 0; i < n; i++) {
printf("Player: %s\nTeam: %s\nBatting AVG: %d\n\n",
Player[i].name, Player[i].team, Player[i].batting_avg);
}
puts("SORT BY TEAM");
qsort(Player, n, sizeof Player[0], cmp_team);
for (i = 0; i < n; i++) {
printf("Player: %s\nTeam: %s\nBatting AVG: %d\n\n",
Player[i].name, Player[i].team, Player[i].batting_avg);
}
puts("SORT BY BATTING AVG");
qsort(Player, n, sizeof Player[0], cmp_avg);
for (i = 0; i < n; i++) {
printf("Player: %s\nTeam: %s\nBatting AVG: %d\n\n",
Player[i].name, Player[i].team, Player[i].batting_avg);
}
}
return 0;
}