【问题标题】:iPhone calculator tutorial help, decimal style..againiPhone计算器教程帮助,十进制样式..再次
【发布时间】:2012-04-29 02:16:13
【问题描述】:

我正在编写 iPhone 计算器教程,但遇到了数字显示问题。

计算器屏幕将第二个输入的操作数(数字)“打印”在第一个操作数旁边,从而导致一些错误的计算,因为 currentNumber 输入了这个字符串。

我怎样才能让数字甚至运算符(+、-、*、/)全部显示出来并仍然正确执行计算?

- (IBAction)pressedDecimal:(id)sender {
    calculatorScreen.text = [calculatorScreen.text stringByAppendingString:@"."];
}
- (IBAction)pressedDigit:(id)sender  {
    calculatorScreen.text = [calculatorScreen.text stringByAppendingFormat:@"%d", [sender tag]];
    currentNumber = [calculatorScreen.text floatValue];
}
- (IBAction) pressedOperation: (id) sender {
    if (currentOperation == 0) result = currentNumber;
    else {
        switch (currentOperation) {
            case 1:
                result = result + currentNumber;
                break;
            case 2:
                result = result - currentNumber;
                break;
            case 3:
                result = result * currentNumber;
                break;
            case 4:
                result = result / currentNumber;
                break;
            case 5:
                currentOperation = 0;
                break;
        }
    }
    currentNumber = 0;
    calculatorScreen.text = [NSString stringWithFormat:@"%g", result];
    if ([sender tag] == 0) result = 0;
    currentOperation = [sender tag];
}

好的,这是一个完全输入的字符串 1.11+2.22 - 注意它把它们放在一起..

这是完成的计算,这是错误的..id 喜欢让字符串显示运算符 - 我应该使用 NSRange 解决小数问题吗?

【问题讨论】:

  • 您能否分享打印错误计算的屏幕快照(cmd+shift+4)。从pressdigit:方法currentNumber=[calculatorScreen.text floatValue];改成currentNumber=[[calculatorScreen text] floatValue];的代码行
  • 即使我对这一行也有疑问calculatorScreen.text = [calculatorScreen.text stringByAppendingString:@"."];

标签: objective-c ios xcode math xcode4.2


【解决方案1】:

一旦按下相应的按钮,您就会尝试执行每个算术运算。如果你想一想,你会发现这不可能是对的:例如,如果用户尝试做 12+34,那么计算器所知道的只是它需要添加 某事到 12 点。

现在,如果您正在学习构建计算器教程,那么几乎可以肯定,编写它的人对此有解决方案,您应该遵循这一点,因为如果您尝试以不同的方式进行操作,那么它会令人困惑。但这就是我要做的。有一个简单的版本和一个更复杂的版本。

这是简单的版本。

仅仅记住一个数字,即当前显示的数字是不够的。假设您到目前为止按下了:1 2 + 3。计算器需要知道 (1) 您输入了数字 12,(2) 您要求它将其添加到某个东西,以及 (3) 您正在输入另一个数字并且到目前为止已经到达 3 . (它可能会变成 345 或其他东西。)

因此,计算器的状态由以下三项组成。 (1) 按下操作键或“=”时显示的最后一个完整值。 (如果您最近按下清除按钮,则为 0。) (2) 当前通过按下数字按钮构造的值。 (3) 最后按下的操作键。 (如果您最近按下“=”或清除按钮而不是其中之一,则为“无操作”。)

所有这一切的重点在于,这正是计算器执行您所要求的操作所需的信息。我不会详细介绍,因为你可以弄清楚当你按下每个可能的键时状态如何变化,这对你的灵魂有好处。

如果您执行所有这些操作,您会发现在某些情况下计算器可能无法执行您想要的操作,即使代码中没有错误也是如此。假设您输入 12+34*56。在算术书籍、计算机软件和更昂贵的计算器中,这意味着 12+(34*56) 而不是 (12+34)*56,因为乘法比加法具有“更高的优先级”。以我上面描述的方式实现的计算器将以另一种方式执行并计算 (12+34)*56。如果这让您感到困扰,您可以让计算器“正确”执行 - 但它会复杂得多,至少目前我强烈建议您不要打扰。

【讨论】:

  • 我回家后终于有机会读到这篇文章。一如既往,我很欣赏你的教学动力,而不是简单地幽默这个问题。我也有同样的想法,因为我为计算器编写了代码,将分子与分母、操作数 1、2 等分开。本教程来自某个“Geeky Lemon”。我相信这个遍布网络的代码并不是为了使用小数点而设计的,而只是一个简短的甜蜜演示。我计划今晚用我学到的东西重新写它。从声明操作数 ,2 等开始,为操作显示一个字符..
  • 等等,而不是在论坛上添加另一个问题(我知道它,实际上不确定是否存在) - 但我可以给你发消息吗?我想让你终于知道我是怎么做到的,并收到任何批评我是如何得到这个的?
  • 祝你好运!如果您想通过 SO 与我联系,我的电子邮件地址在我的用户信息中。我在回复电子邮件方面很垃圾,所以如果回复缓慢或不存在,请不要把它当作个人。
  • 明白了...我认为垃圾邮件的涌入阻止了人们现在甚至检查它...除非您坚决检查重要的东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 2019-09-22
相关资源
最近更新 更多