2012-07-01 19 views
2

我在閱讀「Programming in Objective-C」4th Ed。由Stephen G. Kochan提供。在本書中,有一個用於爲iPhone創建計算器應用程序的示例代碼。我理解代碼,至少有90%。 - 有一個分數類,它有方法來存儲分數對象,並描述如何執行不同的基本分數算術運算。 - 除此之外,還有一個計算器類,它從Fraction類運行適當的方法,這取決於用戶試圖總結,劃分等目標C:計算器應用程序 - currentNumber = currentNumber * 10 +數字;

視圖控制器具有當用戶按下界面中的號碼下面的方法:

-(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.我沒有刪除該乘法並且結果不正確,我只是不明白爲什麼呢。

謝謝

回答

2

也許最好的方法想想這是一個例子。

想象用戶點擊爲了以下數字:1,2。然後,假設代碼工作,的currentNumber的數值應12.

現在想象用戶上「3」下次點擊。現在你想要的值是123.你可以通過乘以前一個值(12)乘以10然後加上3.如果他們然後點擊'4',該值應該變爲1,234,這通過10 * 123 + 4.依此類推。

+0

不錯!我現在明白了。非常感謝。我的腦子在想,這些方法只會被分子調用一次,而分母只會被調用一次。我沒有考慮使用整數而不是字符串的限制,並且忘記了這樣一個事實,即實際上每個被按下的數字都會調用這些方法,而不是一次用於分母和一次用於每個操作數的分子。 – AlexUseche

1

想象一下你的計算器有「123」在屏幕上,你希望把它變成「1234」。如果它是一個字符串,你可以添加「4」到最後,它工作正常。但是它是一個整數,如果你給整數值加4,你得到127.所以你要做的是取123,乘以10給你1230,然後加4得到1234.

1

調試器必須是誤導你,因爲它有時做。

認爲,如果採取乘出,使結果錯誤的,那麼乘法顯然做一些事情!

請嘗試以下僅用於調試:

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

現在在調試器檢查lastCurrentNumbercurrentNumberdigit值,你通過這兩個語句步驟。

+0

我其實是忘記了使用整數而不是字符串的limitiation並忘記了一個事實,即實際的方法被調用爲每一個被按下時,不只是一次爲分母,一旦爲每個操作數的分子位數。使用調試器進行測試時。在開始測試時我必須輸入唯一的數字分子和分母(我認爲這是我的一個愚蠢的錯誤)。感謝您的幫助! – AlexUseche

1

*10用於通過十進制數(十位,百位等)

這類型的「黑客」,以避免使用數組的各個地方移動數字。其他計算器應用程序將「彈出」和「推」數字放到一個數組上,這允許更強大的操作以及非十進制數字的操縱(二進制,十六進制等)

iTunes U上的免費iOS開發課程包括一個使用數組的計算器應用程序。如果您想比較的差異,您可以在這裏下載源代碼:

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/

它也有一個Fraction對象,但不使用*10方法。

+0

謝謝!我現在明白了,也意識到我沒有足夠的測試。我也忘了iTunes U的視頻,我將盡快檢查。 – AlexUseche