结构体数组的应用——学生成绩的处理

题目要求:
(基础题)学生有三门课程: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中填写程序所缺代码。

img

img


我的代码:

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

运行截图

img


问题:打印时有bug,达不到预期效果。

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");
    }
 
}