问题:有10个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、 姓名、三门课成绩、平均分数)。
请帮忙看一下我的代码问题在哪,实在找不到了
我的代码:
#include <stdio.h>
int main()
{
int a[10][4];
char c[10];
int i,j,b[10],max,who,Z1=0,Z2=0,Z3=0;
float z1,z2,z3;
scanf("%s~~~~~~~~~",c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9]);
for(i=0;i<10;i++)
for(j=0;j<4;j++)
{
if(j!=3)
scanf("%d",&a[i][j]);
else
scanf("%d\n",&a[i][j]);
}
for(i=0;i<10;i++)
b[i]=a[i][1]+a[i][2]+a[i][3];
for(i=0;i<10;i++)
for(j=0;j<4;j++)
{
if(j==1)
Z1+=a[i][j];
else if(j==2)
Z2+=a[i][j];
else if(j==3)
Z3+=a[i][j];
}
max=b[0],z1=1.0*Z1/3,z2=1.0*Z2/3,z3=1.0*Z3/3;
for(i=0;i<10;i++)
{
if(b[i]>max)
max=b[i],who=i;
}
printf("三门课总平均成绩分别为%.1f,%.1f,%.1f\n最高分学生数据:\n姓名:%s\n学号:%d\n三门课成绩分别为%d,%d,%d平均分数为%.1f",z1,z2,z3,c[who],a[who][0],a[who][1],a[who][2],a[who][3],1.0*max/3);
return 0;
}
输入:
小红 小明 小于 小哈 小马 小黑 小花 小黄 小蜡 小胡
1 24 78 96
2 35 28 25
3 65 23 15
4 97 46 84
5 65 22 94
6 46 44 65
7 77 99 55
8 19 27 94
9 94 64 15
10 46 18 87
结果:
:Segmentation fault
我把代码修改了求三个学生的平均成绩和最高分进行了测试,测试正常,下面是求题目要求10个学生平均成绩和最高分的代码,供参考:
#include <stdio.h>
int main()
{
int a[10][4];
char c[10][20]; //10个学生的姓名可以用一个二维字符数组存储,字符数组只能存放一个学生的姓名
int i,j,b[10],max,who,Z1=0,Z2=0,Z3=0;
float z1,z2,z3;
for(i=0;i<10;i++){ //每个学生的姓名用一个scanf读取,写法稍微简单点,一个%s一般是获取一个学生姓名字符串
scanf("%s",c[i]);
}
for(i=0;i<10;i++)
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]); //用循环获取整数输入来赋值给二维学生成绩学号数组
// if(j!=3)
// scanf("%d",&a[i][j]);
// else
// scanf("%d\n",&a[i][j]);
}
//每个学生的总分
for(i=0;i<10;i++)
b[i]=a[i][1]+a[i][2]+a[i][3];
//三门功课的总成绩
for(i=0;i<10;i++)
for(j=0;j<4;j++)
{
if(j==1)
Z1+=a[i][j];
else if(j==2)
Z2+=a[i][j];
else if(j==3)
Z3+=a[i][j];
}
max=b[0],z1=1.0*Z1/3,z2=1.0*Z2/3,z3=1.0*Z3/3;
for(i=0;i<10;i++)
{
if(b[i]>max)
max=b[i],who=i;
}
printf("三门课总平均成绩分别为%.1f,%.1f,%.1f\n最高分学生数据:\n姓名:%s\n学号:%d\n三门课成绩分别为%d,%d,%d,平均分数为%.1f",z1,z2,z3,c[who],a[who][0],a[who][1],a[who][2],a[who][3],1.0*max/3);
return 0;
}
你写得有点凌乱,下面是我写得,仅供参考,谢谢!
#include<stdio.h>
#define N 5
int main()
{
struct student{
int no;//学号
char name[20];//姓名
float chinese;//语文
float math;//数学
float eng;//英语
float total;//总分
float avg;//平均分
}stu[N];
float avgAll[3];//全班语文数学英语平均分
float totalAll[3]={0.0,0.0,0.0};//全班语文数学英语总分
float totalMax;//总分最高
int index=0;//总分最高者索引
printf("分别输入 彼此之间用空格隔开\n");
printf("\n学号 姓名 语文成绩 数学成绩 英语成绩\n\n");
//输入
for(int i=0;i<N;i++)
{
scanf("%d %s %f %f %f",&stu[i].no,stu[i].name,&stu[i].chinese,&stu[i].math,&stu[i].eng);
}
//分别求每个学生的总分以及平均分以及各科全班总分
for(int i=0;i<N;i++)
{
stu[i].total=stu[i].chinese+stu[i].math+stu[i].eng;
stu[i].avg=(stu[i].chinese+stu[i].math+stu[i].eng)/3;
totalAll[0]+=stu[i].chinese;
totalAll[1]+=stu[i].math;
totalAll[2]+=stu[i].eng;
}
//分别求全班语文平均分,数学平均分,英语平均
avgAll[0]=totalAll[0]/N;
avgAll[1]=totalAll[1]/N;
avgAll[2]=totalAll[2]/N;
//求出总分最高的学生
for(int i=0;i<N;i++)
{
if(i==0)
totalMax=stu[i].total;
if(stu[i].total>totalMax)
{
totalMax=stu[i].total;
index=i;
}
}
//输出全班各科平均分
printf("\n全班语文平均:%.1f\n全班数学平均分:%.1f\n全班英语平均分:%.1f\n\n",avgAll[0],avgAll[1],avgAll[2]);
//全班总分第一名学生信息
printf("\n总分第一名的学生\n学号:%3d\n姓名:%s\n语文:%.1f\n数学:%.1f\n英语:%.1f\n",stu[index].no,stu[index].name,stu[index].chinese,stu[index].math,stu[index].eng);
return 0;
}