来自Deitel Book C的例子:如何编程 - 需要建议

时间:2014-10-06 20:48:22

标签: c

好的,基本上,我需要找到学生小组的平均成绩,而不知道他们的确切数字。

以下代码如下:

#include <stdio.h>

int main (void)
{
    unsigned int counter;
    int grade;
    int total;

    float average;

    total = 0;
    counter = 0;

    printf( "%s", "Enter grade, -1 to end: " );
    scanf( "%d", &grade);

    while (grade != -1)
    {
        total = total + grade;
        counter = counter + 1;

        printf( "%s", "Enter grade, -1 to end: " );
        scanf( "%d", &grade );
    }

    if ( counter != 0 )
    {
        average = (float) total / counter;

        printf( "Class average is %.2f\n", average);
    }

    else
    {
        puts( "No grades were entered" );
    }

    return 0;
}

基本上,这个应该给我任意数量的等级的平均等级。但每当我输入随机数量的等级,然后打印&#34; -1&#34;为了停止循环,它打印消息&#34;等级平均值为0&#34;。不管你输入了多少数字。唯一正常工作的条件是你不打印任何等级并打印&#34; -1&#34;马上,然后&#34;没有输入成绩&#34;在这里工作。

请帮助我。因为无论是盲目的我还是一些严重的错误我无法看到。第三种变体包括书中的错误。

期待您的帮助!

4 个答案:

答案 0 :(得分:0)

完美适合我:

Enter grade, -1 to end: 5
Enter grade, -1 to end: 5
Enter grade, -1 to end: 4
Enter grade, -1 to end: 3
Enter grade, -1 to end: -1
Class average is 4.25



$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

答案 1 :(得分:0)

如果您知道如何使用调试器,则可以尝试使用。有时调试器和交互式程序相处得很差,因此您可以从文件中读取输入而不是标准输入,以使调试器满意。

如果你还不熟悉调试器,一个好的起点是添加一些调试代码来回显你正在使用的数字。例如,退出循环后,添加:

printf("counter = %d, total = %d\n", counter, total);

一个可能的问题在于除法,特别是如果你使用的是可疑的编译器,因为你对另一个回复提示的评论)。强制转换的优先级假设高于除法,但您可以尝试将这两个数字转换为浮点数:

average = (float) total / (float) counter;

您还可以在结果打印上尝试一般%f

答案 2 :(得分:-1)

#include <stdio.h>
int main (void) {
    unsigned int counter;
        int grade;
        int total;
        float average;
        total = 0;
        counter = 0;
        grade = -2;

        fflush(stdin);
        while (grade != -1) {
            printf( "%s", "Enter grade, -1 to end: " );
            scanf( "%d", &grade);
            total = total + grade;
            counter = counter + 1;
        };

        if ( counter != 0 ) {
            average = (float) total / counter;
            printf( "Class average is %.2f\n", average);
        } 
        else {
            puts( "No grades were entered" );
        }
        return 0;
    }

答案 3 :(得分:-1)

在UNIX / Linux环境中,将初始化STDIN键盘映射文件IO。因此,在GCC / G ++中,它可能会起作用。

在Visual C / C ++中,它可能不起作用。

问题:

  • 首先,在严格编码中,您的C变量等级应首先在while循环块之前获得等级值。这可能会导致问题取决于您的操作系统环境。

要使其在每个标准C环境中运行,您将能够首先清除标准输入文件系统。