Objective c 目标C:计算器应用程序-currentNumber=currentNumber*10+;数字

Objective c 目标C:计算器应用程序-currentNumber=currentNumber*10+;数字,objective-c,xcode,calculator,Objective C,Xcode,Calculator,我正在读Stephen G.Kochan的《Objective-C编程》第四版。在这本书中,有一个为iPhone创建计算器应用程序的示例代码。我理解代码,至少90%的代码。-有一个分数类,它具有存储分数对象的方法,并描述如何执行不同的基本分数算术运算 -除此之外,还有一个计算器类,它根据用户是否尝试求和、除法等,从分数类运行适当的方法 当用户在界面中按下数字时,视图控制器具有以下方法: -(IBAction)clickDigit:(UIButton *)sender { int digit =

我正在读Stephen G.Kochan的《Objective-C编程》第四版。在这本书中,有一个为iPhone创建计算器应用程序的示例代码。我理解代码,至少90%的代码。-有一个分数类,它具有存储分数对象的方法,并描述如何执行不同的基本分数算术运算 -除此之外,还有一个计算器类,它根据用户是否尝试求和、除法等,从分数类运行适当的方法

当用户在界面中按下数字时,视图控制器具有以下方法:

-(IBAction)clickDigit:(UIButton *)sender {
int digit = sender.tag;     //sender or the argument inthis case is  the button

[self processDigit:digit];
}
如您所见,此方法现在被称为:

-(void) processDigit:(int)digit {
currentNumber = currentNumber * 10 + digit;

[displayString appendString:
 [NSString stringWithFormat:@"%i", digit]];
display.text = displayString;

}
我唯一的问题(可能是最简单的答案)是:为什么currentNumber总是乘以10?当编译器输入上述方法时,currentNumber的值始终为0(我使用XCode中的调试器验证了这一点),因此我不明白为什么我们必须将它乘以10。我确实删除了乘法运算,结果是不正确的,我只是不知道为什么


谢谢

想象你的计算器屏幕上有“123”,你想把它变成“1234”。如果它是一个字符串,你可以在末尾加上“4”,效果很好。但是它是一个整数,如果你在整数值上加4,你会得到127。所以你要做的是取123,乘以10得到1230,然后加上4得到1234。

也许思考这个问题的最好方法是举个例子

假设用户按顺序单击了以下数字:1、2。然后,假设代码正常工作,
currentNumber
的数值应该是12


现在想象一下用户下一次点击“3”。现在您希望值为123。您可以将上一个值(12)乘以10,然后再加上3。如果单击“4”,则该值应为1234,即10*123+4。等等。

调试器一定会误导您,就像它有时会误导您一样

考虑一下,如果去掉乘法会使结果出错,那么乘法显然会起作用

请仅为调试尝试以下操作:

int lastCurrentNumber = currentNumber;
currentNumber = 10 * lastCurrentNumber + digit;

现在,在调试程序中,检查
lastCurrentNumber
currentNumber
digit
的值,逐步执行这两条语句。

使用
*10
在十进制数的各个位置(十位、百位等)移动数字

这是一种避免使用数组的“黑客”。其他计算器应用程序将数字“弹出”和“推送”到一个数组中,这允许更强大的操作以及对非十进制数字(二进制、十六进制等)的操作

iTunesU上的免费iOS开发课程包括一个使用数组的计算器应用程序。如果要比较差异,可以在此处下载源代码:


它还有一个分数对象,但不使用
*10
方法。

很好!我现在明白了。谢谢。我的大脑在想那些方法只会被调用一次分子和一次分母。我没有考虑使用整数而不是字符串的限制,并且忘记了这样一个事实,即每个被按下的数字实际上都会调用这些方法,不是只对每个操作数的分母和分子进行一次运算。我实际上忘记了使用整数而不是字符串的限制,忘记了对每个被按下的数字调用方法的事实,每个操作数的分母和分子不只是一次。当使用调试器进行测试时。在最初测试时,我必须只输入一位数的分子和分母(我意识到这是我自己犯的一个愚蠢的错误)。谢谢你的帮助!非常感谢。我现在明白了,也意识到我测试得还不够。我还忘了iTunes U的视频,我很快就要退房了。