我刚开始学习C ++的基础知识,我想开发一个程序,用户输入最小偏差角度,程序通过等边棱镜给出折射率。
但是,我很难以正确的方式将Radians转换为Degrees,因此我总是得到错误的答案。我想在5-6小时后进行头脑风暴,但我没有得到它。
这是代码(我使用的是Turbo C):
#include<iostream.h>
#include<conio.h>
#include<math.h>
int main()
{
int dm;
const float pi = 3.142;
float nu, d;
repeat: cout<<"Enter the angle of minimum deviation in degrees: ";
cin>>dm;
if(dm>=0 && dm<=180)
{
d = (pi/180)*dm;
nu = ((sin((60+d)/2))*2;
cout<<"The refractive index is "<<nu<<endl;
} else {
cout<<"Please enter an angle between 0 to 180 deg"<<endl;
goto repeat;
}
getch();
return 0;
}
因此,为了通过棱镜计算折射率,公式为Sin((A+dm)/2) ÷ Sin(A/2)
,其中A
是棱镜的角度(由于它是等边棱镜,它将是60度)和{{ 1}}是用户输入的偏差角度。
但是,我总是得到一些疯狂的答案。我已经将代码更改了100多次,但我仍然没有得到正确答案。
因此,为了简化,公式将变为dm
,因为棱镜的角度将为60度。
我犯了什么错误?
答案 0 :(得分:0)
你的数学公式是Sin((A + dm)/ 2)÷Sin(A / 2),A = 60度或π/ 3弧度。 Ok sin(A / 2)= 1/2,这部分很好。
但函数sin
需要一个以弧度表示的角度。正确的值是:
((60 + dm) / 2)
以度为单位或(((pi/3) + d) /2)
以弧度为单位。使用60 + d你会增加度数和弧度......给出错误的结果......
你的goto用法在这里并不合理,正如评论中所说,sin函数期望并返回double而不是浮点数。所以你应该以这种方式使用全精度:
#include<iostream.h>
#include<conio.h>
#include<math.h>
int main()
{
int dm;
const double pi = M_PI;
const double pi3 = pi / 3;
double nu, d;
for(;;) {
cout<<"Enter the angle of minimum deviation in degrees: ";
cin>>dm;
if(dm>=0 && dm<=180)
{
d = (pi/180)*dm;
nu = (sin((pi3+d)/2))*2; /* ok everything is radian */
cout<<"The refractive index is "<<nu<<endl;
break; /* exit from infinite loop */
} else {
cout<<"Please enter an angle between 0 to 180 deg"<<endl;
}
}
getch(); /* avoid that ! It is easier when running from IDE but it is ugly
Better use a breakpoint on next line. */
return 0;
}