成绩排序问题
题目描述
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
输入描述:
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
解题思路:首先想到的肯定是定义一个结构体,将输入的数据存好,然后比较分数,按要求输出即可;
可能遇到问题:如何将用户输入的数据对应存到结构体的对应变量的位置,排序算法使用stable_sort();
具体实现:
#include<bits/stdc++.h>
//这是包含所有库函数的头文件;一般不建议,但是在考试的时候可以用;
using namespace std;
struct Grade{
char name[100];
int score;
}grade[1000];
//从大到小排序;
bool cmp(Grade a,Grade b){
return a.score>b.score;
}
//从小到大;
bool cmp1(Grade a,Grade b)
{
return a.score<b.score;
}
//写cmp函数是为了实现stable_sort()函数;
int main()
{
int n,flag;
//因为要循环测试,所以假如while循环;
while(cin >> n >> flag){
Grade stu[n];
//输入n个学生,并对应输入name和score;
for(int i=0;i<n;i++){
scanf("%s %d",&stu[i].name,&stu[i].score);
}
//判断是升序还是降序来输出;
if(flag==0){
stable_sort(stu,stu+n,cmp);
}
if(flag==1){
stable_sort(stu,stu+n,cmp1);
}
for(int j=0;j<n;j++){
cout << stu[j].name<<" "<<stu[j].score<<endl;
}
}
return 0;
}
代码实现不难,最终结果也是ac的,但是仔细观察也是有一些遗留问题的,比如c++中scanf和cin,cout的混用问题,c++中只要你引入了库函数,是可以用scanf和printf函数的,但是具体的区别和用法并不是一两句话可以说清楚的,一般是不建议混合使用的,会出现意料之外的错误,当然如果需要仔细研究,我会添加链接。
C++输入与输出cin和cout的用法
c++的cin详细用法