1

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

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

我想出的只是一个无限循环

+:*

-:*

* :*

/:*

input.txt 将类似于下面


1名学生

卡拉学生姓名

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;

如果有人可以帮助我,我将不胜感激。

4

2 回答 2

2

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

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

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

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

并且您的avg变量被声明为 int,因此您将执行整数除法,这可能不会像您预期的那样运行;也就是说,您只会得到整数,因此您随后的条件将在很大程度上毫无意义。你应该把它变成一个浮点数或双精度数,并将你的一个操作数转换为浮点数

于 2013-03-23T00:38:33.087 回答
0

考虑以下 For 循环:

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

执行的顺序是:

  • 运行 i = 0;
  • 运行 i < 10; 如果结果为“真”,请继续。如果结果为“假”,则退出循环。因为 i 第一次是 0,而 0 小于 10,所以结果为真。继续前进
  • 运行 DoSomething();
  • 运行我++
  • 返回“运行 i < 10;如果结果为“真”...

在您的情况下,您实际上是在将 num 分配给 i,而不是检查 i 是否等于 num。因为 C 将 0 视为“假”,而将其他任何内容视为“真”,并且因为 i = 10 的“结果”是 10(参见边栏 1),计算机将 i = 10 评估为“真”,所以循环继续进行

在 C 语言中这是一个很容易犯的错误,因为编译器不会警告你。像 Lint 这样的静态分析工具可以,但那是另一回事了。

在结论中,您可能希望 "i = num" 成为 "i < num" 或 "i <= num" 或其他一些条件语句。

Sidebar1此属性允许您像 a = b = c = 10 一样链接分配。c = 10 的结果是 10,因此被分配给 b。b = 10 的结果是 10,因此被分配给 a。

于 2013-03-23T00:46:20.123 回答