iOS - курс Stanford CS193P осень 2011, описание задания 2, выпуск программы - PullRequest
1 голос
/ 03 февраля 2012

Часть этого задания включает в себя распечатку на дисплее текущего уравнения, которое должно быть решено, для этого я использую следующие методы:

+ (NSString *)descriptionOfTopOfStack:(NSMutableArray *)stack {
    NSMutableString *programFragment = [NSMutableString stringWithString:@""];

    id topOfStack = [stack lastObject];
    if (topOfStack) [stack removeLastObject];

    if ([topOfStack isKindOfClass:[NSNumber class]]) {
        [programFragment appendFormat:@"%g", [topOfStack doubleValue]];
    } else if ([topOfStack isKindOfClass:[NSString class]]) {
        NSString *operation = topOfStack;
        if ([self isDoubleOperandOperation:operation]) {
            [programFragment appendFormat:@"(%@ %@ %@)", [self descriptionOfTopOfStack:stack], operation, [self descriptionOfTopOfStack:stack]];
        } else if ([self isSingleOperandOperation:operation]) {
            [programFragment appendFormat:@"%@( %@ )", operation, [self descriptionOfTopOfStack:stack]];
        } else if ([ self isNoOperandOperation:operation]) {
            [programFragment appendFormat:@"%@", operation];
        } else if ([self isVariable:operation]) {
            [programFragment appendFormat:@"%@", operation];
        }
    }

    return programFragment;
}

+ (NSString *)descriptionOfProgram:(id)program {
    NSMutableArray *stack;
    if ([program isKindOfClass:[NSArray class]]) {
        stack = [program mutableCopy];
    }

    return [self descriptionOfTopOfStack:stack];
}

Моя программа вычисляет результаты и все в порядке, единственная проблема заключается в том, что когда я ввожу переменную, цифру или операцию с одним операндом, на дисплее отображается только указанная последняя запись, потому что она не продолжает перебирать остальную часть значения, присутствующие в массиве, поскольку никакие другие рекурсивные вызовы не выполняются, есть идеи, как заставить программу работать по всему стеку и не прерывать вывод?

Ответы [ 4 ]

2 голосов
/ 04 февраля 2012

Я не совсем уверен, что вы имеете в виду. Рекурсия должна останавливаться на переменной, цифре или операции с одним операндом. Хотя для операции sin (операнда) она должна продолжаться с операндом.

Учли ли вы, что ваш стек может быть не полностью определен?

Допустим, вы вводите: 3 Введите 5 + 6 Введите 7 * 9 sqrt

это должно переводиться как: 3 + 5, 6, sqrt (7 * 9)

Итак, в вашем стеке еще три элемента, но ваш подход остановился на sqrt (7 * 9).

Вам необходимо добавить проверку в, чтобы увидеть, осталось ли что-либо в стеке, и продолжить при необходимости (и добавить запятую).

1 голос
/ 04 февраля 2012

Интересно, что вы использовали NSMutableString, я сделал это с NSString и использовал метод класса stringWithFormat. Поэтому каждый раз, когда мой результат - новая строка. Я не знаю, лучше ли какой-либо из этих подходов.

1 голос
/ 04 февраля 2012

ОК, еще один совет (будет добавлен в конце):

if ([stack count]) {    // did I finish the entire stack?
   [programFragment appendFormat:@"%@, %@", [self describeStack:stack], programFragment];
}
0 голосов
/ 25 марта 2012

Алина уже ответила, но только чтобы уточнить. Я добавил проверку [счетчик стека] в метод, который вызывает рекурсивную функцию.

+ (NSString *)descriptionOfProgram:(id)program {
        NSMutableArray *stack;
        NSString *strDesc = @"";

        if ([program isKindOfClass:[NSArray class]]) {
            // Make a consumable, mutable copy:
            stack = [program mutableCopy];
        }

        while (stack.count) {
            strDesc = [strDesc stringByAppendingString:[self descriptionOfTopOfStack:stack]];
            if (stack.count) {
                // More statements still on stack. We will loop again, but first, append comma separator:
                strDesc = [strDesc stringByAppendingString:@", "];
            }
        }

        return strDesc;
    }
...