所有我得到的文件都是无限循环

时间:2013-03-23 00:34:59

标签: c file file-io io

任何人都可以帮我解决以下c程序吗?这只是我在c中的第二个程序,所以我不知道我在做什么。

我正在尝试在c中创建一个程序来读取文件“input.txt”,并根据学生正确答案的百分比给出学生的星号数学分数

我想出的就是无限循环 的

+:*

- :*

* 的:*

/:*

input.txt类似于下面的


1 学生人数

Karla 学生姓名

8 10 加成分由8/10决定

50 80 扣除分数由50/80决定

30 60 乘法得分由30/60决定

2 5 分数得分由2/5决定


具有所需的

输出

卡拉

+:* * * * * * * *

- :* * * * * *

*:* * * * *

/:* * * *


我的代码

int num; 
char name; 
int sum;
int cur;
int i;
int avg; 

//call file
FILE*ifp=fopen("input.txt","r");
fscanf(ifp,"%d",&num);
for (i=0;i=num;i++){
        fscanf(ifp,"%c",&name);
        printf("%c",&name);
        for(sum=0;sum<=4;sum++){
            fscanf(ifp,"%d",&cur);
            scanf(cur,"%d %d")
            avg=%d/%d;
            if (sum==1)
                printf("+:");
            else if (sum==2)
                printf("-:");
            else if (sum==3)
                printf("*:");
            else if (sum==4)
                printf("/:");
            if (avg==1)
                printf("**********\n");
            else if (avg>=.9)
                printf("*********\n");
            else if (avg>=.8)
                printf("********\n");
            else if (avg>=.7)
                printf("*******\n");
            else if (avg>=.6)
                printf("******\n");
            else if (avg>=.5)
                printf("*****\n");
            else if (avg>=.4)
                printf("****\n");
            else if (avg>=.3)
                printf("***\n");
            else if (avg>=.2)
                printf("**\n");
            else if (avg>=.1)
                printf("*\n");
            else
                printf("\n");
        }
}
//close file
fclose(ifp);
return 0;

如果有人能帮助我,我会非常感激。

2 个答案:

答案 0 :(得分:2)

你的无限循环是因为你的外循环条件: 将for (i=0;i=num;i++)更改为for (i=0;i<num;i++)

实际上,你只是每次都将我分配给num,因此是无限循环。

编辑: 我还应该指出你的行上有语法错误

scanf(cur,"%d %d")
avg=%d/%d;

并且您的avg变量被声明为int,因此您将执行整数除法,这可能不会按预期执行;也就是说,你只会得到整数,所以你后来的条件将基本上没有意义。您应该将其设置为float或double并将其中一个操作数转换为浮点

答案 1 :(得分:0)

考虑以下For Loop:

for(i = 0, i < 10; i++)
{
   DoSomething();
}

执行的顺序是:

  • run i = 0;
  • run i&lt; 10;如果结果是“真”继续。如果结果为“False”,则退出循环。因为第一次我是0,而0小于10,结果是真的。继续前进
  • 运行DoSomething();
  • 运行i ++
  • 返回“运行i&lt; 10;如果结果为”True“......

在你的情况下,你实际上是在为i分配num,而不是检查我是否等于num。因为C将0视为“False”而将其他任何内容视为“True”,并且因为i = 10的“结果”为10(参见sidebar1),计算机将i = 10评估为“True”,因此循环继续

这在C中很容易出错,因为编译器不会对此发出警告。像Lint这样的静态分析工具会,但这是另一个故事。

在结论中,您可能希望“i = num”为“i&lt; num”或“i&lt; = num”或其他一些条件语句。

Sidebar1 此属性允许您链接分配,如a = b = c = 10.c = 10的结果为10,因此将其分配给b。 b = 10的结果是10,因此被分配给。