2010-01-16 70 views
0

我會快速的:我有一個iPhone OS 3.1.2的應用程序,它可以減少分數。我有4個網點:分數縮減器應用程序的問題

  1. oTop和oBottom:兩個UITextFields,代表originalTop和originalBottom。
  2. rTop和rBottom:兩個UILabels,代表reducedTop和reducedBottom。

這裏是我使用的代碼:

- (IBAction爲)減少{

int numerator = [[oTop text] intValue]; 
int denominator = [[oBottom text] intValue]; 
if (denominator > 0) { 
    NSMutableArray *factors1 = [[NSMutableArray alloc] init]; 
    NSMutableArray *factors2 = [[NSMutableArray alloc] init]; 
    int factors1length; 
    int factors2length; 
    for (int i = 1; i < ceil(sqrt(numerator)); i ++) { 
     [factors1 addObject:[NSString stringWithFormat:@"%@", i]]; 
     if (round(numerator/i) != numerator/i) { 
      [factors1 removeLastObject]; 
     } else { 
      factors1length ++; 
     } 
    } 
    for (int i = factors1length; i <= 0; i --) { 
     [factors1 addObject:[NSString stringWithFormat:@"%@", (numerator/[[factors1 objectAtIndex:i] intValue])]]; 
    } //End get numerator factors 
    for (int i = 1; i < ceil(sqrt(denominator)); i ++) { 
     [factors2 addObject:[NSString stringWithFormat:@"%@", i]]; 
     if (round(denominator/i) != denominator/i) { 
      [factors2 removeLastObject]; 
     } else { 
      factors2length ++; 
     } 
    } 
    for (int i = factors2length; i <= 0; i --) { 
     [factors2 addObject:[NSString stringWithFormat:@"%@", (denominator/[[factors2 objectAtIndex:i] intValue])]]; 
    } //End get denominator factors 
} 

}

很抱歉的雜散線。 無論如何,有人能告訴我發生了什麼事嗎? 當我啓動時,在兩個文本字段中輸入一個大於0的數字,然後按下「減少」按鈕,應用程序崩潰。 請幫幫忙,

HiGuy

編輯:改變了第一和第三從環路(INT I = 0(INT I = 1

回答

3

看起來像第一的-i循環,我從0開始,並將其劃分爲i(其是零)

編輯:。有一個問題除以零,這導致最初碰撞和其他幾個人之前之後以及

  1. 在第一個循環中,使用@「%@」完成addObject,但這需要是@「%d」,因爲我是一個不是字符串的整數。見String Format Specifiers

  2. 因子1的長度和因子2的長度需要被初始化爲零,否則它們將以隨機值開始,這會拋出其餘的代碼。

  3. 因爲您嘗試在那裏使用浮點值(分子/ xxx ...),所以第二個循環中的addObject需要使用@「%f」而不是@「%@」。但是,將數組作爲字符串存儲的方法存在問題。首先,你存儲一些整數和一些浮點數。堅持一種類型。其次,最好將數字存儲爲數字,而不是轉換爲字符串和數字。您可以通過將它們轉換爲NSNumber對象來將ints/float存儲在NSMutableArray中。

如果您還沒有這樣做的話,請通過一行代碼採取cdespinosa的建議和步驟在調試程序時,看到什麼值的變量已經和正在執行什麼代碼。

我也建議不要試圖把太多的邏輯放入一行。例如,第二個循環中的addObject行太多,很難看到問題。 通過聲明局部變量來存儲行內表達式的值來分解它。
因此,而不是這樣的:

[factors1 addObject:[NSString stringWithFormat:@"%@", (numerator/[[factors1 objectAtIndex:i] intValue])]]; 

寫這樣的:

int iFactor = [[factors1 objectAtIndex:i] intValue]; 
float value = (numerator/iFactor); 
NSString *newFactor = [NSString stringWithFormat:@"%@", value]; 
[factors1 addObject:newFactor]; 

這將使它更容易調試。

+0

感謝您的幫助,但它仍然崩潰。還有更多問題嗎? (除了第三個for循環) – 2010-01-16 18:02:16

+1

您是否曾嘗試在方法開始時設置斷點,逐步執行代碼,查看執行時局部變量的值,並注意它崩潰的行? – cdespinosa 2010-01-16 23:19:03

+0

不知道你是否已經在遵循cdespinosa的好建議之後解決了這個問題,但我很快就會在代碼中發現更多問題。 – DyingCactus 2010-01-17 03:29:17

1

您可能需要查看Euclid's algorithm以找出兩個整數的最大公約數。它比保理要快得多(甚至更容易編碼)。維基百科文章中有示例實現。