2013-07-03 46 views
0

也許這是一個愚蠢的問題,但現在我學習了Objective C,並試圖擴展我的知識庫,通過錯誤學習。從函數內的循環中返回數字列表

所以我試圖調整Erastosthenes的Sieve是一個函數。我明白,當一個功能收到一個結果時,就決定了停止的功能。

我很好奇,如果它是一種方法來適應返回我發送所有數字列表中的NSLog(@「素數%i」,我)的代碼。在一種方式來執行功能多次

由於

我的代碼

#import <Foundation/Foundation.h> 

int erathos (int n) 
{ 


int i, prime, multiple, P[n]; 

    for (i = 2; i <= n; ++i) 
    { 
    P[i] = 1; 
    } 

for (prime = 2; prime <= n; ++prime) 
{ 
    if (P[prime]) 

    for (multiple = 2 * prime; multiple <= n; multiple += prime) 
    { 


     if (P[multiple]) { 

      P[multiple] = 0; 

     } 
    } 
} 

for (i = 2; i <= n; ++i) 
{ 
    if (P[i]) 
    NSLog(@" Prime number %i", i); 

} 
return i; 

} 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     int erathos (int n); 
     NSLog(@"Erathos %i", erathos (150)); 
    } 
    return 0; 
} 
+0

你可以修復格式化/縮進嗎? –

+0

你想要什麼類型的功能?像'NSArray * erathos(int n);'?返回返回值是否是包含'prime'的'NSNumbers'數組? –

+0

我需要一個簡單的c數組。 –

回答

0

NSArray數據類型是在Objective-C基本陣列類型。 NSMutableArray表示可變數組類型。數組只能存儲對象,而不是原始類型,如int,因此在添加到數組之前,項目需要轉換爲NSNumber對象。

#import <Foundation/Foundation.h> 

NSArray* erathos (int n){ 
    int i, prime, multiple, P[n]; 
    for (i = 2; i <= n; ++i) { 
     P[i] = 1; 
    } 

    for (prime = 2; prime <= n; ++prime) { 
     if (P[prime]) { 
      for (multiple = 2 * prime; multiple <= n; multiple += prime) { 
       if (P[multiple]) { 
        P[multiple] = 0; 
       } 
      } 
     } 
    } 

    NSMutableArray* array = [NSMutableArray array]; 
    for (i = 2; i <= n; ++i) { 
     if (P[i]) { 
      [array addObject:[NSNumber numberWithInt:i]]; 
     } 
    } 
    return array; 

} 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     // To format any object, use the '@' type specifier. 
     NSLog(@"Erathos %@", erathos (150)); 
    } 
    return 0; 
} 
+0

謝謝克魯梅爾,好教訓! –

0

按我的意見,函數的聲明看起來應該像:

NSArray* erathos(int n); 

注意的NSArray是不變,這意味着,一旦它已經創造了你不能改變它。如果你想添加值,你需要它的可變子類NSMutableArray。

創建一個空的NSMutableArray有:

NSMutableArray *primesArray = [NSMutableArray array]; 

爲了將整數添加到它,使用

[primesArray addObject:[NSNumber numberWithInt:i]]; 

然後返回它的一個不可改變的副本,使用:

return [NSArray arrayWithArray:primesArray]; 

注你可以返回NSMutableArray,但是被調用者可能會改變它,這可能是不可取的。

可變數組和不可變副本都是自動釋放的,因此噹噹前autoreleasepool耗盡時它們將被釋放。爲了讓他們抓住,你需要留住他們是這樣的:

[myObject retain]; 

要打印所有的素數,你可以使用一個foreach結構:

for (NSNumber *n in primesArray) { 
    NSLog(@"Prime number: %i", [n intValue]); 
} 
0

我適應克魯梅爾爾解決方案添加新NSArray的參數。這樣就可以使用NSArray索引中的每個對象。

#import <Foundation/Foundation.h> 

NSArray* erathos (NSMutableArray* array, int n){ 
int i, prime, multiple, P[n]; 
for (i = 2; i <= n; ++i) { 
    P[i] = 1; 
} 

for (prime = 2; prime <= n; ++prime) { 
    if (P[prime]) { 
     for (multiple = 2 * prime; multiple <= n; multiple += prime) { 
      if (P[multiple]) { 
       P[multiple] = 0; 
      } 
     } 
    } 
} 


for (i = 2; i <= n; ++i) { 
    if (P[i]) { 
     [array addObject:[NSNumber numberWithInt:i]]; 
    } 
} 
return array; 

} 

int main(int argc, const char * argv[]) 
{ 

@autoreleasepool { 

    NSMutableArray* myArray = [NSMutableArray array]; 


    NSLog(@"Erathos %@", erathos (myArray,150)); 

    NSLog(@"myArray objectAtIndex 5 is is %@", [myArray objectAtIndex: 5]); 






} 
return 0; 
}