我正在研究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 - 请注意它将它们放在一起..
这是完成的计算,这是错误的..如果字符串显示运算符 - 是小数问题我应该使用NSRange吗?
答案 0 :(得分:1)
按下相应按钮后,您将尝试执行每个算术运算。如果你考虑一下,你会发现这不可能是正确的:例如,如果用户试图做12 + 34,所有计算器都知道何时按下“+”是它需要添加某事到12。
现在,如果您正在使用构建计算器教程,那么几乎可以肯定无论是谁编写它都有解决方案,您应该遵循这一点,因为如果您尝试以不同的方式执行它,那么它将会令人困惑。但这就是我要做的。有一个简单的版本和一个更复杂的版本。
这是简单的版本。
仅记住一个当前正在显示的数字是不够的。假设你到目前为止已经按下了:1 2 + 3
。计算器需要知道(1)你输入了数字12,(2)你要求它添加到某个东西,以及(3)你输入的是另一个数字,到目前为止已经达到{{1 }}。 (它可能变成345或者什么。)
因此,计算器的状态包括以下三件事。 (1)按下操作键或“=”时显示的最后一个完整值。 (或者如果您最近按下清除按钮,则为0。)(2)按数字按钮,当前正在构建的值。 (3)按下最后一个操作键。 (或者如果您按下“=”或清除按钮,则“无操作”。)
所有这一切的重点在于,这正是计算器为了完成您所要求的而需要的信息。我不会详细介绍,因为当你按下每个可能的钥匙时,你可以找出状态如何变化,这对你的灵魂是有好处的。
如果你做了这一切,你会发现有些情况下计算器可能没有做你想要的,即使代码中没有错误。假设你输入12 + 34 * 56。在算术书籍,计算机软件和更昂贵的计算器中,这意味着12 +(34 * 56)而不是(12 + 34)* 56,因为乘法具有比加法更“优先”。以我上面描述的方式实现的计算器将以另一种方式执行并计算(12 + 34)* 56。如果这让你感到困扰,你可以让计算器“正确地”做到 - 但它会更加复杂,至少我暂时强烈建议你不要打扰。