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

我给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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:基本思想
选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以达到全部数据变成有序。
解决方案:
可以使用结构体数组和循环语句来解决该问题,具体步骤如下:
struct student {
char name[20];
int score;
};
struct student stu[100];
int max_score = 0;
for (int i = 0; i < 100; i++) {
if (stu[i].score > max_score) {
max_score = stu[i].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;
}
注:由于题目没有提供具体的结构体和数据,上述代码中的结构体和数据需要根据实际情况进行调整。
在你的程序中,出现了两个问题导致输入数据时停止输入并输出结果不正确:
未初始化变量n
:在寻找最高分学生数据时,你使用了变量n
来记录最高分学生的索引,但是你没有给n
赋初始值,导致其值是未定义的。你可以在定义n
时将其初始化为0,即int n = 0;
。
输入数据时的格式字符串问题:在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;
}