我一直在观看斯坦福CS193P讲座,我一直在研究作业计算器。我很轻松地完成了第一项任务,现在我正在努力为任务做额外的工作。然而,我陷入了一个额外的信用问题:
实现一个用户界面,用于选择sin()或cos()的操作数是否为 考虑弧度或度数。当您在C库中调用sin(x)时,假定为x 以弧度为单位(即0到2π绕圆圈一次),但用户可能想要 输入180并按下sin按钮得到0而不是-0.8012(这是正弦值) 180弧度)。您可以使用UIButton来切换titleLabel 每次按下UIButton时都会显示文本,但更好的方法是查看是否可以 通过阅读文档弄清楚如何使用UISwitch(如果你敢!)。
我实现了一个UISwitch并将其作为IBOutlet连接起来。当我执行'操作'时,我检查开关是打开还是关闭,并将其传递给我的模型以及要执行的操作。在我的罪恶和成本案例中,我做了以下事情:
else if ([operation isEqual:@"sin"])
{
if (radians) {
operand = sin(operand);
}
else {
operand = sin(operand) * (180 / M_PI);
}
}
// similar for cos
如果radians
(这是BOOL:YES =弧度,没有=度),那么我通常执行操作;如果用户将开关置于'度',我想以度为单位返回值,因为赋值声明:用户可能想要输入180并按下sin按钮并获得0而不是-0.8012(这是正弦180弧度)。
但是,此代码并不完全有效。当我将切换到度数并执行sin 180
时,它返回的值大于或等-45
。那里出了点问题;而且我不确定是什么。我已经查找了如何进行转换,我认为我做得对,但显然没有。
我意识到这可能更适合math.stackexchange,但由于我想发布一些代码,我把它放在这里。有人可以就实施此方法的最佳方式提供一些建议吗?已经有一段时间了,因为我甚至使用过cos或sin,弧度和度数。
谢谢!
答案 0 :(得分:8)
你的意思是operand = sin(operand * M_PI / 180);
吗?
答案 1 :(得分:3)
试试这个 - 它对我有用:
if ([operation isEqual:@"sin"])
{
operand = (operand * M_PI/180); // first convert the operand from radians to degrees then perform the operation
operand = sin(operand);
}
希望这有帮助
答案 2 :(得分:1)
你在哪里定义操作数?
你确定operand
是CGFloat而不是内存地址吗?
您如何格式化输出?如果您使用%e,它将以科学记数法输出...尝试执行%f
答案 3 :(得分:1)
operand = sin(operand * (M_PI/180));
答案 4 :(得分:0)
你试过吗
sin( operand ) / 180.0 * M_PI