西电 2018年复试上机Problem D
问题描述:
给定一组记录n(n<100)小明各个时期的考试成绩,格式为日期+成绩,中间以空格隔开,记录之间分行输入,
例如:
2018/6/30 80
2009/1/1 56
…
其中日期输入要求年份1996-2100 月份1-12 日期1-31
现要求以分数为关键字从大到小对其进行排序,若分数相同则按日期从小到大排序,若分数相同则按日期从小到大进行排序
样例输入:
4
2017/1/1 95
2017/6/10 85
2017/3/2 95
2017/1/1 65
样例输出:
2017/1/1 95
2017/3/2 95
2017/6/10 85
2017/1/1 65
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int year;
int month;
int day;
int score;
}grade;
//如果a日期大于b,返回1,否则返回0
int cmp(grade a,grade b)
{
if(a.year>b.year)
{
return 1;
}
else if(a.year<b.year)
{
return 0;
}
else{
if(a.month>b.month)
{
return 1;
}
else if(a.month<b.month)
{
return 0;
}
else{
if(a.day>b.day)
{
return 1;
}
else
return 0;
}
}
}
int main()
{
grade g[100],temp;
int i,j,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d/%d/%d %d",&g[i].year,&g[i].month,&g[i].day,&g[i].score);
// for(i=0;i<n;i++)
// printf("%d %d %d %d\n",g[i].year,g[i].month,g[i].day,g[i].score);
for(i=0;i<n;i++)
for(j=0;j<n-i-1;j++)
{
//分数小的往后排
if(g[j].score<g[j+1].score)
{
temp=g[j];
g[j]=g[j+1];
g[j+1]=temp;
}
//分数相同比较日期
if(g[j].score==g[j+1].score)
{
if(cmp(g[j],g[j+1]))
{
temp=g[j];
g[j]=g[j+1];
g[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
printf("%d/%d/%d %d\n",g[i].year,g[i].month,g[i].day,g[i].score);
return 0;
}