我是编程新手,并且在编码简洁性方面苦苦挣扎。
一个练习题给出了一个值表(每个学生的姓名,ID和四个测验),要求我们将其放入struct
中,然后打印每个学生的信息和测验平均值。
虽然我能够做到这一点,但我的代码却不够优雅。我希望获得一些帮助,使其更简洁,以便现在可以养成良好的编码习惯。
这是练习题:
创建一个数据结构以将有关学生的信息存储在class
中。教授想为每个学生存储(目前,稍后将进行扩展):
编写一个程序,该程序将初始化声明中的变量,然后计算并打印每个学生的测验平均值。
我能够弄清楚如何在一个结构体中放置一个带有四个值的浮点数,但是我无法弄清楚如何在结构体中压缩数组以减少代码长度。
此外,我分别为每个学生编码了值,但是努力使单个打印语句适用于所有学生,而不得不为每个学生包括单独的打印语句。我怀疑有更好的方法可以通过循环执行此操作,但是我无法使其正常工作。
#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;
}
输出结果看起来不错。但是,我缺少用于到达那里的方法(请注意,我必须在末尾使用三个打印语句,每个学生一个)。
在此先感谢您的帮助!
答案 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;
}