无法计算C中10个整数值的正确平均值

时间:2017-02-11 01:13:06

标签: c

Hello Stack社区!

我无法计算10个整数的正确平均值。 预期的输出平均值应该是140.0,其中一个整数值被编译器识别为不是正程序。

这是我编译的,它识别出负整数,但平均值仍为150.0

试着找出我在这里缺少的东西。 谢谢!

#include <stdio.h>
int main ()
{
    /* variable definition: */
    int count, value, sum;
    double avg;
    /* Initialize */
    count = 0;
    sum = 0;
    avg = 0.0;
    // Loop through to input values
    while (count < 10)
    {
        printf("Enter a positive Integer\n");
        scanf("%d", &value);
        if (value >= 0) {
            sum = sum + value;
            count = count + 1;
        }
        else {
            printf("Value must be positive\n");
        }
    }
     // Calculate avg. Need to type cast since two integers will yield an integer
    avg = (double) sum/count;
    printf("average is %lf\n " , avg );
    return 0;
}

值为:100 100 100 100 -100 100 200 200 200 200

5 个答案:

答案 0 :(得分:1)

  1. 您想要准确地读取10个正数,count09

  2. 在阅读100 100 100 100 -100 100 200 200 200 200后,count的值为9(因为-100既没有添加到sum也没有计算),那个10所以循环再次执行。

  3. 这次scanf()失败,所以value保持不变;实际上你正在阅读另一个200

  4. 这就是为什么数字之和为1500和平均150

答案 1 :(得分:0)

while (count < 10) { 
    printf("Enter a positive Integer\n"); 
    scanf("%d", &value);
    if (value >= 0) { 
        sum += value;
        count++; 
    }
    else {
        printf("Value must be positive\n"); 
        count++;
    }
}

即使输入负整数,这也会增加“计数”。 因此,您将获得所需的平均值。

答案 2 :(得分:0)

如果我理解你的问题,这就是你想要做的:

int last_known_positive_value = 0;
// Loop through to input values
while (count < 10)
{
    printf("Enter a positive Integer\n");
    scanf("%d", &value);

    if (value >= 0) {
        sum = sum + value;
        last_known_positive_value = value;
    }
    else {
        printf("Value must be positive\n");
        sum = sum + last_known_positive_value;
    }
    count = count + 1;
}

check-answer-here

答案 3 :(得分:0)

AlexP找到了解释:您必须检查scanf()的返回值,否则,您将默默接受不是数字的输入并重复使用上次转换后的值。

另请注意,avg = (double) sum/count;中的广告投放适用于sum并且绑定强于/。通过编写avg = (double)sum / count;

,使其更加明确是一种很好的风格

以下是您的计划的修改版本:

#include <stdio.h>

int main(void) {
    /* variable definitions */
    int count, value, sum;
    double avg;

    /* Initializations */
    count = 0;
    sum = 0;
    avg = 0.0;

    // Loop through to input values
    while (count < 10) {
        printf("Enter a positive Integer\n");
        if (scanf("%d", &value) != 1) {
            break;
        }
        if (value >= 0) {
            sum = sum + value;
            count = count + 1;
        } else {
            printf("Value must be positive\n");
        }
    }
    // Calculate avg.
    // Need to type cast to force floating point division instead of integer division
    if (count > 0) {
        avg = (double)sum / count;
        printf("average is %f\n", avg);
    }
    return 0;
}

答案 4 :(得分:0)

有许多不同的方法可以解决这个问题。 (1)您可以使用fgets将字符串作为字符串读取,然后调用sscanf,并从NULL获得fgets返回的好处指示EOF和仅包含'\n'的缓冲区测试,以指示用户按 [Enter] 以表示输入结束。

(2)您可以使用scanf以数字方式读取值,然后检查EOF以指示输入结束或其他预定的哨兵。

无论您选择哪种方法,方法基本相同。 (a)调用您用于输入的功能,(b)检查RETURN,(c)验证值输入在要求的范围内,并处理数据。

您可以在所有输入上获得漂移,检查读取函数的返回并处理任何错误或EOF条件,然后验证输入是在预期的范围内。

使用代码并使用scanf读取数值的快速示例可能类似于:

#include <stdio.h>

int main (void) {

    /* define/initialize variables */
    int count = 0, value = 0, sum = 0;
    double avg = 0.0;

    while (1) {  /* infinite loop to process input */

        int rtn;
        printf ("Enter a positive Integer ([ctrl+d] to quit): ");

        if ((rtn = scanf ("%d", &value)) != 1) {
            if (rtn == EOF) {   /* always handle user cancellation of input */
                putchar ('\n'); /* tidy up with POSIX line ending */
                break;          /* on to final calculation */
            }
        }

        if (value < 0)  /* check out of range */{
            printf ("Value must be positive\n");
            continue;       /* try again */
        }

        sum = sum + value;  /* compute sum */
        count = count + 1;  /* increment count */
    }

    /* Calculate avg. (typecast to avoid integer division) */
    avg = count > 0 ? (double) sum/count : 0;  /* protect div by zero */
    printf ("\n (%d/%d) => average: %lf\n", sum, count, avg);

    return 0;
}

示例使用/输出

$ ./bin/sumavg < <(echo "100 100 100 100 -100 100 200 200 200 200")
Enter a positive Integer ([ctrl+d] to quit):
<snip>

 (1300/9) => average: 144.444444

在所有完整示例之间运行的一个常见线程是始终处理用户生成的手动EOF,允许他们取消单个输入或整体输入(根据您的需要决定)。在Linux上,手册EOF [ctrl + d] 在windoze [ctrl + z] 上生成。

查看所有答案,如果您对上述内容有任何疑问,请与我们联系。