成绩排序--清华机试真题;使用运算符重载
成绩排序 (九度教程第 2 题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
有
N
个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名
字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出
N
个学生排序后的信息。
输入:
测试数据有多组,每组输入第一行有一个整数
N
(
N<=1000
),接下来的
N
行包括
N
个学生的数据。每个学生的数据包括姓名(长度不超过
100
的字符串)、
年龄(整形数)、成绩(小于等于
100
的正数)。
输出:
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。然后
输出学生信息,按照如下格式:姓名
年龄
成绩
样例输入:
3
abc 20 99
bcd 19 97
bed 20 97
样例输出:
bcd 19 97
bed 20 97
abc 20 99
提示:
学生姓名的字母序区分字母的大小写,如
A
要比
a
的字母序靠前
(
因为
A
的
ASC
码比
a
的
ASC
码要小
)
。
来源:
2000
年清华大学计算机研究生机试真题
思路:利用结构体排序来做这道题
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct stu_info{
//结构体组成
char name[101];
int age;
int score;
}buf[1000];
bool cmp(stu_info a,stu_info b){
//结构体三重排序
if(a.score!=b.score)
return a.score<b.score;
int tmp=strcmp(a.name,b.name);
if(tmp!=0)
return tmp<0;
else
return a.age<b.age;
}
int main(){
int n ;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
scanf("%s%d%d",&buf[i].name,&buf[i].age,&buf[i].score);
sort(buf,buf+n,cmp);//调用自定义函数
for(int i=0;i<n;i++){
printf("%s %d %d",buf[i].name,buf[i].age,buf[i].score);
printf("\n");
}
}
return 0;
}
方法二:使用C++运算符重载来做这道题
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct stu_info{
//结构体组成
char name[101];
int age;
int score;
bool operator <(const stu_info &b)const{
//对小于号进行运算符重载
if(score!=b.score)
return score<b.score;
int tmp=strcmp(name,b.name);
if(tmp!=0)
return tmp<0;
else
return age<b.age;
}
}buf[1000];
int main(){
int n ;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
scanf("%s%d%d",&buf[i].name,&buf[i].age,&buf[i].score);
sort(buf,buf+n);
for(int i=0;i<n;i++){
printf("%s %d %d",buf[i].name,buf[i].age,buf[i].score);
printf("\n");
}
}
return 0;
}
还没有评论,来说两句吧...