再一次,我要感谢大家对我以前的成绩簿问题的及时回复。我现在在项目中更进一步,并且(在我看来)遇到了棘手的问题。
说明书要求我用这个原型创建一个函数:
"1 This is the first line" -> "1. This is the first line"
"1. This is the first line" -> "1. This is the first line"
"1.1 This is the first line" -> "1.1 This is the first line"
再次,它将通过* gb指针进入成绩簿结构,但这一次,它意味着访问Scores数组:
int set_assignment_score(Gradebook *gb, char name[MAX_NAME_LEN], char a_name[], int score);
...并将“得分”整数存放在特定单元格内以供进一步使用。两个 Char 参数很重要,因为稍后我将需要从Scores数组中检索每个特定的整数,并将其与print_gradebook函数中的精确名称和a_name匹配。
我很想分享到目前为止我所拥有的代码,但事实是我几乎不知道从哪里开始。我认为,关键是知道如何使用 char 名称和 char a_name来代替通常的[i]和[j]来导航整数数组。< / p>
欢迎任何建议,建议,嘲弄或要求澄清。请。
以下是成绩簿结构:
int scores[MAX_NUMBER_OF_STUDENTS][MAX_NUMBER_OF_ASSIGNMENTS]
编辑:谢谢大家!结合你的建议,我提出了这个:
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;
我怀疑它比它需要的更笨拙,但它完成了工作。有趣的是,我用来测试它的printf函数没有提供我想要的结果(我想我正在打印地址或其他东西?),但实际功能确实。
答案 0 :(得分:1)
是的,这是一般的想法。 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;
}