行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct news{
char xuehao[7];
char name[10];
int sum;
}xs[100010];
int cmp1(news a,news b)
{
if(strcmp(a.xuehao,b.xuehao)<0)
return 1;
else
return 0;
}
int cmp2(news a,news b)
{
if((strcmp(a.name,b.name)<0)||(strcmp(a.name,b.name)==0 && strcmp(a.xuehao,b.xuehao)<0 ))
return 1;
else return 0;
}
//第一次错误的地方,直接写的
//if((strcmp(a.name,b.name)<0)
// return 1;
//else{
// if(strcmp(a.xuehao,b.xuehao)<0) return 1;
// else return 0;
// }
//犯了一个低级错误,做题想当然,写的时候应该模拟执行一下,如果按上面错误写,全为短路的。
//所以多层判断的符合的条件最好写在一行,防止出现短路的
int cmp3(news a,news b)
{
if(a.sum!=b.sum)
return a.sum<b.sum;
else {
if(strcmp(a.xuehao,b.xuehao)<0)//这样写也很方便
return 1;
else return 0;
}
}
int main()
{
int N,C,ca=0,i;
while(scanf("%d%d",&N,&C)!=EOF && (N+C))
{
ca++;
getchar();
for(i=0;i<N;i++)
scanf("%s %s %d",xs[i].xuehao,xs[i].name,&xs[i].sum);
if(C==1) sort(xs,xs+N,cmp1);
if(C==2) sort(xs,xs+N,cmp2);
if(C==3) sort(xs,xs+N,cmp3);
printf("Case %d:\n",ca);//格式要注意
for(i=0;i<N;i++)
printf("%s %s %d\n",xs[i].xuehao,xs[i].name,xs[i].sum);
}
return 0;
}