1

我正在研究 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 - 注意它把它们放在一起..

完整输入字符串 1.11+2.22 的屏幕截图

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

计算完成截图二

4

1 回答 1

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。如果这让您感到困扰,您可以让计算器“正确地”执行它——但这会复杂得多,至少目前我强烈建议您不要打扰。

于 2012-04-29T19:30:07.360 回答