样例:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct st // 结构体声明
{
char x[15]; //学号定义为字符型
char y[15]; // 名字
int z; //分数
};
bool cmp1(st p1,st p2) //C=1时:按照学号的递增排序
{
return strcmp(p1.x,p2.x)<0;
}
bool cmp2(st p1,st p2) //c=2时,按照姓名的非递减字典序列排序,
{
if(strcmp(p1.y,p2.y)!=0)
return strcmp(p1.y,p2.y)<0;
else
return strcmp(p1.x,p2.x)<0;
}
bool cmp3(st p1, st p2) //c=3时,按照成绩的递减序列排序,
{
if(p1.z!=p2.z)
return p1.z<p2.z;
else
return strcmp(p1.x , p2.x)<0; (若有若干名学生具有相同的成绩和姓名时,按照学好排序。升序)
}
struct st t[1000001]; //定义结构体变量,
int main() //主函数
{
int n,c,i;
int k=1;
while(scanf("%d%d",&n,&c)!=EOF) 多组输入n,c;
{
if(n==0&&c==0) //判断多组输入是否结束
return 0;
for(i=0;i<n;i++)
{
scanf("%s%s%d",&t[i].x,&t[i].y,&t[i].z); 输入学号。姓名,成绩;
}
if(c==1) 情况1;
{
sort(t,t+n,cmp1); 调用cmp1快排;
printf("Case %d:\n",k);
k++; 用来表示Case:的输出
}
else if(c==2)
{
sort(t,t+n,cmp2); 调用cmp2快排;
printf("Case %d:\n",k);
k++;
}
else
{
sort(t,t+n,cmp3); //调用cmp3快排
printf("Case %d:\n",k);
k++;
}
for(i=0;i<n;i++)
printf("%s %s %d\n",t[i].x,t[i].y,t[i].z); 输出排好后的数据
}return 0;
}
分析:
重点在于如何排序排特殊情况的问题,比如名字相同成绩不同,或者 成绩相同,学号不同的问题,要在写函数的时候注意一下数据特殊情况的处理,定义结构体是数组的大小(不含空格)
大体上很简单,只需要三个快排就可以解决,同时注意case:后面要输出的数字,注意读题。