我再次感谢大家对我以前的成绩册问题的迅速答复。我现在在该项目中走得更远,并且遇到了(我认为)棘手的问题。

这些说明要求我使用此原型创建一个函数:

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不起作用的原因是,在找到匹配的学生姓名和作业名称之后,循环继续运行。因此,完成循环后,您将丢失ij的值。实际上,循环完成后,请i==MAX_NUMBER_OF_STUDENTSj==MAX_NUMBER_OF_ASSIGNMENTS

若要保留ij的值,当找到匹配的名称时,应从循环中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/

10-11 23:04
查看更多