成绩大排队详解-CCF-CSP练习题(100)

目录

题目:

分析:

C++代码:

C++ STL代码:

总结:


来自湖大程序设计训练系统(外网进不去,所以不贴链接了)。

题目:

成绩大排队
问题描述 读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入形式

每个测试输入包含1个测试用例,格式为:

第1行:正整数n
  第2行:第1个学生的姓名 学号 成绩
  第3行:第2个学生的姓名 学号 成绩
    ... ... ...
  第n+1行:第n个学生的姓名 学号 成绩

 

其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出形式 对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低学生的姓名和学号,字符串间有1空格。
样例输入 3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
样例输出 Mike CS991301
Joe Math990112

分析:

解法一:这个题看着并不难,我们首先要选择好用什么数据结构存储学生信息,因为题目给出的输入形式中要求存入学生的姓名、学号、成绩,姓名学号是字符串,成绩是int类型,所以我们想到用结构体来存储

typedef struct     /*学生信息*/
{
    string name;   /*姓名*/
    string stuNum; /*学号*/
    int score;     /*分数*/
}Student;          /*学生信息结构体新类型*/

然后依次输入信息,遍历结构体数组找到成绩最高和成绩最低学生的下标,最后输出。

解法二:如果熟悉C++ STL的话,我们知道map容器中的元素是自动按照key值从小到大(升序)排好的,如果我们把分数(score)作为map的键,姓名和学号作为值的话,我们读入之后就可以得到成绩最高(map最后一个元素)和成绩最低(map第一个元素)学生的姓名学号了,直接输出即可。见代码C++STL。

C++代码:

#include <iostream>
#include <string>
using namespace std;

typedef struct     /*学生信息*/
{
    string name;   /*姓名*/
    string stuNum; /*学号*/
    int score;     /*分数*/
}Student;          /*学生信息结构体新类型*/

int main()
{
    int n;/*记录学生数*/
    int maxSub=0;/*成绩最高学生信息下标*/
    int minSub=0;/*成绩最低学生信息下标*/
    cin >> n;
    Student stu[n];
    for(int i=0; i<n; i++)/*读入学生信息*/
    {
        cin >>stu[i].name;
        cin >>stu[i].stuNum;
        cin >>stu[i].score;
    }
    for(int j=1; j< n; j++)
    {
        if(stu[maxSub].score < stu[j].score)/*比较得出成绩相对较高学生*/
        {
            maxSub = j;
        }
        if(stu[minSub].score > stu[j].score)/*比较得出成绩相对较低学生*/
        {
            minSub = j;
        }

    }
    cout << stu[maxSub].name << ' ' <<stu[maxSub].stuNum <<endl;/*输出成绩最高学生姓名和学号*/
    cout << stu[minSub].name << ' ' <<stu[minSub].stuNum <<endl;/*输出成绩最低学生姓名和学号*/
    return 0;
}

C++ STL代码:

#include <iostream>
#include <string>
#include <map>
using namespace std;

int main()
{
    map<int,string>mapStu;  /*定义map容器存储学生信息*/
    string name;            /*姓名*/
    string stuNum;          /*学号*/
    string stuInf;          /*学生信息=姓名+学号*/
    int score;              /*分数*/
    int n;
    cin >> n;
    for(int i=0; i<n; i++)
    {
        cin >> name;
        cin >> stuNum;
        cin >> score;
        stuInf = name + ' ' +stuNum;  /*将姓名学号合在一起存入map中*/
        mapStu.insert(pair<int,string>(score,stuInf)); /*往mapStu中插入一个元素,其中key为score,value为stuInf*/
    }
    map<int,string>::reverse_iterator iter= mapStu.rbegin();/*取出最后一个元素,即分数最大的学生*/
    cout << iter->second <<endl;
    map<int,string>::iterator itermin = mapStu.begin();/*取出最后一个元素,即分数最小的学生*/
    cout << itermin->second <<endl;
    return 0;
}

总结:

熟悉C++ STL操作的话,代码会变得非常简单,简洁。虽然这个题目简单,但是就当熟悉STL了。

posted @ 2018-10-13 17:05  巡山逍遥  阅读(1029)  评论(0编辑  收藏  举报