我再次感谢大家对我以前的成绩册问题的迅速答复。我现在在该项目中走得更远,并且遇到了(我认为)棘手的问题。
这些说明要求我使用此原型创建一个函数:
int set_assignment_score(Gradebook *gb, char name[MAX_NAME_LEN], char a_name[], int score);
它将再次通过* gb指针进入Gradebook结构,但这一次,它是用来访问Scores数组的:
int scores[MAX_NUMBER_OF_STUDENTS][MAX_NUMBER_OF_ASSIGNMENTS]
...并将“ score”整数存入特定单元格中以备将来使用。两个Char参数很重要,因为稍后我将需要从Scores数组中检索每个特定的整数,并将其与它的精确名称和a_name在print_gradebook函数中进行匹配。
我很想分享我到目前为止拥有的代码,但事实是我几乎不知道从哪里开始。我认为关键是要知道如何使用char name和char a_name代替通常的[i]和[j]来导航整数数组。
欢迎提出任何建议,建议,嘲弄或澄清要求。请。
这是成绩簿的结构:
typedef struct gradebook {
int number_of_students;
Students students[MAX_NUMBER_OF_STUDENTS];
int number_of_assignments;
char assignment_names[MAX_NUMBER_OF_ASSIGNMENTS][MAX_NAME_LEN + 1];
int scores[MAX_NUMBER_OF_STUDENTS][MAX_NUMBER_OF_ASSIGNMENTS];
} Gradebook;
编辑:谢谢大家!结合您的建议,我想到了:
int set_assignment_score(Gradebook *gb, const char name[MAX_NAME_LEN], const char a_name[], int score) {
int i, j;
for(i=0; i< MAX_NUMBER_OF_STUDENTS; i++) {
if(strcmp(gb->students[i].name, name) == 0) {
for(j=0; j< MAX_NUMBER_OF_ASSIGNMENTS; j++) {
if(strcmp(gb->assignment_names[j], a_name) == 0) {
gb->scores[i][j] = score;
}
}
}
}
printf("%d\n", gb->scores[i][j]);
return 1;
}
我怀疑这比需要的要笨拙得多,但是可以完成工作。有趣的是,我测试的printf函数不能提供我想要的结果(我想我正在打印地址或其他东西吗?),但是实际函数却可以。
最佳答案
是的,这是一般想法。 printf
不起作用的原因是,在找到匹配的学生姓名和作业名称之后,循环继续运行。因此,完成循环后,您将丢失i
和j
的值。实际上,循环完成后,请i==MAX_NUMBER_OF_STUDENTS
和j==MAX_NUMBER_OF_ASSIGNMENTS
。
若要保留i
和j
的值,当找到匹配的名称时,应从循环中break
。 (我还添加了一些错误检查功能,以处理找不到一个或两个名称的情况。)
int set_assignment_score(Gradebook *gb, const char name[MAX_NAME_LEN], const char a_name[], int score)
{
int i, j;
for(i=0; i< MAX_NUMBER_OF_STUDENTS; i++)
if(strcmp(gb->students[i].name, name) == 0)
break;
for(j=0; j< MAX_NUMBER_OF_ASSIGNMENTS; j++)
if(strcmp(gb->assignment_names[j], a_name) == 0)
break;
if ( i == MAX_NUMBER_OF_STUDENTS || j == MAX_NUMBER_OF_ASSIGNMENTS )
{
printf( "unable to set score (i=%d, j=%d)\n", i, j );
return 0;
}
gb->scores[i][j] = score;
printf("%d\n", gb->scores[i][j]);
return 1;
}
关于c - 按类别浏览2D数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34215318/