struct student
{ long number;
char name[20];
float grade[3];
float average;
}stu[50];
static int m=0;
input()
{ struct student *p;
int i,n;
for(i=1,p=stu;i<50;i++,p++)
{ printf("Number%d:",i);
scanf("%d",&p->number);错误!类型不一致!应是%ld
if(p->number==0) break;
printf("\nName:");
scanf("%s",p->name);
printf("\nChinese:");
scanf("%d",p->grade[0]); 错误!你的类型定义是float,这里却是%d 另外 p->grade[0] 改成 &p->grade[0] 下同。
printf("\nMaths:");
scanf("%d",p->grade[1]);错误!
printf("\nEnglish:");
scanf("%d",p->grade[2]);错误!
}
m=i;
}
#include
#include
struct student
{ long number;
char name[20];
float grade[3];
float average;
}stu[50];
static int m=0;
void input() // 这里我加了个void类型
{ struct student *p;
int i;
for(i=1,p=stu;i<50;i++,p++)
{ printf("Number%d:",i);
scanf("%d",&p->number);
if(p->number==0) break;
printf("\nName:");
scanf("%s",p->name);
printf("\nChinese:");
scanf("%f",&p->grade[0]); //%d改为%f 还有加了个&
printf("\nMaths:");
scanf("%f",&p->grade[1]); //同上
printf("\nEnglish:");
scanf("%f",&p->grade[2]); //同上
}
m=i-1; // 将原来的i 改为i-1 因为最后的i没有输入数据
}
void average()
{ struct student *q=stu;
int i;
for(i=0;i<=m;i++,q++) //你粗心少些了,i++
q->average=(q->grade[0]+q->grade[1]+q->grade[2])/3;
}
void output()
{ struct student *q=stu;
int i,n;
for(i=1;i<=m;i++,q++)
{printf("Number%d\tName\tChinese\tMaths\tEnglish\tAverage\n",i);
printf("%d\t%s\n",q->number,q->name);
for(n=0;n<3;n++)
printf("%.2f\t",q->grade[n]); // 为了美观 使其精确到小数点后两位
printf("%.2f\n",q->average); // 同上
}
}
main()
{
input();
average();
output();
return 0; //我加了这个 更标准化
}
//以上的代码通过了测试 运行和结果输出都成功了
scanf语句写错了,应该是
scanf("%d",&p->grade[0]);
scanf("%d",&p->grade[1]);
scanf("%d",&p->grade[2]);