2013-07-03 47 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; 
}