成绩排序(3种题型)--C++

一.题目如下:

输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。

输入描述:

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

C++实现:

#include<iostream>
#include<string>
using namespace std;
struct S{
    string name;
    int score;
};
int main(){
    int n;
    int flag;
    while(scanf("%d",&n)!=EOF){
        cin>>flag;
        S stu[n];
        int k=0;
        for(k;k<n;k++){
            cin>>stu[k].name>>stu[k].score;
        }
        for(int j=0;j<n;j++){
        int max=stu[0].score;
        int min=stu[0].score;
        int index=0;
        for(int i=0;i<n;i++){
            if(flag==0){
                if(stu[i].score>max){
                    index=i;
                    max=stu[i].score;
                }
            }
            else{
                if(stu[i].score<min){
                    index=i;
                    min=stu[i].score;
                }
            }
        }
            cout<<stu[index].name<<" "<<stu[index].score<<endl;
            if(flag==0){
                stu[index].score=-1;
            }
            else{
                stu[index].score=1000;
            }
    }
}
}

特别注意:

    此题不应用C++已经封装好的函数sort+自定义升序降序算法实现,因为sort(快排)函数不稳定,即面对成绩相等的情况快排输出的顺序不确定。与下面的排序题型做下比较。

二.题目如下:

用一维数组存储学号和成绩,然后,按成绩排序输出。

输入描述:

输入第一行包括一个整数N(1<=N<=100),代表学生的个数。
接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。

3
1 90
2 87
3 92

输出描述:

按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
如果学生的成绩相同,则按照学号的大小进行从小到大排序。
2 87
1 90
3 92

C++实现:

#include<iostream>
#include<algorithm>
using namespace std;
struct S{
int number;
int score;
};
bool cmp(S s1,S s2){
    if(s1.score<s2.score)
        return true;
    else if(s1.score==s2.score){
        return s1.number<s2.number;
    }
    else
        return false;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        S stu[n];
        for(int i=0;i<n;i++){
            cin>>stu[i].number>>stu[i].score;
        }
        sort(stu,stu+n,cmp);
        for(int i=0;i<n;i++){
            cout<<stu[i].number<<" "<<stu[i].score<<endl;
        }
    }
}

三.题目如下:

有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。

输入描述:

测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。

输出描述:

将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。
然后输出学生信息,按照如下格式:
姓名 年龄 成绩

学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。

输入

3
abc 20 99
bcd 19 97
bed 20 97

输出

bcd 19 97
bed 20 97
abc 20 99

C++实现: 

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct S{
    string name;
    int age;
    int score;
};
bool cmp(S s1,S s2){
    if(s1.score!=s2.score)
        return s1.score<s2.score;
    else{
       //注意此处比较直接利用=即可
        if(s1.name!=s2.name){
            return s1.name<s2.name;
        }
        else
            return s1.age<s2.age;
    }
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        S stu[n];
        for(int i=0;i<n;i++){
            cin>>stu[i].name>>stu[i].age>>stu[i].score;
        }
        sort(stu,stu+n,cmp);
        for(int j=0;j<n;j++){
            cout<<stu[j].name<<" "<<stu[j].age<<" "<<stu[j].score<<endl;
        }
    }
}

 


版权声明:本文为zhang__shuang_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。