【问题标题】:C++ Cant get to complete the average calculation with double valuesC++ 无法用双精度值完成平均计算
【发布时间】:2012-11-15 19:12:42
【问题描述】:

这段代码现在做了什么:我给出 int 值并计算它们之间的平均值。 我花了几个小时试图让它做的事情:我试过让它计算双精度值之间的平均值。我已经尝试了所有方法,但总是失败或进入无限循环或无法编译。

问题:那么我应该如何修改我的代码以使其适用于双值/数字?

#include <stdio.h>


void main()
{
int Tau[10]={0,0,0,0,0,0,0,0,0,0};
int r, i = 0;
int m = 0;
int huku = 0;


do{

printf("Enter numbers: ");
scanf_s("%d", &i);
Tau[m]+=i;
huku++;


}while(i != 0);

r = (Tau[m]/(huku-1));


printf("The average of your numbers is; %d\n", r);
}

【问题讨论】:

  • 对于初学者,您永远不会增加计数器变量“m”,因此您始终只是添加到 Tau[0],而将其他 9 个变量保留为零。
  • Tau 数组的原因是什么?您只使用它的第一个元素。您可以将其替换为单个 int。
  • 查看整数除法的工作原理。制作一个较小的测试用例,看看它是否按您期望的方式工作。

标签: c++ double average


【解决方案1】:

您的代码中存在一些问题,但基本上,整数除法不会给您加倍。一个整数除以一个整数的结果是另一个整数,而不是双精度数。如果您想要双精度数,则需要将分子或分母转换为双精度数并将结果存储在双精度数中。

【讨论】:

    【解决方案2】:

    欢迎来到数值分析 1001。

    整数数学:

    2 / 3 = 0;
    4 / 2 = 2;
    5 / 2 = 2;
    

    整数不做分数。

    【讨论】:

    • @LuchianGrigore that = 0!!我可以做那种整数数学!
    【解决方案3】:
    1. 我不明白为什么在你的情况下你需要 Tau 作为向量。一个 int 就足够了。
    2. huku-1 -> 这是错误的。应该只是 huku。
    3. 你需要在分裂时将 Tau 和 huku 施放为双倍。检查 huku 是否为 != 0 也没有什么坏处。
    4. m 没用。直接删除即可。
    5. 如果您希望在其中存储 Tau/huku,r 不应该是 int。
    6. 在 printf 中将 %d 替换为 %lf

    【讨论】:

      【解决方案4】:

      最简单的改动只涉及四行:

      double Tau[10] = {0,0,0,0,0,0,0,0,0,0};
      double r, i = 0;
      scanf_s("%f", &i);
      printf("The average of your numbers is; %f\n", r);
      

      请注意,这并不能解决编码问题;它所做的只是更改代码以读取和使用double 而不是int

      【讨论】:

        【解决方案5】:
        double r = 0;
        int i = 0;
        r = ((double)Tau[m]/((double)huku-1));
        printf("The average of your numbers is; %f\n", r);
        

        【讨论】:

          【解决方案6】:
          // Question is tagged for C++, but the code is in C.
          // I will change your code a bit, because you had quite a few mistakes.
          #include <stdio.h>
          
          void main ()
          {
              int sum = 0; // sum of all numbers you entered, to find average you only need total sum and number of entries
              int numOfEntries; // number of entries (numbers taken from input)
              int inputNum; // variable where you will write numbers from input one by one
              double average; // Not really needed, but it can help to simplify the problem to you.
          
              printf("Enter numbers: ");
              do
              {
                  scanf_s("%d", &inputNum);
                  sum += inputNum;
                  numOfEntries++;
              } while (inputNum != 0); // I understand you read numbers until you read value 0.
              // int / int will give you rounded number, not the true average, so we need to convert one of the operands to a real number, in this case double
              // double / int or int / double will give you a real number as result, which will have true average value, and that is why I converted sum to a real number
              if (numOfEntries != 0)
                  average = (double)sum / numOfEntries;
              else
                  average = 0;
              printf("The average of your numbers is; %f\n", average); // Here I did it again - print double instead of int to get true value.
          }
          

          改变它会更容易:

          ....
          double sum = 0;
          ...
          average = sum / numOfEntries; // Here sum is already double, not int, so you don't need to change it manually.
          ...
          

          现在,如果你想让它适用于双倍,唯一的区别是:

              double sum = 0;
              double inputNum;
              scanf_s("%lf", &inputNum);
              average = sum / numOfEntries;
          

          所以,为了总结这个故事 - 你有一个从键盘输入数字的变量,一个保存到目前为止所有输入数字的总和的变量,一个计算你从键盘输入的数字的变量。您输入数字直到输入 0 作为值,然后程序将退出循环。平均数的公式是所有数字的总和除以数字的数量。对于整数,您必须将转换添加到实数,否则您将无法获得准确的结果。

          希望我没有把你弄糊涂。 :D

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-01
            • 1970-01-01
            • 2015-08-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多