【问题标题】:How could I calculate several means using one set of user inputs?我如何使用一组用户输入来计算几种方法?
【发布时间】:2013-09-16 05:49:48
【问题描述】:

在提示用户输入 5 个整数后,我正在尝试计算算术、几何和调和平均值以及标准差。

我的算术平均值运行良好。它之后的其他人很麻烦..我几乎肯定这是因为我的结构,但我只是不确定在网上和我的教科书中研究后要改变什么......并且对此表示赞赏!

代码如下:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

float a_mean;
float g_mean;
float h_mean;
float st_dev;
sum1 = 0; sum2 = 0; sum3 = 0;
float data[100];
n = 5;
int i;

int main()
{

    printf("Please Enter Five Integers:\n"); /* Prompts user input */

            for ( i = 0; i < n; ++i)
                {
                    scanf("%f", &data[i]);
                    sum1 = sum1 + data[i];
                }
            a_mean = sum1 / n;

                {
                    sum2 = sum2 * data[i];
                }
            g_mean = pow(sum2, 1 / n);

                {
                    sum3 = sum3 + ( 1 / data[i] );
                }
            h_mean = n / sum3;

    printf("Arithmetic mean: %0.2f\n", a_mean);
    printf("Geometric mean: %0.2f\n", g_mean);
    printf("Harmonic mean: %0.2f\n", h_mean);

    return 0;
}

我知道这可能是我的 for 结构的基本内容,但我对这些东西还不太了解,所以提前谢谢

**另外,忽略我还没有尝试为标准偏差形成计算/输出的事实。谢谢

【问题讨论】:

  • 好的,谢谢大家,我最小化了全局变量,将循环移到一起并进行了一些调整,我的 arith 和harm 都可以工作,但是 geo 给了我 0.00,这个公式看起来有缺陷吗编码去?谢谢
  • 是的,您的几何平均值逻辑有​​缺陷。想想第一次通过循环会发生什么 - sum2 是 0,所以 sum2 * data[0] 将是 0。所以在下一次通过循环时 sum2 仍然是 0 ...
  • sum2 += sum2 * data[i];
  • 对不起,我按下了回车键..这一切都是一条评论。无论如何,然后我有 g_mean = pow(sum2, 1 / n);用于最终计算。这给了我一个值,在测试时,在实际地理位置的 + 或 - ~2 内。意思应该是。
  • 这让我很吃惊。 0+0 仍然是 0。 pow(sum2, 1/n) 也是有问题的。 1 和 n 都是整数,这意味着 1/n 将是整数除法。对于 n > 1 的任何值,1/n 将为 0。1.0/n 将强制浮点除法,这将为您提供所需的小数结果。

标签: c mean


【解决方案1】:

要么在一个 for 循环中完成所有的求和 或者做三个 for 循环。

既然你开始尝试两者!

Here is the code:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

float a_mean;
float g_mean;
float h_mean;
float st_dev;
sum1 = 0; sum2 = 0; sum3 = 0;
float data[100];
n = 5;
int i;

int main()
{

    printf("Please Enter Five Integers:\n"); /* Prompts user input */

            for ( i = 0; i < n; ++i)
                {
                    scanf("%f", &data[i]);
                    sum1 = sum1 + data[i];
                    sum2 = sum2 * data[i];
                    sum3 = sum3 + ( 1 / data[i] );
                }

            a_mean = sum1 / n;
            g_mean = pow(sum2, 1 / n);
            h_mean = n / sum3;

           printf("Arithmetic mean: %0.2f\n", a_mean);
           printf("Geometric mean: %0.2f\n", g_mean);
           printf("Harmonic mean: %0.2f\n", h_mean);

    return 0;
}

【讨论】:

  • 您可能还希望将输入与处理分开。有一个只进行扫描的 for 循环和另一个进行所有求和的 for 循环(使用存储在数组中的值)
  • 除非我弄错了,否则整数除法也有一些陷阱,会导致意想不到的结果。
【解决方案2】:

您的问题是for循环只会运行scanf,然后更改sum1。您需要将 sum2 = sum2 * data[i]sum3 = sum3 + (1 / data[i]) 移动到 for 循环的主体中(在 for 循环之后的 {} 内)。

【讨论】:

  • 感谢您的帮助,但是我刚刚进行了此修改,cmd提示停止工作...
  • 没关系 - 我修复了这部分。无论如何,我正在使用的 IDE 启动 CMD 提示符,在那种情况下,它给了我错误命令提示符已停止工作,但我用全局和类型修复了它。
【解决方案3】:

首先 - 您的代码无法编译,您在全局变量中缺少一堆类型。其次 - 您不能仅通过使用大括号来中断循环并继续,在第一个循环之后您拥有的少数集合只会作为正常代码执行一次,因此其他总和无法正确收集。

至于风格 - 尽量少用全局变量,这是个坏习惯

【讨论】:

  • 好的,我会尝试解决这个问题,感谢您的风格提示,我知道这些事情对于一开始就很重要,不胜感激。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多