cin输入字符串怎么结束_【题解字符串】1147:最高分数的学生姓名

25b6de6e1c3bee7872a992bb44308d6f.png ab68c5e9dc38ab6c7af71903331f7973.png1147:最高分数的学生姓名 时间限制: 1000 ms    内存限制: 65536 KB

【题目描述】

输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。

【输入】

第一行输入一个正整数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;
}

5e9e74759477e14c2f81a11fb3237dd6.png

参考代码 - 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;
}

4b95d8e947d2c9c10af904b43029fbd4.png

参考代码 - 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;
}

3459c0b59cd0862b4445f3804a5644e2.png

参考代码 - 结构体:

思路与第一种方法一样,只不过使用结构体把分数和姓名封装起来。重点体现在结构体的基本应用。

#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;
}

fb17766afa1dfa9424bc7e68a9de0fbf.png

END

注:题目来源于网络,转载于《信息学奥赛一本通(C++版)在线评测系统》,点击下方的【阅读原文】即可打开该题的链接。

题解属于本微信公众号【大神编程】原创。

70bee07df3ed0c56828220537e3df138.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值