程序的输出总是'0'?

时间:2017-11-22 17:01:15

标签: c++ loops casting

我想找到以下系列的第n个词的总和:

(1/2)+((1 * 3)/(2 * 4))+((1 * 3 * 5)/(2 * 4 * 6))....

所以,我用c ++编写了以下程序:

#include <bits/stdc++.h>
#include <conio.h>
using namespace std;
int main()
{
int p=1, k=1, n=0;
float h=0;
cout<<"Enter the term: ";
cin>>n;
for(int i=1; i<=n; i++)
{
    for(int j=1; j<=i; j++)
    {
        p*=((2*j)-1);
        k*=(2*j);
    }
    h+=(p/k);
    p=1;
    k=1;

}
cout<<"The sum is : "<<h;
return 0;
getch();

}

然而,程序的输出总是给我'0'。我无法弄清楚程序的问题。

N.B。我是编程新手。

2 个答案:

答案 0 :(得分:0)

此处的问题是,您尚未将pk声明为floatdouble,或者在计算和分配给{{{ 1}}。

由于hp < k都被声明为pk,因此循环int的每次迭代(问题的性质)都会发生什么事情。 }。所以你只需要为每次迭代求和0。

p / k = 0p声明为kfloat或执行此操作:

double

此外,对于这个特定的问题,我假设你正在寻找精确度,所以要小心并同时研究Should I use double or float?

答案 1 :(得分:0)

隐式转换和类型转换是所有新手都陷入困境的陷阱。 在指示中:

h += p/k;

编译器首先执行整数除法,然后将结果提升为浮点类型。 从那时起:

p < k ; for all i,j < n

然后:

res = (p / k) < 1 => truncates to 0;  // by integer division

因此:

sum(1->n) of p/k = sum (1->n) 0 = 0;

最后:

h = conversion to float of (0) = 0.0f;

这就是为什么你最后得到0.0f的结果。

解决方案:

1-首先,你需要使用自然类型作为c ++的浮点数,这是&#34; double&#34; (在引擎盖下c ++将float提升为double,所以直接使用它。)

2-将所有变量声明为double,除了术语数n:

3-术语数量永远不会为负数,您需要在代码中将其声明为无符号整数。

4-如果你做第3步,一定要抓住溢出错误,也就是说,如果用户输入一个负数,那么在&#34; n&#34;中排除一个非常大的数字的风险,驱逐:n = - 1转换为0xffffffff正数。

5-设计你的代码有时会更好。

6-仅包含您需要的标头,并避免在全局命名空间中导入任何名称空间。

以下是我认为您应该编写程序的方式。

#include <iostream>

double sum_serie(unsigned int n)
{
    double prod = 1.0, sum = 0.0;
    for (double c=1; c<=n ; c++)
    {
         prod *= ( ( 2*c ) - 1 ) / ( 2*c ); // remark the parenthesis
         sum += prod;
    }
    return sum;
}

int main()
{
    unsigned int n = 0;
    int temp = 0;
    std::cout << " enter the number of terms n: ";
    std::cin  >> temp;
    if (temp > 0) 
        n = temp; // this is how you catch overflow
    else
    {
        std::cout << " n < 0, no result calculated " << std::endl;
        return 0;
    }
    std::cout << " the result is sum = " << sum_serie(n) << std::endl;
    return 0;
}

我知道问题是关于C ++中的隐式转换和转换,但即使编写代码的方式也可以向您展示它中存在的错误,因此请尝试学习将您的想法表达为代码的正确方法,之后调试很自然。

祝你好运