首页 > 解决方案 > 结构内的数组;如何让我的代码更简洁?

问题描述

我是编程新手,正在为编码简洁而苦苦挣扎。

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

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

下面是练习题:

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

此外,我对每个学生的值分别进行编码,但努力让一个打印语句适用于所有学生,而不得不为每个学生包含单独的打印语句。我怀疑有更好的方法通过循环来做到这一点,但我无法让它工作。

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

输出结果看起来不错。然而,我用来到达那里的方法是缺乏的(请注意,我必须在最后使用三个打印语句——每个学生一个)。

提前感谢您的帮助!

标签: c

解决方案


您的程序没有完全响应提示,它说

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

. 按照说明进行操作将在某种程度上简化您的代码,就像您希望做的那样。例如:

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], fori在 的有效索引范围内进行操作students


推荐阅读