从零开始写代码 2023-05-24 13:11 采纳率: 69.2%
浏览 64
已结题

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

题目要求:
(基础题)学生有三门课程: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,达不到预期效果。

  • 写回答

3条回答 默认 最新

  • 创意程序员 2023-05-24 13:39
    关注

    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");
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月2日
  • 已采纳回答 5月25日
  • 创建了问题 5月24日