【问题标题】:While Loop with a Nested Switch in Objective-C在 Objective-C 中使用嵌套开关的 While 循环
【发布时间】:2011-05-23 14:52:07
【问题描述】:

我刚刚开始学习 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

操作和价值?

帮助和感谢。

附:我知道这个程序很笨拙。求饶,我学的最后一门语言是我的 Coleco Adam 上的 Basic,它有一个磁带驱动器——是的,就像盒式磁带一样,太棒了。

【问题讨论】:

  • 虽然可能不是您的问题,但 'e' 的情况并没有中断。你打算这样做吗?
  • 请注意,在这种情况下,检查实际值总是很有帮助的,方法是在调试器中检查或打印出来(在这种情况下可能是十六进制或十进制值)。跨度>
  • @Andy,啊,不。我的错。很好地抓住那个。

标签: objective-c char while-loop switch-statement


【解决方案1】:
scanf(" %c %lf", &operator, &value1);

在开引号和%c 之间放置一个空格,以捕获标准输入中剩余的任何空格。

【讨论】:

  • 作为记录,我调试它的步骤如下:我让代码运行,并注意到行为与您描述的相符。因为它说的是“未知操作员”,所以我用NSLog(@"Operator '%c', operator); 记录了它找到的操作员。当我再次运行它时,我可以看到未知的运算符是一个回车符。然后我用谷歌搜索了如何让 scanf 跳过回车,发现空格字符可以做到这一点。
【解决方案2】:

operator 主要是\n。您可能需要发送flushall()

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多