В то время как цикл с вложенным переключателем в Objective-C - PullRequest
3 голосов
/ 23 мая 2011

Я только начал изучать Objective-C. Я делаю одно из стандартных упражнений калькулятора. Предполагается создать машину добавления (например, ввести оператора и номер, каждый раз отображать результат). Но я что-то напутал и думаю, что это связано с моим использованием типа данных "char".

Вот код, просто раздел программы (интерфейс и реализация просты и работают в другой версии; тем не менее, если кто-то хочет их увидеть, просто спросите):

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
double      value1 = 0.0;
char        operator = 'a';

Calculator *deskCalc = [[Calculator alloc] init];

NSLog(@"Initial value?");
scanf("%lf",&value1);

[deskCalc setAccumulator: value1];

while (operator != 'e') {
    {
    NSLog(@"Operation and value?");
    scanf("%c %lf", &operator, &value1);
    }
    switch (operator){
        case '+':
            [deskCalc add: value1];
            NSLog(@"%f", [deskCalc accumulator]);
            break;
        case '-':
            [deskCalc subtract: value1];
            NSLog(@"%f", [deskCalc accumulator]);
            break;
        case '*':
        case 'x':
            [deskCalc multiply: value1];
            NSLog(@"%f", [deskCalc accumulator]);
            break;
        case '/':
            if (value1 != 0) {
                [deskCalc divide: value1];
                NSLog(@"%f", [deskCalc accumulator]);
            }
            else {
                NSLog(@"Division by zero not allowed.");
                NSLog(@"%f", [deskCalc accumulator]);                   
            }
            break;
        case 's': 
            [deskCalc setAccumulator: value1];
            NSLog(@"%f", [deskCalc accumulator]);
            break;
        case 'e':
            NSLog(@"Done, sucker, final answer: %f.", value1);
        default:
            NSLog(@"Unknown operator.");
            NSLog(@"%f", [deskCalc accumulator]);
            break;


}
}

    [deskCalc release];

[pool drain];
return 0;

}   

И, в случае, если это помогает, вот что я получаю от терминала, когда я запускаю это:

Из терминала:

Начальное значение?

12 // Мой ввод

Операция и значение?

x 4 // Мои данные

Неизвестный оператор.

Операция и стоимость? // Он не останавливается, чтобы запросить ввод.

48,000000

Операция и значение?

Помощь и спасибо.

P.S. Я знаю, что программа довольно неуклюжа. Прошу прощения, последний язык, который я выучил, был Basic на моем Coleco Adam, у которого был стример - да, как на кассете, который был потрясающим.

Ответы [ 2 ]

4 голосов
/ 23 мая 2011
scanf(" %c %lf", &operator, &value1);

Поместите пробел между открытыми кавычками и %c, чтобы перехватить все оставшиеся пробелы в stdin.

0 голосов
/ 23 мая 2011

operator в основном \n. Вам, вероятно, нужно будет сделать flushall().

...