yangzhixiaohuli 发表于 2023-12-25 19:09:27

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的...

7-3 学生信息处理
分数 10
作者 王和兴
单位 东北大学秦皇岛分校
题目描述:
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩(区间内的整数),要求输出总分最高学生的姓名、学号和总分。

输入:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。

输出:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258

这题用结构体怎么做

FishC 发表于 2023-12-25 19:09:45

可以使用结构体来表示学生的基本信息,然后通过循环读取每个学生的信息,并计算他们的总分。同时,可以使用一个变量,记录当前总分最高的学生的信息。

首先,定义一个结构体来表示学生的基本信息:

struct Student {
    char id;// 学号
    char name;// 姓名
    int score1;// 成绩1
    int score2;// 成绩2
    int score3;// 成绩3
    int totalScore;// 总分
};
接下来,根据输入的学生数量N,创建一个长度为N的学生数组,并循环读取每个学生的信息:

#include <stdio.h>

struct Student {
    char id;// 学号
    char name;// 姓名
    int score1;// 成绩1
    int score2;// 成绩2
    int score3;// 成绩3
    int totalScore;// 总分
};

int main()
{
    int N;
    scanf("%d", &N);
   
    struct Student students;
    int maxTotalScore = 0;// 最高总分
   
    for (int i = 0; i < N; i++) {
      scanf("%s %s %d %d %d", students.id, students.name, &students.score1, &students.score2, &students.score3);
      
      students.totalScore = students.score1 + students.score2 + students.score3;
      
      if (students.totalScore > maxTotalScore) {
            maxTotalScore = students.totalScore;
      }
    }
   
    // 找到总分最高的学生
    for (int i = 0; i < N; i++) {
      if (students.totalScore == maxTotalScore) {
            printf("%s %s %d\n", students.name, students.id, students.totalScore);
            break;
      }
    }
   
    return 0;
}

这样,我们就可以找到总分最高的学生的姓名、学号和总分了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

sfqxx 发表于 2023-12-25 19:25:31

你的代码主要有两个问题:

首先,是在for循环里面动态创建结构体数组。这样创建的数组在每次循环结束后就会被销毁,未能达到保存所有学生信息的目的。你应在for循环之前定义具有N个元素的数组。

其次,学号应为字符串而不是整数,因为学号可能以0开始。

修改后的代码如下:

#include<iostream>
#include<string>
using namespace std;
struct Student
{
    string ID;
    string name;
    int A;
    int B;
    int C;
    int sum;
};
int main()
{
    int N;
    cin>>N;
    Student sb;
    for(int i=0;i<N;i++)
    {
      cin>>sb.ID>>sb.name>>sb.A>>sb.B>>sb.C;
      sb.sum=sb.A+sb.B+sb.C;
    }
    int max=sb.sum;
    int t=0;
    for(int i=0;i<N;i++)
    {
      if(sb.sum>max)
      {
            max=sb.sum;
            t=i;
      }
    }
    cout<<sb.name<<" "<<sb.ID<<" "<<max<<endl;
    return 0;
}

但是需要注意的是,这段代码只有在支持C++的编译器中才能正常运行,因为C++98并不直接支持在创建数组时使用变量作为数组长度。如果你使用的C++编译器不支持这一特性,你可以考虑使用vector。

求最佳答案
页: [1]
查看完整版本: 给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的...