1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <stdio.h> #include <string.h> #include <stdlib.h>
struct Student { char name[21]; int age; int id; };
void LoadAndSortStudents(char mode, struct Student **stus, int *n);
int main() { char mode = getchar(); struct Student *students; int n; LoadAndSortStudents(mode, &students, &n); for (int i = 0; i < n; i++) { printf("id: %d, name: %s, age: %d\n", students[i].id, students[i].name, students[i].age); } return 0; }
int cmpByNameThenId(const void *a, const void *b) { const struct Student *s1 = (const struct Student *)a; const struct Student *s2 = (const struct Student *)b;
int nameCmp = strcmp(s1->name, s2->name); if (nameCmp != 0) { return nameCmp; }
return s1->id - s2->id; }
int cmpByAgeThenId(const void *a, const void *b) { const struct Student *s1 = (const struct Student *)a; const struct Student *s2 = (const struct Student *)b;
if (s1->age != s2->age) { return s1->age - s2->age; }
return s1->id - s2->id; }
int cmpById(const void *a, const void *b) { const struct Student *s1 = (const struct Student *)a; const struct Student *s2 = (const struct Student *)b;
return s1->id - s2->id; }
void LoadAndSortStudents(char mode, struct Student **stus, int *n) { FILE *fp; fp = fopen("stuInfo.dat", "rb"); if (fp == NULL) return; fread(n, sizeof(int), 1, fp); *stus = (struct Student *)malloc(sizeof(struct Student) * (*n)); if (*stus == NULL) { fclose(fp); return; } fread(*stus, sizeof(struct Student), *n, fp);
switch(mode) { case 'n': goto n; case 'a': goto a; case 'i': goto i; default: fclose(fp); free(*stus); return; } n: qsort(*stus, *n, sizeof(struct Student), cmpByNameThenId); fclose(fp); return; a: qsort(*stus, *n, sizeof(struct Student), cmpByAgeThenId); fclose(fp); return; i: qsort(*stus, *n, sizeof(struct Student), cmpById); fclose(fp); return; }
|