利用结构体数组找出最高分学生数据


#include<stdio.h>
#define N 3
int main()
{
    struct student
    {
        int num;
        char name[10];
        float score[3];
        float aver;
    }a[N];
    int i,n;
    float max;
    printf("输入学生数据:\n");
    for(i=0;i<N;i++)
    {
        scanf("%d %s %.2f %.2f %.2f",&a[i].num,a[i].name,&a[i].score[0],&a[i].score[1],&a[i].score[2]);
        a[i].aver=(a[i].score[0]+a[i].score[1]+a[i].score[2])/3.0;
    }
    printf("输出学生数据:\n");
    printf("学号: 名字: 成绩1: 成绩2: 成绩3: 平均成绩:\n");
    for(i=0;i<N;i++)
    printf("%d %s %.2f %.2f %.2f %.2f\n",a[i].num,a[i].name,a[i].score[0],a[i].score[1],a[i].score[2],a[i].aver);
    max=a[0].aver;
    for(i=1;i<N;i++)
    if(max<a[i].aver) 
    {
        max=a[i].aver;
        n=i;
    }
    printf("最高分的学生的数据为:\n");
    printf("%d %s %.2f %.2f %.2f %.2f\n",a[n].num,a[n].name,a[n].score[0],a[n].score[1],a[n].score[2],a[n].aver);
    return 0;
} 
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/683491272786131.png "#left")
我给N赋值了3,为什么输入数据时输了两组数后,就自动停止了输入,进行了输出,并且输出结果也不正确,哪里出错了?

第三个for循环,i应该从0开始而不是1

两个地方问题,第18行的输入语句里,格式控制符里不要指定小数的数据位数,第25行开始找最大值时候,max赋初值,n 没有赋初值,修改如下,改动处见注释,供参考:

#include<stdio.h>
#define N 3
int main()
{
    struct student
    {
        int num;
        char name[10];
        float score[3];
        float aver;
    }a[N];
    int i, n;
    float max;
    printf("输入学生数据:\n");
    for (i = 0; i < N; i++)
    {
        scanf("%d %s %f %f %f", &a[i].num, a[i].name, &a[i].score[0], &a[i].score[1], &a[i].score[2]); // 修改
        //scanf("%d %s %.2f %.2f %.2f", &a[i].num, a[i].name, &a[i].score[0], &a[i].score[1], &a[i].score[2]);
        a[i].aver = (a[i].score[0] + a[i].score[1] + a[i].score[2]) / 3.0;
    }
    printf("输出学生数据:\n");
    printf("学号: 名字: 成绩1: 成绩2: 成绩3: 平均成绩:\n");
    for (i = 0; i < N; i++)
        printf("%d %s %.2f %.2f %.2f %.2f\n", a[i].num, a[i].name, a[i].score[0], a[i].score[1], a[i].score[2], a[i].aver);
    max = a[0].aver;
    n = 0;          // 修改
    for (i = 1; i < N; i++)
        if (max < a[i].aver)
        {
            max = a[i].aver;
            n = i;
        }
    printf("最高分的学生的数据为:\n");
    printf("%d %s %.2f %.2f %.2f %.2f\n", a[n].num, a[n].name, a[n].score[0], a[n].score[1], a[n].score[2], a[n].aver);
    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7622656
  • 这篇博客也不错, 你可以看下使用结构体数组求10个学生三门课总平均成绩,及最高分学生信息
  • 除此之外, 这篇博客: 2021年信息学部物联网工程学院学生科协算法科普中的 快速排序 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    基本思想
    选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以达到全部数据变成有序。
    在这里插入图片描述

  • 您还可以看一下 李立宗老师的讲给入门者的深度学习课程中的 参数优化小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    解决方案:

    可以使用结构体数组和循环语句来解决该问题,具体步骤如下:

    1. 定义一个结构体表示学生数据,包括学生姓名和成绩。
    struct student {
        char name[20];
        int score;
    };
    
    1. 定义一个结构体数组,存储多个学生的数据。
    struct student stu[100];
    
    1. 定义一个变量max_score,并将其初始化为0,用于存储最高分。
    int max_score = 0;
    
    1. 使用循环从结构体数组中遍历每个学生数据,比较成绩是否大于当前的最高分。
    for (int i = 0; i < 100; i++) {
        if (stu[i].score > max_score) {
            max_score = stu[i].score;
        }
    }
    
    1. 最后,max_score中存储的即为最高分数,可以根据需要进行输出或者其他操作。

    完整代码示例:

    #include <stdio.h>
    
    struct student {
        char name[20];
        int score;
    };
    
    int main()
    {
        struct student stu[100]; // 存储学生数据的结构体数组
        int max_score = 0; // 最高分数
    
        // TODO: 给结构体数组stu赋值存储多个学生数据
    
        // 循环遍历每个学生数据比较成绩是否大于当前的最高分
        for (int i = 0; i < 100; i++) {
            if (stu[i].score > max_score) {
                max_score = stu[i].score;
            }
        }
    
        printf("最高分数为:%d\n", max_score);
    
        return 0;
    }
    

    注:由于题目没有提供具体的结构体和数据,上述代码中的结构体和数据需要根据实际情况进行调整。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在你的程序中,出现了两个问题导致输入数据时停止输入并输出结果不正确:

  1. 未初始化变量n:在寻找最高分学生数据时,你使用了变量n来记录最高分学生的索引,但是你没有给n赋初始值,导致其值是未定义的。你可以在定义n时将其初始化为0,即int n = 0;

  2. 输入数据时的格式字符串问题:在scanf函数中,你使用了错误的格式字符串来读取学生的分数,导致输入数据时无法正常工作。你需要修改格式字符串为%f来读取浮点数分数值。另外,如果你的输入数据中包含空格分隔的多个浮点数,请确保每个浮点数都使用对应的格式说明符。

修改后的代码如下所示:

#include <stdio.h>
#define N 3

int main()
{
    struct student
    {
        int num;
        char name[10];
        float score[3];
        float aver;
    } a[N];

    int i, n = 0; // 初始化n为0

    float max;

    printf("输入学生数据:\n");
    for (i = 0; i < N; i++)
    {
        scanf("%d %s %f %f %f", &a[i].num, a[i].name, &a[i].score[0], &a[i].score[1], &a[i].score[2]); // 修改格式字符串
        a[i].aver = (a[i].score[0] + a[i].score[1] + a[i].score[2]) / 3.0;
    }

    printf("输出学生数据:\n");
    printf("学号: 名字: 成绩1: 成绩2: 成绩3: 平均成绩:\n");
    for (i = 0; i < N; i++)
        printf("%d %s %.2f %.2f %.2f %.2f\n", a[i].num, a[i].name, a[i].score[0], a[i].score[1], a[i].score[2], a[i].aver);

    max = a[0].aver;
    for (i = 1; i < N; i++)
    {
        if (max < a[i].aver)
        {
            max = a[i].aver;
            n = i;
        }
    }

    printf("最高分的学生的数据为:\n");
    printf("%d %s %.2f %.2f %.2f %.2f\n", a[n].num, a[n].name, a[n].score[0], a[n].score[1], a[n].score[2], a[n].aver);

    return 0;
}