Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用单个while循环计算各种方法_C++ - Fatal编程技术网

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

C++ 使用单个while循环计算各种方法,c++,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

我要用一个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;
\define\u CRT\u SECURE\u NO\u警告
#包括
#包括
浮动a;
浮球g;
浮动h;
sum1=0;
sum2=0;
sum3=0;
n=5;
int k;
int main()
{
printf(“请输入五个整数:\n”);
而(k=0&&k
您的C程序有几个问题

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

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

然后在
pow(…,1/n)
中,1/n是一个整数除法,因此提升到0

必须修改循环及其条件。请尝试此操作,我使用了double,而不是integers和float,但这取决于您的赋值:

#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;
}
#包括
#包括
#定义最大值80
int main()
{
双a,g,h,k;
双和=0,生产=1,和投资=0;
常数int n=5;
int i=0;
printf(“请输入五个数字:\n”);
字符缓冲区[MAX];
而(i
如果这很残忍,我会道歉,但简单地说存在多个问题,然后继续纠正它们,而不解释问题的原因或采取了什么措施来纠正它们,这并不是一个很好的答案。这会导致作业被剪切和粘贴

#define _CRT_SECURE_NO_WARNINGS
这实际上是个坏主意。这些安全警告经常告诉你你在冒不必要的风险。它们很烦人,但通常是对的

#include <stdio.h>
#include <math.h>
前面4个变量没有数据类型。所有变量都必须有一个类型

当sum2用于收集产品时,将其进一步初始化为零是个坏主意。结果将为0

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

int main()
{

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

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

k = 0
if (k)
由于
k
为0,因此该值始终为false。这将在此处退出循环

k < n
始终为真,因为此时
k
将始终为1

这让你更仔细地阅读课本,因为你错过了很多

    {
        scanf("%lf", &k);
这一行将浮点数读入整数。这不是一个好主意。结果最多也会很奇怪

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

这个问题被标记为C++。为什么使用C?< /P>
        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。代码> Prtff<代码>,甚至在C++中,它是我可能使用它的情况之一(但是小心,因为有一个性能命中),因为C++等价代码> STD::CUD>代码> K/COD>同时是计数器和读取值,问题是:替换<代码>(k=0&&kwith

for(int i=0;i
问题是,我做错了什么?我对所有值只得到0。此外,我的赋值状态是使用一个while循环。使用
continue;
而不在
scanf()之后使用“错误”输入失败可能导致无限循环。谢谢!这对我帮助很大。解释得很好。只有一个小注意:我认为它永远不会达到++K。BTW,我只是假设C++标签是错误的。谢谢,你是对的。因为<代码> K=0 < /代码>,我不能覆盖< <代码> > +> K >代码>或<代码> k< n>代码>。我覆盖了所有这些,因为它们是AL。我不能用稍微不同的方法来做你想做的事情。你覆盖了C的方式,所以我从C++方向上点击它。
    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;
}
#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;
}