0

我正在为学校编写一个成绩册计划,但我对一件事感到困惑。我们有一个要读取的文件,其中包含多个学生 ID 和多个分数。会这样做:

results = fscanf(gradebook, "%d %d %d %d", id, sco1, sco2, sco3);

在读取时将数字存储到这些变量中,然后当光标用完变量以存储信息时停止光标?...然后我应该直接跳入计算函数以计算最终成绩,然后让它循环 fscanf下一个学生?

results = fscanf(gradebook, "%d %d %d %d", id, sco1, sco2, sco3);
          getCalc(sco1, sco2, sco3);

这是允许的吗?谢谢您的帮助。

4

3 回答 3

1

以下是一个工作示例,给出了每个学生 ID 的平均成绩:

#include <stdio.h>

int main(void)
{
        int     id, sco1, sco2, sco3;

        while (fscanf(stdin, "%d%d%d%d", &id, &sco1, &sco2, &sco3) == 4)
        {
                printf("%d: %g\n", id, (sco1+sco2+(double)sco3)/3.0);
        }
        return 0;
}
于 2013-04-13T07:45:21.307 回答
1

会这样做:

结果 = fscanf(成绩册,“%d %d %d %d”,id,sco1,sco2,sco3);

在读取时将数字存储到这些变量中,然后在游标用完变量以存储信息时停止游标?

不,除非它在 ​​while 循环中,否则它会在一次读取四个条目后立即停止,除非您使用 from 的值results来控制 while 循环并多次调用 fscanf() 以在每次调用时扫描 4 个条目。

例子:-

//Keeps reading unless it encounters less than 4 parameters, which might be the case
//if an end of file is reached, or your data pattern changes.

while(  fscanf(gradebook, "%d %d %d %d", id, sco1, sco2, sco3) == 4 )
{
 //You can pass the data of individual id, to calculate function, and compute the required
 //sum, total or other data locally in the function, there is really no reason to use pass
 //address in your case, so just transfer data using pass by value method. 
 getCalc(id,sco1,sco2,sco3);   
}
于 2013-04-13T08:38:32.980 回答
0

回答您的第一个和第二个问题: 、 和应该的类型idsco1即指向an 的指针,这些变量应该明确指向实际对象,并且您应该在使用它们之前检查返回值 ( sco2) 。例如:sco3int *intintresults

int a, b, c, d;
int *id = &a, *sco1 = &b, *sco2 = &c, *sco3 = &d;
int results = fscanf(gradebook, "%d %d %d %d", id, sco1, sco2, sco3);
if (results == 4) {
    getCalc(sco1, sco2, sco3);
}

此外, getCalc 应该接受 type 的参数int *。满足所有这些要求后,第三个问题的答案是:是的,您可以getCalc使用sco1,sco2sco3作为参数调用。

正如您可能已经猜到的,这里不需要中间指针变量,这可以简化。但是,这种简化需要修改您的fscanf表达式(插入&addressof运算符):

int id, sco1, sco2, sco3;
int results = fscanf(gradebook, "%d %d %d %d", &id, &sco1, &sco2, &sco3);
if (results == 4) {
    getCalc(&sco1, &sco2, &sco3);
}

你在看哪本书?

于 2013-04-13T07:41:38.410 回答