题目要求:
(基础题)学生有三门课程:A、B、C,3名学生的成绩如下表所示:
姓名 A B C 平均分
张三 78 84 67
李四 88 90 95
王五 66 79 80
请先定义一个结构体Student,其成员包括:name(姓名)、A、B、C、aver(平均分),再定义一个Student类型的数组stud[3]来存放学生资料。现欲先输入学生三门课程成绩,再计算平均分,最后输出学生信息,要求用“模块化程序设计”方法来设计程序。请根据题意、注释在代码段1-代码段5中填写程序所缺代码。
#include <stdio.h>
//定义结构体Student,学生姓名不超过10个字符
//三门课程成绩均为百分制,只取整数;平均分带小数
struct Student
{
char name[10];
int score[3];
float aver;
};
int i;
int main()
{
struct Student stud[3];//定义结构体数组stud[3]
void input(struct Student s[], int n);
void average(struct Student s[], int n);
void print(struct Student s[], int n);//对input()、average()、print()三个函数进行声明
input(stud, 3);
average(stud, 3);
print(stud,3);
//调用input()、average()、print()三个函数
//代码段2
return 0;
}
//定义输入n名学生的姓名、三门课程成绩的函数。
void input(struct Student s[], int n)
{
for(n=1;i<=3;n++)
{
printf("请输入第%d名学生数据:\n姓名:", n);
scanf(s[n-1].name);
getchar();
getchar();
printf("A课程成绩:");
scanf("%d", &s[n-1].score[0]);
printf("B课程成绩:");
scanf("%d", &s[n-1].score[1]);
printf("C课程成绩:");
scanf("%d", &s[n-1].score[2]);
}
printf("\n");
}
//定义计算n名学生三门课程平均分的函数
void average(struct Student s[], int n)
{
int sum=0;
for(i=0;i<3;i++)
{
for(i=0;i<3;i++)
sum=s[i].score[i]+sum;
s[i].aver=sum/n;
}
}
//定义输出n名学生的姓名、三门课程成绩、平均分的函数。学生信息输出如下图所示
void print(struct Student s[], int n)
{
for(i=0;i<3;i++)
{
printf("姓名:%s,A课程成绩:%d,B课程成绩:%d,C课程成绩:%d,平均分:%f。", s[i].name, s[i].score[0], s[i].score[1], s[i].score[2], s[i].aver);
printf("\n");
}
}
运行截图
for(n=1;i<=3;n++) 中间混入了奸细,i改为n。但建议改为int i,n不去修改。
输入姓名时,32-34行使用这个:scanf("%s", &s[n-1].name);
第11行 int i; 不要这样定义,各函数、循环里分别定义。尤其是在计算平均分,两层循环用一个i,会相互影响。
以下是修改后的:
#include <stdio.h>
//定义结构体Student,学生姓名不超过10个字符
//三门课程成绩均为百分制,只取整数;平均分带小数
struct Student
{
char name[10];
int score[3];
float aver;
};
int main()
{
struct Student stud[3];//定义结构体数组stud[3]
void input(struct Student s[], int n);
void average(struct Student s[], int n);
void print(struct Student s[], int n);//对input()、average()、print()三个函数进行声明
input(stud, 3);
average(stud, 3);
print(stud,3);
//调用input()、average()、print()三个函数
//代码段2
return 0;
}
//定义输入n名学生的姓名、三门课程成绩的函数。
void input(struct Student s[], int n)
{
for(int i=0;i<n;i++)
{
printf("请输入第%d名学生数据:\n姓名:", i);
scanf("%s", &s[i].name);
printf("A课程成绩:");
scanf("%d", &s[i].score[0]);
printf("B课程成绩:");
scanf("%d", &s[i].score[1]);
printf("C课程成绩:");
scanf("%d", &s[i].score[2]);
}
printf("\n");
}
//定义计算n名学生三门课程平均分的函数
void average(struct Student s[], int n)
{
for(int i=0;i<3;i++)
{
int sum=0;
for(int j=0;j<3;j++) {
sum = s[i].score[j] + sum;
}
s[i].aver = (1.0 * sum)/n; //sum和n都是整数,会进入整除,乘以1.0转为浮点数
}
}
//定义输出n名学生的姓名、三门课程成绩、平均分的函数。学生信息输出如下图所示
void print(struct Student s[], int n)
{
for(int i=0;i<3;i++)
{
printf("姓名:%s,A课程成绩:%d,B课程成绩:%d,C课程成绩:%d,平均分:%.1f。", s[i].name, s[i].score[0], s[i].score[1], s[i].score[2], s[i].aver);
printf("\n");
}
}
int i;
/*你这里int i*/
for (n = 1; i <= 3; n++)
/*这里的判断又是i<=3,让我很难办啊*/
scanf(s[n-1].name);
/*你这个scanf格式也不规范*/
/*求平均的函数也有问题*/
void average(struct Student s[], int n)
{
int sum = 0;/*sum没有重置会导致累加*/
for (i = 0; i < 3; i++)
{
for (i = 0; i < 3; i++)
sum = s[i].score[i] + sum;/*只会s[1].score[1],s[2].score[2]……而s[1].score[2]没了*/
s[i].aver = sum / n;/*这里和上面不强制转换类型会丢失数据,比如成绩是1,2,4;平均值本来是2.33333,你没转换他只会打印2*/
}/*所以你这里不能两个变量都是i,可以改成s[n].score[i]*/
}
/*--------------修改后------------*/
void average(struct Student s[], int n)
{
for (i = 0; i < 3; i++)
{
int sum = 0;
for (int j = 0; j < 3; j++)
sum = (float)s[i].score[j] + sum;
s[i].aver = (float)sum / n;
}
}
void print(struct Student s[], int n)
{
for (i = 0; i < 3; i++)
{
printf("姓名:%s,A课程成绩:%d,B课程成绩:%d,C课程成绩:%d,平均分:%.2f。", s[i].name, s[i].score[0], s[i].score[1], s[i].score[2], s[i].aver);
printf("\n");
}
}
有问题还可以问,有帮助的话还请采纳~
程序中错误比较多,已经修改好程序,并验证,有问题可以私聊。如下所示
#include <stdio.h>
//定义结构体Student,学生姓名不超过10个字符
//三门课程成绩均为百分制,只取整数;平均分带小数
struct Student
{
char name[10];
int score[3];
float aver;
};
int i;
void input(struct Student *s, int n);
void average(struct Student *s, int n);
void print(struct Student *s, int n);//对input()、average()、print()三个函数进行声明
int main()
{
struct Student stud[3];//定义结构体数组stud[3]
input(stud, 3);
average(stud, 3);
print(stud,3);
//调用input()、average()、print()三个函数
//代码段2
return 0;
}
//定义输入n名学生的姓名、三门课程成绩的函数。
void input(struct Student *s, int n)
{
int i;
for(i=0;i<n;i++)
{
printf("请输入第%d名学生数据:\n姓名:", i+1);
scanf("%s",s[i].name);
//getchar();
//getchar();
printf("A课程成绩:");
scanf("%d", &s[i].score[0]);
printf("B课程成绩:");
scanf("%d", &s[i].score[1]);
printf("C课程成绩:");
scanf("%d", &s[i].score[2]);
}
printf("\n");
}
//定义计算n名学生三门课程平均分的函数
void average(struct Student *s, int n)
{
int sum=0;
int i,j;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
{
sum=s[i].score[j]+sum;
}
s[i].aver=sum/n;
}
}
//定义输出n名学生的姓名、三门课程成绩、平均分的函数。学生信息输出如下图所示
void print(struct Student *s, int n)
{
for(i=0;i<n;i++)
{
printf("姓名:%s,A课程成绩:%d,B课程成绩:%d,C课程成绩:%d,平均分:%f。", s[i].name, s[i].score[0], s[i].score[1], s[i].score[2], s[i].aver);
printf("\n");
}
}