首页 > 解决方案 > 为什么我的 C 程序不适用于评分?

问题描述

我编写了一个 C 程序来查找 5 个学生的成绩点。如果学生失败,我会显示正确的结果,但当所有学生都通过时,它不会显示任何答案。请帮我解决它。代码:

#include <stdio.h>
int main()
{
    int mark[5], failed = 0, sum = 0;
    for (int i = 0; i < 5; i++) scanf("%d", &mark[i]);
    for (int i = 0; i < 5; i++)
    {
        sum = sum + mark[i];
        if (mark[i] < 40) failed++;
    }
    double marks = (double)((sum / 500) * 100);
    if (failed > 0) printf("Ops! Failed\n");
    else
    {
        if (marks >= 90) printf("%d%%: Grade A", marks);
        else if (marks >= 80 && marks <= 89) printf("%.2lf%%: Grade B\n", marks);
        else if (marks >= 70 && marks <= 79) printf("%.2lf%%: Grade C\n", marks);
        else if (marks >= 60 && marks <= 69) printf("%.2lf%%: Grade C\n", marks);
        else if (marks >= 40 && marks <= 59) printf("%.2lf%%: Grade D\n", marks);
    }
    return 0;
}

错误的输出图像:在此处输入图像描述

标签: cfloating-pointprecisioninteger-divisioninteger-arithmetic

解决方案


您的程序有两个主要的语法问题:

1.

double marks = (double)((sum / 500) * 100);

(sum / 500)使用整数算术。小数部分被截断为零。显式转换为double只是将整个算术表达式的结果值转换为 a double

要么使用

double marks = ((double) sum / 500) * 100);

或者

sum只需指定类型的变量double。有了它,您还可以doublemarks.

double sum;
....

double marks = ((sum / 500) * 100);

2.

if (marks >= 90) printf("%d%%: Grade A", marks);

您使用%d转换说明符来打印 的doublemarks,这会调用未定义的行为

使用%f, 或者,如果您想遵守约定/共识,%.2lf就像您在所有其他printf()s 中所做的那样。

注意:因为printf()您可以使用%f转换说明符来打印一个double值,而不是%lfscanf()使用double.


边注:

  • 要符合标准,请更改int main()int main(void).

推荐阅读