c - 结构内的数组;如何让我的代码更简洁?
问题描述
我是编程新手,正在为编码简洁而苦苦挣扎。
一个练习题给出了一个值表(姓名、ID 和每个学生的四个测验),我们被要求将其放入 a 中struct
,然后打印每个学生的信息和测验平均值。
虽然我能够做到这一点,但我的代码并不优雅。我需要一些帮助以使其更简洁,以便我现在可以养成良好的编码习惯。
下面是练习题:
创建一个数据结构以将学生的信息存储在
class
. 对于每个学生,教授想要存储(暂时,稍后会扩展):- 名称(字符串)
- 大学身份证号(整数)
- 测验分数(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;
}
输出结果看起来不错。然而,我用来到达那里的方法是缺乏的(请注意,我必须在最后使用三个打印语句——每个学生一个)。
提前感谢您的帮助!
解决方案
您的程序没有完全响应提示,它说
[...]编写一个程序来初始化声明中的变量[...]
. 按照说明进行操作将在某种程度上简化您的代码,就像您希望做的那样。例如:
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
。
推荐阅读
- laravel - 我的守护进程应该有多少个进程?
- ibm-watson - 获取 IBM Discovery 的文档名称
- python - /products/ 处的 NoReverseMatch
- java - 使用 Wss4jSecurityInterceptor 会引发 WRONG_DOCUMENT_ERR:一个节点在与创建它的文档不同的文档中使用
- powerbi - Power Bi 嵌入参数 - 列名中的空格
- mysql - MySQL 5.6 - 即使使用 ALGORITHM=inplace 也会锁定表
- c# - Microsoft 加载项在共享文件夹中添加重复邮件
- optaplanner - Optaplanner 与客户的硬链接仓库
- db2 - DB2 恢复、前滚问题
- ruby - 带有字符串键的哈希的安全导航运算符