C语言 qsort的用法 模拟EXCEL排序
题目
Excel可以对一组记录按任意指定列排序。现请编写程序实现类似的功能。
输入
输入的第一行包含两个正整数N(<= 10^5)和C,其中N是记录的条数,C是指定排序的列号。之后有N行,每行包含一条学生记录。每条学生记录由学号(6位数字,保证没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(【0,100】内的整数)组成,相邻属性用1个空格隔开。
输出
在N行中输出按要求排序后的结果,即:当C=1时,按学号递增排序;当C=2时,按姓名的非递减字典序排序;当C=3时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
样例
题解
本题主要工作就是编写qsort函数的自定义cmp函数,实现结构体多级关键字排序。
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct record{
char id[6];
int score;
char name[8];
}records;
int cmp_id(const void *a, const void *b){
//以学号(字符串)为关键字,递增排序
return strcmp((*(records*)a).id, (*(records*)b).id);
}
int cmp_name(const void *a, const void *b){
//以姓名(字符串)为关键字,非递减字典序排序
//若姓名相同,按学号(字符串)递增排序
records *x = (records*)a;
records *y = (records*)b;
if (strcmp(x->name, y->name))
return strcmp(x->name, y->name);
else
return strcmp(x->id, y->id);
}
int cmp_score(const void *a, const void *b){
//以成绩为关键字,非递减排序
//若成绩相同,按学号(字符串)递增排序
records *x = (records*)a;
records *y = (records*)b;
if (x->score != y->score)
return x->score - y->score;
else
return strcmp(x->id, y->id);
}
int main(){
int n,c;
records student[100005];
scanf("%d %d", &n, &c);
for (int i = 0; i < n; i++){
scanf("%s %s %d", student[i].id, student[i].name, &student[i].score);
}
switch (c) {
case 1:
qsort(student, n, sizeof(student[0]), cmp_id);
break;
case 2:
qsort(student, n, sizeof(student[0]), cmp_name);
break;
case 3:
qsort(student, n, sizeof(student[0]), cmp_score);
break;
}
for (int i = 0; i < n; i++){
printf("%s %s %d\n", student[i].id, student[i].name, student[i].score);
}
return 0;
}