PTA_数据结构与算法_7-37 模拟EXCEL排序 (25分)
Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。输入格式:输入的第一行包含两个正整数N(≤10^5) 和C,其中N是纪录的条数,C是指定排序的列号。之后有 N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,保证没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩([0, 100]内的整数)组成,相邻属性用1个空格隔开。输出格式:在N行中输出按要求排序...
·
Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。
输入格式:
输入的第一行包含两个正整数N(≤10^5) 和C,其中N是纪录的条数,C是指定排序的列号。之后有 N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,保证没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩([0, 100]内的整数)组成,相邻属性用1个空格隔开。
输出格式:
在N行中输出按要求排序后的结果,即:当C=1时,按学号递增排序;当C=2时,按姓名的非递减字典序排序;当C=3时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
输入样例:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
输出样例:
000001 Zoe 60
000007 James 85
000010 Amy 90
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXID 7
#define MAXNAME 9
#define MAXN 100000
struct Student{
char id[MAXID];
char name[MAXNAME];
int grade;
} Record[MAXN];
int ComparId(const void *a, const void *b);//比较学号
int ComparName(const void *a, const void *b);//比较姓名
int ComparGrade(const void *a, const void *b);//比较成绩
int main()
{
int N, C;
scanf("%d%d",&N,&C);
for(int i=0;i<N;i++)//读入数据
scanf("%s %s %d",Record[i].id, Record[i].name, &Record[i].grade);//注意,id和name为数组,grade为整型变量,grade前要加&
switch(C){//根据C选择相应列进行排序
case 1 : qsort(Record, N, sizeof(struct Student), ComparId);//qsort(待排数组名, 参与排序元素个数, 单个元素大小, 排序方法)
break;
case 2 : qsort(Record, N, sizeof(struct Student), ComparName);
break;
case 3 : qsort(Record, N, sizeof(struct Student), ComparGrade);
break;
}
for(int i=0;i<N;i++)
printf("%s %s %d\n",Record[i].id, Record[i].name, Record[i].grade);
return 0;
}
int ComparId(const void *a, const void *b){
return strcmp(((const struct Student*)a)->id, ((const struct Student*)b)->id);
}
int ComparName(const void *a, const void *b){
int k = strcmp(((const struct Student*)a)->name, ((const struct Student*)b)->name);
if(!k)//重名时按学号大小排
k = strcmp(((const struct Student*)a)->id, ((const struct Student*)b)->id);
return k;
}
int ComparGrade(const void *a, const void *b){
int k = (((const struct Student*)a)->grade > ((const struct Student*)b)->grade) ? 1 : 0;//判断a成绩是否大于b
if(!k){//若不大于
k = (((const struct Student*)a)->grade < ((const struct Student*)b)->grade) ? -1 : 0;//判断是否小于
if(!k)//若不大于也不小于则等于,此时按学号排序
k = strcmp(((const struct Student*)a)->id, ((const struct Student*)b)->id);
}
return k;
}

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)