/*用结构体编程:某班有5名学生,每名学生的数据包括学号、姓名、3 门课程的成绩; 从键盘输入5名学生数据,输出5名同学平均成绩,以及平均分最高的学生的数据(包括学号、姓名、 3 门课成绩、平均成绩)*/ #include<stdio.h> struct student{ long int no; char name[20];//用英文输入姓拼音 int score[3]; double ave_score; }stu[5]; struct student *p; int main(){ int i,j; int sum; printf("Please enter students' numbers first, then name, finally their scores\n"); for(i=0;i<5;i++) scanf("%ld",&stu[i].no); for(i=0;i<5;i++) gets(stu[i].name); for(i=0;i<5;i++) for(j=0;j<3;j++) scanf("%d",&stu[i].score[j]); i=0,j=0; while(i<5){ sum = 0; while(j<3){ sum += stu[i].score[j]; j++; } stu[i].ave_score = 1.0 * sum / 3; i++; } for(i=0;i<5;i++) printf("%lf ",&stu[i].ave_score); p = stu; for(i=1;i<5;i++) if(stu[i].ave_score > p->ave_score) p = &stu[i]; printf("%lf",p->ave_score); }
时间: 2023-06-18 22:08:37 浏览: 246
代码存在一些问题,我给你修改一下:
```
#include<stdio.h>
struct student{
long int no;
char name[20];
int score[3];
double ave_score;
}stu[5];
int main(){
int i,j,sum;
struct student *p;
printf("Please enter students' numbers first, then name, finally their scores\n");
for(i=0;i<5;i++)
scanf("%ld",&stu[i].no);
getchar(); //吸收掉scanf后的回车符
for(i=0;i<5;i++)
gets(stu[i].name);
for(i=0;i<5;i++)
for(j=0;j<3;j++)
scanf("%d",&stu[i].score[j]);
for(i=0;i<5;i++){
sum = 0;
for(j=0;j<3;j++){
sum += stu[i].score[j];
}
stu[i].ave_score = 1.0 * sum / 3;
}
for(i=0;i<5;i++)
printf("%s's average score is %lf.\n",stu[i].name,stu[i].ave_score);
p = &stu[0];
for(i=1;i<5;i++)
if(stu[i].ave_score > p->ave_score)
p = &stu[i];
printf("The student with the highest average score is:\n");
printf("name:%s\n",p->name);
printf("no:%ld\n",p->no);
printf("score:%d %d %d\n",p->score[0],p->score[1],p->score[2]);
printf("ave_score:%lf\n",p->ave_score);
}
```
主要修改了以下几点:
1. 在输入姓名时,需要使用getchar()吸收掉scanf后的回车符,否则会出现跳过输入姓名的情况。
2. 在计算平均分时,应该使用for循环,而不是while循环。
3. 在输出平均分和最高平均分的学生信息时,需要把学生的姓名也输出出来。
4. 在求出最高平均分的学生时,需要先初始化p为第一个学生的地址。
阅读全文