Помощь с массивами в Objective C - PullRequest
0 голосов
/ 23 мая 2010

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

Например:

110

Should give the following o/p : 

one
one 
zero

Может ли кто-нибудь пролить свет на эффективное использование массивов для этой проблемы?

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int input, i=0, j,k, checkit;
    int temp[i];

    NSLog(@"Enter an integer :");
    scanf("%d", &input);
    checkit = input;

    while(input > 0)
    {
        temp[i] = input%10;
        input = input/10;
        i++;
    }

    if(checkit != 0)
    {
    for(j=i-1;j>=0;j--)
    {
        //NSLog(@" %d", temp[j]);
        k = temp[j];
        //NSLog(@" %d", k);

        switch (k) {

            case 0:
                NSLog(@"zero");
                break;
            case 1:
                NSLog(@"one");
                break;
            case 2:
                NSLog(@"two");
                break;
            case 3:
                NSLog(@"three");
                break;
            case 4:
                NSLog(@"four");
                break;
            case 5:
                NSLog(@"five");
                break;
            case 6:
                NSLog(@"six");
                break;
            case 7:
                NSLog(@"seven");
                break;
            case 8:
                NSLog(@"eight");
                break;
            case 9:
                NSLog(@"nine");
                break;

            default:
                break;
        }

    }
    }
    else
        NSLog(@"zero");

    [pool drain];
    return 0;
}

Ответы [ 3 ]

2 голосов
/ 23 мая 2010

Есть несколько способов достичь того, что вы хотите. Поскольку вы говорите о динамических массивах, очевидной вещью, которую вы должны сделать, было бы использование базового класса NSMutableArray для построения вашего стека цифр, хотя это имеет тот недостаток, что требует небольшого танца через NSNumber для хранения и получения:

static NSString names[] = { @"zero", @"one", @"two", @"three", @"four", @"five", @"six", @"seven", @"eight", @"nine" };
NSMutableArray* digits = [[NSMutableArray alloc] initWithCapacity:10] // arbitrary initial capacity
while ( input > 0 )
{
    [digits insertObject:[NSNumber numberWithInt:input%10] atIndex:0];
    input /= 10;
}

if ( [digits count] )
{
    for ( int i = 0; i < [digits count]; ++i )
    {
        NSLog(@"%@", names[[[digits objectAtIndex:i] intValue]]);
    }
}
else
{
    NSLog(@"zero");
}

[digits release];

В противном случае, вы можете использовать массив C, но вместо инициализации массива нулевой длиной (что на самом деле кажется плохой идеей), вы можете инициализировать его с максимальной емкостью, которая вам когда-либо понадобится, например: число цифры самого большого int. Это может варьироваться в зависимости от длины слова, для которого вы компилируете, но вы можете определить это перед компиляцией. 32-битное int может быть длиной до 10 цифр; 64 бит 20. Код тогда достаточно похож:

int digits[20];  // hard coded array size constants are evil, of course
int last = 0;
while ( input > 0 )
{
    digits[last++] = input % 10;
    input /= 10;
}

if ( last )
{
    while ( last --> 0 )
    {
        NSLog ( @"%@", names[digits[last]] );
    }
}
else
{
    NSLog(@"zero");
}

Этот подход поверхностно проще, но, безусловно, более подвержен ошибкам. (Действительно, поскольку я не запускал этот код, в нем почти наверняка есть ошибки!)

Другой способ сделать это - полностью разобраться в проблеме и использовать sprintf, чтобы извлечь цифры в правильном порядке:

char digits[21]; // hard coded array size constants are *still* evil
sprintf(digits, "%d", input);
int ptr = 0;
while ( digits[ptr] )
{
    NSLog(@"%@", names[digits[ptr++]]);
}

if ( ptr == 0 )
{
    NSLog(@"zero");
}

Это, вероятно, считается обманом.

Обратите внимание, что scanf будет обрабатывать начальный знак минус на входе, поэтому номер входа может быть отрицательным; Работа с этой ситуацией оставлена ​​в качестве упражнения.

1 голос
/ 23 мая 2010

Я бы начал с настройки этого инициализатора:

NSArray* myArray = [NSArray arrayWithObjects: @"zero", @"one", @"two", @"three",
                    @"four", @"five", @"six", @"seven", @"eight", @"nine", nil];
0 голосов
/ 23 мая 2010

Конечно, это не нужно, но его вопрос был в массивах, а не в повторном анализе проблемы.

Что касается ответа NGTechie, я теперь не понимаю, что вы пытаетесь сделать. Уточнить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...