结构体中的数组;如何使我的代码更简洁?

时间:2019-04-16 17:52:13

标签: c

我是编程新手,并且在编码简洁性方面苦苦挣扎。

一个练习题给出了一个值表(每个学生的姓名,ID和四个测验),要求我们将其放入struct中,然后打印每个学生的信息和测验平均值。

虽然我能够做到这一点,但我的代码却不够优雅。我希望获得一些帮助,使其更简洁,以便现在可以养成良好的编码习惯。

这是练习题:

  • 创建一个数据结构以将有关学生的信息存储在class中。教授想为每个学生存储(目前,稍后将进行扩展):

    • 名称(字符串)
    • 大学ID号(整数)
    • 测验分数(由4个浮动测验分数组成的数组)
  • 编写一个程序,该程序将初始化声明中的变量,然后计算并打印每个学生的测验平均值。

我能够弄清楚如何在一个结构体中放置一个带有四个值的浮点数,但是我无法弄清楚如何在结构体中压缩数组以减少代码长度。

此外,我分别为每个学生编码了值,但是努力使单个打印语句适用于所有学生,而不得不为每个学生包括单独的打印语句。我怀疑有更好的方法可以通过循环执行此操作,但是我无法使其正常工作。

#include <stdio.h>
#include <stdlib.h>

struct student{
    char name[30];
    int id_no;
    float quiz[4];
};

int main()
{
    int i;
    float avg;

    struct student student1;
    strcpy(student1.name,"C,Joe");
    student1.id_no = 999;
    student1.quiz[0] = 10.0;
    student1.quiz[1] = 9.5;
    student1.quiz[2] = 0.0;
    student1.quiz[3] = 10.0;

    struct student student2;
    strcpy(student2.name,"Hernandez, Pete");
    student2.id_no = 784;
    student2.quiz[0] = 10.0;
    student2.quiz[1] = 10.0;
    student2.quiz[2] = 9.0;
    student2.quiz[3] = 10.0;

    struct student student3;
    strcpy(student3.name,"Brownnose, Violet");
    student3.id_no = 999;
    student3.quiz[0] = 7.5;
    student3.quiz[1] = 6.0;
    student3.quiz[2] = 8.5;
    student3.quiz[3] = 7.5;

    {
      printf("Name: %s ",student1.name);
      printf("ID: %d ",student1.id_no);
      avg = 0;
      for(i=0;i<3;i++)
      {
        printf(" Quiz %d: %.1f ",i,student1.quiz[i]);
        avg = avg + student1.quiz[i];
      }
      avg = avg/4;
      printf("\nAverage quiz score: %.1f\n",avg);
    }
printf("\n");
    {
      printf("Name: %s ",student2.name);
      printf("ID: %d ",student2.id_no);
      avg = 0;
      for(i=0;i<3;i++)
      {
        printf(" Quiz %d: %.1f ",i,student2.quiz[i]);
        avg = avg + student2.quiz[i];
      }
      avg = avg/4;
      printf("\nAverage quiz score: %.1f\n",avg);
    }
printf("\n");
    {
      printf("Name: %s ",student3.name);
      printf("ID: %d ",student3.id_no);
      avg = 0;
      for(i=0;i<3;i++)
      {
        printf(" Quiz %d: %.1f ",i,student3.quiz[i]);
        avg = avg + student3.quiz[i];
      }
      avg = avg/4;
      printf("\nAverage quiz score: %.1f\n",avg);
    }
    return 0;
}

输出结果看起来不错。但是,我缺少用于到达那里的方法(请注意,我必须在末尾使用三个打印语句,每个学生一个)。

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您的程序未完全响应提示,提示

  

[...] 编写一个程序,该程序将初始化声明中的变量 [...]

。按照指示进行操作可以使您的代码有所简化,就像您要执行的操作一样。例如:

struct student student1 = { .name = "C,Joe", .id_no = 999, .quiz = { 10.0, 9.5, 0.0, 10.0 }};

只要按成员声明顺序提供初始化程序,而不会跳过,则可以通过省略成员指定符并仅提供初始化值来进一步简化。不过,我更喜欢使用指示符,因为我觉得更清楚。

  

此外,我分别为每个学生编码了值,但是很挣扎   获得一份适用于所有学生的打印说明,以及   相反,必须为每个学生提供单独的打印声明。一世   怀疑有更好的方法可以通过循环执行此操作,但我无法   它可以正常工作。

如果要循环,则需要某种支持迭代的数据结构。数组是很明显的一种,但是链表也可以工作。采取阵列路线,您可能会避免为学生设置单个变量,例如:

struct student students[] = {
    { .name = "Alice", .id_no = 42, .quiz = { 1.0, 2.5, 3.0, 0.0 }},
    { .name = "Bob", .id_no = 99, .quiz = { 10.0, 9.5, 8.0, 7.0 }},
    // ...
};

然后您可以遍历数组,在students[i]的有效索引范围内,对i进行students的每次迭代。

答案 1 :(得分:0)

在经过类似的挣扎之后,如果有人偶然发现了这个问题,下面是结合约翰·布林格令人难以置信的有用回答后的解决方案:

#include <stdio.h>
#include <stdlib.h>

struct students{
    char name[30];
    int id_no;
    float quiz[4];
};

int main()
{
    int i,j;
    float runsum;

    struct students student[] = {{ .name = "C,Joe", .id_no = 999, .quiz = { 10.0, 9.5, 0.0, 10.0 }},
    { .name = "Hernandez, Pete", .id_no = 784, .quiz = { 10.0, 10.0, 9.0, 10.0 }},
    { .name = "Brownnose, Violet", .id_no = 332, .quiz = { 7.5, 6.0, 8.5, 7.5 }}
    };

    for(i=0;i<3;i++)
    {
        printf("Name: %s ",student[i].name);
        printf("ID: %d ",student[i].id_no);
        runsum = 0;
        for(j=0;j<4;j++)
        {
            runsum = runsum + student[i].quiz[j];
        }
        printf(" Quiz average: %.2f\n",runsum/4);
    }
    return 0;
}