Obj-C计算器 – 弧度度数

我一直在看斯坦福大学的CS193P讲座,我一直在做计算器。 我很轻松地完成了第一个任务,现在我正在努力为这个任务做额外的功劳。 然而,我被困在额外的信用问题之一:

实现一个用户界面来selectsin()或cos()的操作数是否被认为是弧度或度数。 当你在C库中调用sin(x)时,x被假定为弧度(即0到2π围绕圆圈一次),但是用户可能想要input180并按下sinbutton而得到0而不是-0.8012 (这是180弧度的正弦)。 你可以使用一个UIButton来实现这个function,每次按下UIButton的时候都会把titleLabel的文本转换出来,但是更好的办法是通过阅读文档(如果你敢的话)来看看如何使用UISwitch。

我实现了一个UISwitch,并把它作为一个IBOutlet连接起来。 当我执行“操作”时,我检查开关是否打开或closures,并将其传递给我的模型以及执行的操作。 在我的罪和案件中,我做了以下几件事:

else if ([operation isEqual:@"sin"]) { if (radians) { operand = sin(operand); } else { operand = sin(operand) * (180 / M_PI); } } // similar for cos 

如果radians (BOOL:YES =弧度,no =度数),那么我会像往常一样执行操作; 如果用户把开关置于'度',我想以度数返回值,如赋值状态: 用户可能想要input180,然后按sinbutton,得到0而不是-0.8012(这是180的正弦弧度)。

但是,这段代码不能完全工作。 当我把开关转到度数sin 180度时,它会返回一个或多或less的值-45 。 有什么地方是错的; 我真的不知道是什么 我已经看了如何做转换,我认为我做对了,但显然不是。

我意识到这可能更适合math.stackexchange,但由于有一些代码,我想发布我把它放在这里。 有人可以提供一些build议,以实现这个最好的方式? 我甚至用cos或sin,弧度和度数工作了一段时间。

谢谢!

你在哪里定义操作数?

你确定operand是一个CGFloat而不是一个内存地址?

你如何格式化你的输出? 如果您使用%e,则会以科学计数法输出…尝试执行%f

你可能是指operand = sin(operand * M_PI / 180);

试试这个 – 对我有用:

  if ([operation isEqual:@"sin"]) { operand = (operand * M_PI/180); // first convert the operand from radians to degrees then perform the operation operand = sin(operand); } 

希望这可以帮助

 operand = sin(operand * (M_PI/180)); 

你试过了吗

 sin( operand ) / 180.0 * M_PI 
Interesting Posts