【问题标题】:Why my C program is not working for Grading points?为什么我的 C 程序不适用于评分?
【发布时间】:2020-06-11 07:05:21
【问题描述】:

我编写了一个 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;
}

错误的输出图片:

【问题讨论】:

  • printf("%d%%: Grade A", marks); --> printf("%.0f%%: Grade A", marks);
  • 请不要张贴文字图片。将文本作为文本发布。
  • 你在做整数除法,把(double)((sum / 500) * 100);改成(((double)sum / 500) * 100);
  • 请问,您为什么更改了代码?按要求回滚到问题。
  • 谢谢天气风向标先生。有用。非常感谢。

标签: c floating-point precision integer-division integer-arithmetic


【解决方案1】:

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

1.

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

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

任意使用

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

只需指定double 类型的变量sum。这样,您还可以在 marks 的初始化时省略对 double 的强制转换。

double sum;
....

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

2.

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

您使用%d 转换说明符来打印marksdouble 值,这会调用undefined behavior

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

注意:对于printf(),您可以使用%f 转换说明符来打印double 值,而不是像scanf() 需要使用double 那样需要%lf


旁注:

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

【讨论】:

    【解决方案2】:

    在下面的代码中,我还更改了上限(否则,例如 marks=79.8,您不会显示任何内容):

    #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);
        printf("marks=%f\n", marks);
        if (failed > 0) printf("Ops! Failed\n");
        else
        {
            if (marks >= 90) printf("%.2f%%: Grade A\n", marks);
            else if (marks >= 80 && marks < 90) printf("%.2f%% Grade B\n", marks);
            else if (marks >= 70 && marks < 80) printf("%.2f%% Grade C\n", marks);
            else if (marks >= 60 && marks < 70) printf("%.2f%% Grade C\n", marks);
            else if (marks >= 40 && marks < 60) printf("%.2f%% Grade D\n", marks);
        }
        return 0;
    }
    

    【讨论】:

    • 注意:可以简单地离开(marks &gt;= 70 &amp;&amp; marks &lt; 80) --> (marks &gt;= 70)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2015-05-01
    • 2020-04-12
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多