2

我在我的大学里上 C++ 入门课。我们被分配了一个项目来创建一个程序来使用一个系列来近似 pi,其中 pi=summation ((-1)^i+1)*(4/2i-1)。

我需要我的输出看起来像这样:

该程序使用 n 项级数展开来近似 pi。
输入n的值> 6
pi[6] = 4[1-1/3+1/5-1/7+1/9-1/11] = 2.9760461760417560644

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

using namespace std;

int main()
{
int numOfTerms;
cout <<"This program calculates pi using an n-term series expansion."<<endl;
cout <<"Enter the value for n>";
cin >>numOfTerms;

if (numOfTerms<=0)
    cout <<numOfTerms<<"is an invalid number of terms."<<endl;
else
{
    cout <<"pi["<<numOfTerms<<"] = ";
    int i;
    for (i=1; i<=numOfTerms; i++)
    {   
        double pi, sum, firstTerm, secondTerm;
        firstTerm=pow(-1,(i+1));
        secondTerm=1/(2*i-1);
        pi=firstTerm*secondTerm;
        {
            if (pi <= 4)
                cout <<firstTerm<<"/"<<secondTerm;
            else
                cout <<"You have a C++ math error.";
        }
        sum=sum+(4*pi);
        cout <<" = "<<sum<<endl;
    }   
}
return 0;
}   

我有一个早期版本的代码可以正确总结 n 系列近似值,但它不显示等于总和的扩展系列。

我当前的版本不显示校正总和,但它在屏幕上显示 pi[n] n 次,超过 n 行。

我愿意尝试自己计算项目的大部分内容,我只需要知道是否有办法让循环的输出显示在一行上,而不是每次迭代都显示在自己的行上。

4

3 回答 3

4

不要使用endl,你的工作就会完成。

结束

插入换行符并刷新流。

它的行为等价于调用 os.put('\n')(或 os.put(os.widen('\n')) 用于其他字符类型),然后调用 os.flush()。

于 2013-10-04T19:25:45.847 回答
2

三件事:首先,将您对 secondTerm 的计算更改为以下内容:

secondTerm=1.0/(2*i-1);

这样,您将强制它为双精度(否则,它将返回一个 int,这是我们不想要的)。其次,改变这一行:

cout <<firstTerm<<"/"<<secondTerm;

对于这一行:

cout <<pi;

那是因为 secondTerm 持有除法的结果,而不是分母。

第三,移动这一行:

cout <<" = "<<sum<<endl;

for循环之后,因为它会打印最终结果,您将在对所有项求和后执行此操作。将那条线放在for中会导致换行符。如果你这样做,你需要移动这条线:

double pi, sum, firstTerm, secondTerm;

for循环之前,因此 sum 变量之后继续存在。

如果您执行所有这些操作,该程序将正常工作(尽管它会打印所有术语,它们之间没有任何空格)。

于 2013-10-04T19:36:59.377 回答
1

不要使用endl. 这会导致换行。

于 2013-10-04T19:24:10.120 回答