2013-07-03 2 views
0

Возможно, это глупый вопрос, но теперь я изучаю Objective C, и я пытался расширить свое знание, изучая ошибки.Возврат списка чисел из цикла внутри функции

Поэтому я попытался адаптировать сито Эрастостфена к функции. Я понимаю, что когда функция получила результат, который определяет функцию для остановки.

Мне любопытно, если это способ адаптировать код, который возвращает i, чтобы отправить список всех чисел, как указано в NSLog (@ «Prime number% i», 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);'? Где возвращаемое возвращаемое значение является массивом 'NSNumbers' wrapping' int ', которые являются первичными? –

+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

спасибо Krumelur, хороший урок! –

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]; 

Чтобы напечатать все простые числа, вы можете использовать Еогеасп конструкцию:

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; 
}