【问题标题】:Output the average in C programming在 C 编程中输出平均值
【发布时间】:2015-03-21 16:45:11
【问题描述】:

我写了一个程序,让你输入数字并输出平均值。有时它不会输出确切的答案,我不知道为什么。例如,当我输入 1、2、10、-3 时,它输出 2,但它应该输出 2.50。另外,有没有办法通过输入一个字母,比如 N 而不是 0 来让它跳出循环?这是我的代码:

#include<stdio.h>

int main(){
    int nA = 1;
    int nSum = 0;
    int input = 0;
    double dAvg = 0;
    int nums = 0;
    printf("enter numbers to find the average\n");
    printf("enter 0 to quit.\n");
    while (nA !=0) {
        scanf("%d", &input);
        nA = input;
        nSum+=nA;
        if (nA !=0) {
            nums = nums + 1;
        }
        dAvg = nSum / nums;
    }   
    printf("your average is %lf\n", dAvg);    
    return 0;  
}

【问题讨论】:

  • 对于nSumnums 的数据类型,您应该使用double 而不是int。整数除法会截断结果。例如,10/3 的结果将从3.3333... 截断为3
  • 如果第一个数字是 0,你的程序有未定义的行为。
  • 您需要多少平均值 - 平均值、众数或中位数?
  • 感谢工作!不过,有没有办法通过使用字母而不是 0 来打破循环?

标签: c average


【解决方案1】:

你除整数,你应该做一个双除:

dAvg = nSum / (double)nums;

【讨论】:

  • 好的,新版本可以了!耶!但是,我仍然想知道是否可以通过使用字母而不是数字来跳出循环......
  • @Timmy 是的,这是可能的。检查scanf 的返回值。查看scanf 的文档以了解如何使用它。
【解决方案2】:

只需将除法参数转换为double

dAvg = (double) nSum / nums;

必须这样做,因为nSumnums 都是int,它们会进行整数除法,即截断小数部分或除法运算符返回@987654326 @。因此,为避免这种情况,我们必须在除法中显式转换 double

【讨论】:

    【解决方案3】:

    有时它不会输出准确的答案,我不知道为什么。

    这行代码是罪魁祸首:

    dAvg = nSum / nums
    

    当您输入 1、2、10、-3 时,您应该得到 2.5,但结果的小数部分会被截断。相反,你应该做double除法:

    dAvg = double(nSum) / nums
    

    另外,有没有办法让它通过输入一个字母,比如 N 而不是 0 来跳出循环?

    是的,有。可以使用C函数scanf_s

    char input; // use a char instead of an int
    do {
        scanf_s("%c", input, 1);
        if (input == 'N') {
            break;
        }
    
        nA = input - '0'; // convert char input to int value
        nSum+=nA;
        nums = nums + 1;
        dAvg = nSum / nums;
    }
    

    【讨论】:

    • 我对char很不熟悉。我要把它放在while循环中吗?
    • char input替换你的int input,用我在回答中给出的do循环替换你的while循环。
    【解决方案4】:

    除法运算符获得两个ints 作为操作数,因此它返回一个int。结果通过添加小数点隐式转换为float。如果您想要float 除法,则应将除法运算符的两个操作数中的至少一个作为float

    【讨论】:

      【解决方案5】:
      #include<stdio.h>
      
      int main(void) {
         int count = 0, nSum = 0;
         char input = 0;
         double dAvg;
         while(scanf("%c", &input) != -1) { // while not error
            if(input == 'N') break; // go out of loop, you can do it another way:
            // while (scanf("%c", &input) != -1 && input != 'N') {
            if(input != 0) { // If you don't want to count zeros
               nSum += input - '0';
               ++count; // increment by one
            }
         }
         // Here you can check internal errors
         if(count != 0) dAvg = nSum * 1.0 / count;
         printf("%f\n", dAvg); // print double
      

      }

      内部类型 char 只不过是简单的数字(如果它是无符号的,则为 0-255)。所有的符号实际上都有代码,也就是数字。这就是为什么您可以像使用数字一样使用 char:

      char a = 'c';
      int b = a + 4;
      

      【讨论】:

        猜你喜欢
        • 2020-07-01
        • 2021-12-02
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多