C++ 使用单个while循环计算各种方法
我要用一个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
#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&&k
问题是,我做错了什么?我对所有值只得到0。此外,我的赋值状态是使用一个while循环。使用for(int i=0;i
而不在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;
}