使用Taylor方法C ++计算Pi并循环

时间:2016-07-02 19:47:49

标签: c++

pi的近似值可以使用下面给出的系列计算:

  

pi = 4 * [1 - 1/3 + 1/5 - 1/7 + 1/9 ... +(( - 1)^ n)/(2n + 1)]

编写一个C ++程序,用这个系列来计算pi的近似值。程序采用输入n确定pi的近似值中的项数并输出近似值。包含一个循环,允许用户重复计算新值n,直到用户说她或他想要结束程序。

预期结果是: 输入要近似的术语数(或退出为零): 1 使用1项近似为4.00。 输入要近似的术语数(或退出为零): 2 使用2项的近似值为2.67。 输入要近似的术语数(或退出为零): 0

我现在可以得到正确的结果,但我不知道如何包含一个允许用户重复计算新值n的循环,直到用户说她或他想要结束该程序。

#include <stdio.h>
#include <iostream>
#include <cmath>
using namespace std;

int main()
{ int n; double pi, sum; 
do { 
     cout << "Enter the number of terms to approximate (or zero to quit):" << endl;
     cin >> n;

if (n >0)
{

        double sum=1.0;
        int sign=-1;

    for (int i=1; i <=n; i++) {
    sum += sign/(2.0*i+1.0);
        sign=-sign;
    }
        pi=4.0*sum;

    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout.precision(2);

    cout << "The approximation is " << pi << " using "<< n << " terms" << endl;
}
} while(n>0);



    cout << endl;

   return 0;
}

2 个答案:

答案 0 :(得分:1)

初始化错误:

double sum=0.0;
int sign=1;

应该是

double sum = 1.0;
int sign = -1;

循环也是错误的(有拼写错误?),它应该是

for (int i = 1; i < n; i++) { /* please, notice "i < n" and "{"  */
    sum += sign / (2.0 * i + 1.0);
    sign = -sign; /* more readable, IMHO than  sign *=-1; */
}

pi = 4.0 * sum; /* you can well move it out of the loop */

编辑如果您想重复计算,通常的做法就是提供一项功能(不要将所有内容都塞进单个main ):

double compute(int n) {
  if (n < 0) 
    return 0.0;

  double sum = 1.0;
  int sign = -1;

  for (int i = 1; i < n; i++) { 
    sum += sign / (2.0 * i + 1.0);
    sign = -sign; /* more readable, IMHO than  sign *=-1; */
  }

  return 4.0 * sum;
}

编辑2 main功能可能是这样的:

int main() {
  int n = -1;

  /* quit on zero */
  while (n != 0) {
    cout << "Enter the number of terms to approximate (or zero to quit):" << endl;
    cin >> n;

    if (n > 0)
      cout << "The approximation is " << compute(n) << " using "<< n << " terms" << endl;
  }
}

答案 1 :(得分:0)

交替标志必须是你的循环的一部分。使用复合语句将其包含在循环体中:

for (int i=1; i <=n; i++) {
  sum += sign/(2.0*i+1.0);
  sign *=-1;
}