使用单个while循环来计算各种方法

时间:2016-03-01 22:12:09

标签: c++

我将使用单个while循环计算五个数字的算术平均值,几何平均值和调和平均值。

这是我到目前为止所做的:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

float a;
float g;
float h;
sum1 = 0; 
sum2 = 0; 
sum3 = 0;
n = 5;
int k;

int main()
{

    printf("Please Enter Five Integers:\n");

    while (k = 0 && k < n && ++k);
    {
        scanf("%lf", &k);
        sum1 = sum1 + k;
        sum2 = sum2 * k;
        sum3 = sum3 + (1.0 / k);
    }

    a = sum1 / n;
    g = pow(sum2, 1 / n);
    h = n / sum3;

    printf("Arithmetic mean: %.3f\n", a);
    printf("Geometric mean: %.3f\n", g);
    printf("Harmonic mean: %.3f\n", h);

    return 0;

2 个答案:

答案 0 :(得分:1)

你的C程序有几个问题。

例如,您没有声明您正在使用的所有变量,并且不需要它们是全局变量。

sum2(0)的初始值是错误的,它永远不会更新,因为你重复乘以k乘以0。

然后在pow(..., 1 / n)中,1 / n是整数除法,因此您将升至0。

必须修改您的循环及其条件。试试这个,我使用double,而不是整数和浮点数,但这取决于你的任务:

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

#define MAX 80

int main()
{
    double a, g, h, k;
    double sum = 0, prod = 1, sum_inv = 0;
    const int n = 5;
    int i = 0;

    printf("Please, enter five numbers:\n");

    char buffer[MAX];
    while ( i < n ) {
        fgets(buffer, MAX, stdin);
        if ( sscanf(buffer, "%lf", &k) != 1 ) {
            printf("Wrong format, floating point number expected\n");
            continue;
        }
        if ( k == 0.0 ) {
            printf("You should enter non zero numbers\n");
            continue;
        }
        ++i;
        sum += k;
        prod *= k;
        sum_inv += (1.0 / k);
    }

    a = sum / n;
    g = pow(prod, 1.0 / n);
    h = n / sum_inv;

    printf("Arithmetic mean: %.3f\n", a);
    printf("Geometric mean: %.3f\n", g);
    printf("Harmonic mean: %.3f\n", h);

    return 0;
}

答案 1 :(得分:1)

道歉,如果这是残酷的,但只是说有多个问题并继续纠正它们而没有解释为什么它们是问题或者做了什么来纠正它们并没有做出非常好的答案。它可以完成家庭作业的剪切和粘贴。

#define _CRT_SECURE_NO_WARNINGS

这实际上是一个坏主意。这些安全警告通常会告诉您,您承担了不必要的风险。他们很烦人,但往往他们是对的。

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

这些应该是<cstdio><cmath>。更好的是,不要使用cstdio。使用C ++等价物。

float a;
float g;
float h;
sum1 = 0; 
sum2 = 0; 
sum3 = 0;
n = 5;

前面的4个变量没有数据类型。所有变量都必须具有类型。

当将sum2用于收集产品时,将sum2初始化为零是一个坏主意。将导致0。

int k;

这些变量都不需要是全局的,并且所有变量名都是非描述性的。在这个大小的程序中,这并不可怕,但是在一个包含数十个或数千个变量的大型程序中,能够从变量名中读取它的功能和包含的内容是值得的。金。

int main()
{

    printf("Please Enter Five Integers:\n");

    while (k = 0 && k < n && ++k);

这里;是个错误。 ;结束指令。它将循环与它的主体分开,所以你得到一段时间的循环,但没有别的。

但是,让我们看一下循环条件吗?

k = 0

这与

相同
k = 0
if (k)

由于k为0,因此始终为false。这将退出循环。

k < n

它总是因为k = 0k是0.一个没有实际意义的因素,因为它永远不会被测试。

++k

始终为真,因为此时k将始终为1.

这种尖叫更仔细地阅读了教科书,因为你错过了很多。

    {
        scanf("%lf", &k);

此行将浮点数读取为整数。不是个好主意。结果将充其量只是奇怪。

此外,来自scanf的返回码未经测试,因此您无法判断scanf是否已成功读取值。

这个问题标记为C ++。为什么要使用C?

        sum1 = sum1 + k;
        sum2 = sum2 * k;
        sum3 = sum3 + (1.0 / k);

除了非常糟糕的非描述性名称之外,对我来说这一切看起来都不错。

    }

    a = sum1 / n;

声音和逻辑上的声音。

    g = pow(sum2, 1 / n);

1 / n将完全以整数运算执行,当然会产生一个分数。整数不能执行分数,因此这将导致0. 0的幂的任何数字都是1。

    h = n / sum3;

看起来不错。

    printf("Arithmetic mean: %.3f\n", a);
    printf("Geometric mean: %.3f\n", g);
    printf("Harmonic mean: %.3f\n", h);

再次,在C ++中使用C语言。 printf有它的用途,即使在C ++中也是如此,坦率地说,这是我可能会使用它的情况之一(但要小心,因为性能受到影响)因为C ++等效std::cout << "Arithmetic mean: " << std::fixed << std::setprecision(3) << a << '\n';是残忍的啰嗦。

    return 0;
}

为C ++修改此内容

#include <cmath>
#include <iostream>
#include <iomanip>
#include <limits>


int main()
{
    // discarded a, g, and h. Renamed the rest for easier reading
    float sum = 0;
    float product = 1;
    float invSum = 0;
    constexpr int MAX = 5;
    int input;

    std::cout <<"Please Enter Five Integers:" << std::endl;
    int count = 0;
    while (count < MAX)
    {
        if (std::cin >> input)
        { // read a good, or at least not horrible, number
          // this will not handle the problem of "123abc" as input. "123" will be
          // accepted and "abc" will be seen as a second token and rejected.
          // proper handling of this is a question unto itself and has been asked 
          // hundreds of times.
            sum += input;
            product *= input;
            invSum += (1.0 / input);
            count++;
        }
        else
        { // clean up and ask for new input
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout <<"Bogus integer. Input again: " << std::endl;
        }
    }

    std::cout << "Arithmetic mean: " << std::fixed << std::setprecision(3) << sum / MAX << '\n';
    std::cout << "Geometric mean: " << std::fixed << std::setprecision(3) << pow(product, (1.0 / MAX))  << '\n';
    std::cout << "Harmonic mean: " << std::fixed << std::setprecision(3) << MAX / invSum << '\n';
    return 0;
}