【题目描述】
输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。
【输入】
第一行输入一个正整数N(N ≤ 100),表示学生人数。接着输入N行,每行格式如下:
分数 姓名
分数是一个非负整数,且小于等于100;
姓名为一个连续的字符串,中间没有空格,长度不超过20。
数据保证最高分只有一位同学。
【输出】
获得最高分数同学的姓名。
【输入样例】
5
87 lilei
99 hanmeimei
97 lily
96 lucy
77 jim
【输出样例】
hanmeimei
说明:
主要考查char数组和字符串string。
本题没有难度,其实就是找最大值,只不过输出的是最高分数学生的姓名。主要体现在字符串的应用上。
将使用3个C++特性来求解,分别是char数组、string、结构体。
题目概述:
输入n个数据,求出最高分数学生的姓名。其中每一个数据包含学生的分数和姓名。
思路分析:
输入n个数据,按照找最大值的方法求解即可。关键是找到较大的分数时,注意链接到其姓名。
找最大值时,采用边输入边找。如此一来,只需一个循环即可。当然,也可以将输入和找最大值分开成两个循环。
关于分数和姓名数据结构的选择问题,可以选择char类型二维数组(或string一维数组)存储所有学生的姓名,也可以只用两个char类型一维数组(或string类型)存储最大值和临时输入的姓名。
输入方面,题目已保证姓名不存在空格,不需要考虑整行输入。
数据类型:n的范围在100以内,分数是[0, 100]之间,姓名长度是20个字符以内。n可选int类型,分数按照不同方法可选int类型一维数组或两个int类型变量,成绩按照不同方法可选char类型二维数组(或string一维数组)或两个char类型一维数组(或string类型)。
参考代码 - char类型二维数组(推荐):
循环输入n个学生的分数和姓名,边输入边找最高分数。判断时,把分数较高的学生所对应的数组下标存储在iMax变量中。
一般情况下,能存储下标(索引)就不会存储变量的值。其高一级的应用是交换数据时可以节省时间的开销。
#include
using namespace std;
int main(){
int n, score[100], iMax = 0;
char name[100][21] = {0};
cin >> n;
for (int i = 0; i {
cin >> score[i] >> name[i];
if (score[i] > score[iMax]) iMax = i;
}
cout < return 0;
}
参考代码 - string一维数组:
思路与上一个代码一样,只不过一个是char,一个是string。
string变量(对象)可以说就是一个char一维数组,而且string的长度很长,对于奥赛来说,一般很难造成越界。
string是一种复合类型,属于STL的一部分,可以使用STL中的迭代器,非常高级、好用。
#include
using namespace std;
int main(){
int n, score[100], iMax = 0;
string name[100];
cin >> n;
for (int i = 0; i {
cin >> score[i] >> name[i];
if (score[i] > score[iMax]) iMax = i;
}
cout < return 0;
}
参考代码 - char一维数组:
与char类型二维数组类似的思路。由于无法存储下标,只能存储整个字符串和分数。
这两种方法的区别是:
上述方法体现在牺牲空间,节省时间。
本方法体现在牺牲时间,节省空间。
这对于开始学习时空复杂度的同学来说,或许是一个勉强算合格的例子。
#include
#include
using namespace std;
int main(){
int n, score, Max = 0;
char name[21] = {0}, strMax[21] = {0};
cin >> n;
for (int i = 0; i {
cin >> score >> name;
if (score > Max)
{
Max = score;
strcpy(strMax, name);
}
}
cout < return 0;
}
参考代码 - 结构体:
思路与第一种方法一样,只不过使用结构体把分数和姓名封装起来。重点体现在结构体的基本应用。
#include
using namespace std;
struct
{
int score;
char name[21];
} stu[100];
int main(){
int n, iMax = 0;
cin >> n;
for (int i = 0; i {
cin >> stu[i].score >> stu[i].name;
if (stu[i].score > stu[iMax].score) iMax = i;
}
cout < return 0;
}
END
注:题目来源于网络,转载于《信息学奥赛一本通(C++版)在线评测系统》,点击下方的【阅读原文】即可打开该题的链接。
题解属于本微信公众号【大神编程】原创。