读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 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
思路:
首先根据输入格式我们可以收集到两个重要信息:
1.需要构建一个学生类或者学生的结构体,需要包含学生姓名、学号、成绩这三个属性。因为代码是用c++实现的,所以我选择用类来定义。
2.因为n是根据用户输入才能具体确定的,所以需要用到动态分配内存。
接着根据输出格式我们能收集到一个重要信息:
1.需要输出成绩最高和成绩最低的学生对象的姓名和学号,所以需要对每个学生对象的成绩属性进行比较。
参考代码:
#include <iostream>
using namespace std;
class Student//构造学生类
{
public:
string name;
string num;
int score;
};
int main()
{
int n;
cin >> n;
Student* s = new Student[n];//动态分配学生类数组
for (int i = 0; i < n; i++)
{
cin >> s[i].name;
cin >> s[i].num;
cin >> s[i].score;
}//根据用户输入的n来分别对数组内的学生对象进行输入
int max = s[0].score;//假设学生数组的第一个元素的成绩为最大
int min = s[0].score;//假设学生数组的第一个元素的成绩为最小
int j = 0;
int h = 0;
for (int i = 1; i < n; i++)//从数组的第二个元素开始比较,直到遍历完数组最后一个元素
{
if (s[i].score > max)
{
max = s[i].score;//遇到成绩更高者将其成绩置为最大
j = i;//记录下当前成绩最大者的数组下标
}
if (s[i].score < min)
{
min = s[i].score;//遇到成绩更低者将其成绩置为最大
h = i;//记录下当前成绩最低者的数组下标
}
}
cout << s[j].name << ' ' << s[j].num << endl;//按格式输出成绩最高者的名字和学号
cout << s[h].name << ' ' << s[h].num << endl;//按格式输出成绩最低者的名字和学号
system("pause");
return 0;
}