成绩大排队详解-CCF-CSP练习题(100)
目录
来自湖大程序设计训练系统(外网进不去,所以不贴链接了)。
题目:
问题描述 | 读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。 |
输入形式 |
每个测试输入包含1个测试用例,格式为: 第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了。