我是编程的完全初学者,我获得了以下任务:
编写一个C ++程序,使用一系列内切和外接的正多边形来计算一对π的估计。在不超过30步之后停止,或当外接和内接多边形的周长之间的差小于ε= 10 -10的容差时。您的输出应该有三列,用于边数,内接多边形的周长和外接多边形的周长。对于最后两列,在小数点后显示14位数。
好吧,我决定使用cos定律来找到多边形边长,但是当我测试我的程序时,我意识到了这条线: a = cos(360 / ngon); 继续给我零作为输出,使其他一切也为零,我不知道有什么不对请帮助。 附:对不起,如果程序看起来很草率,我真的很擅长这个。
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>
#include <cmath>
using namespace std;
int main()
{
char zzz;
int ngon = 3, a, ak;
double insngon = 0.0;
double cirngon = 0.0;
cout << "Number of Sides" << "\t\t\t" << "Perimeter of insribed region" << "\t\t\t" << "Perimeneter of circumscribed polygon" << "\t\t" << "\n";
while (ngon <= 30)
{
a = cos(360 / ngon);
ak = pow(.5, 2) + pow(.5, 2) - 2 * .5*.5*a;
insngon = (ak*ngon);
cirngon = (ak / (sqrt(1 - pow(ak, 2))));
cout << fixed << setprecision(14) << ngon << " " << insngon << " " << cirngon << endl;
ngon++;
if (cirngon - insngon <= pow(10.0, -15));
cin >> zzz;
return 0;
}
cout << "\nEnter any character and space to end ";
cin >> zzz;
return 0;
}
答案 0 :(得分:2)
一个问题是您声明了整数,但是您在cos
的调用中使用了它们:
int ngon = 3, a, ak;
//...
a = cos(360 / ngon);
由于a
是一个整数,因此cos
(类型为double
)的返回值将被截断。此外,由于ngon
是整数,360 / ngon
也会截断。
修复方法是a
为double
,并将360.0
除以ngon
以防止截断:
int ngon = 3, ak;
double a;
//...
a = cos(360.0 / ngon);
正如评论中指出的那样,另一个问题是C ++中的三角函数使用弧度作为参数,而不是度。您需要将参数更改为以弧度为单位的等效值。
另一个问题是您使用pow
来计算不变的值。不需要引入不必要的函数调用来计算常量值。只需定义常量并使用它们。
例如:
const double HALF_SQUARED = 0.25
const double EPSILON_VALUE = 10.0e-15;
然后使用HALF_SQUARED
和EPSILON_VALUE
代替对pow
的调用。
此外,pow
本身就是一个浮点函数,因此可能会产生不完全as is discussed by this question的结果。因此,pow(ak, 2)
应该只用ak * ak
替换。
答案 1 :(得分:0)
使用float a;
(或加倍)代替int a。
这里a的返回类型是int 并计算
a = cos(360/ngon)
相当于a = cos(120),即cos(120)的结果是0.8141并且是整数类型&#34; a&#34;只存储它的整数部分。
因此&#39; a&#39;将为0并丢弃浮动值。
也可以使用double ak;
代替int ak;
。
因为这里使用的pow功能有返回类型&#39; double&#39;