简单的Objective-C计算器程序连续打印

时间:2013-07-14 05:01:14

标签: objective-c

我正在编写我的第一个真正的目标C程序,它是制作一个非常简单的计算器,就像Stephen Kochan编写的Objective-C 2.0编程一样。

无论如何,每当我运行程序时,它会不断地反复打印相同的东西,而不是让我选择输入任何其他东西。代码如下,如果有人可以提供帮助,我认为问题介于while循环和switch函数之间。提前谢谢!

#import <Foundation/Foundation.h>

@interface Calculator : NSObject {
    double number, accumulator;
    char operator;
}

    -(void) add: (double) n;
    -(void) subtract: (double) n;
    -(void) multiply: (double) n;
    -(void) divide: (double) n;


@end

@implementation Calculator

-(void) add: (double) n {
    accumulator += n;
    NSLog(@"%fl", accumulator);
}

-(void) subtract: (double) n {
    accumulator -= n;
    NSLog(@"%fl", accumulator);
}

-(void) multiply: (double) n {
    accumulator *= n;
    NSLog(@"%fl", accumulator);
}

-(void) divide: (double) n {
    if (n == 0)
        NSLog(@"Error! You can't divide by 0!");
    else
        accumulator /= n;
        NSLog(@"%fl", accumulator);

}

@end






int main(int argc, const char * argv[])

{ 

    @autoreleasepool {
        double number, accumulator;
        char operator;

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

        NSLog(@"Begin calculations by typing a number then S");
        scanf("%lf, %c", &accumulator, &operator);

        while (operator != 'E') {
            NSLog(@"%lf", accumulator);
            NSLog(@"What would you like to do next?");
            scanf("%lf, %c", &number, &operator);

            switch (operator) {
                case '+':
                    [myCalc add: number];
                    break;

                case '-':
                    [myCalc subtract: number];
                    break;

                case '*':
                    [myCalc multiply: number];
                    break;

                case '/':
                    [myCalc divide: number];
                    break;

                default:
                    break;
            }



            }

    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

简而言之:请勿使用scanf()。它的工作方式不符合你的想法。

我已经尝试过解释什么是错的,但基本上它不喜欢新行和东西而且很迂腐。搜索SO similar questions。简单的解决方案是用实际有用的东西替换scanf(),例如

char buf[0x100];
char *end;

fgets(buf, sizeof buf, stdin);
accumulator = strtod(buf, &end);
while (isspace(*end))
    end++;

operator = *end;

此外,您的计算器逻辑存在缺陷。 myCalc对象不与accumulator函数共享具有相同名称的main()变量。您的程序基本上没有考虑输入的第一个数字。另外,我看不出“类型'S'”部分的用途是什么,绝对没有检查代码中输入“S”,只有“E”结束。


旁注:我们在C(基本上),但使用C ++关键字作为标识符仍然不是一个好主意。允许保留newoperator。调用该变量op

此外,作为设计改进,您可以将大switch语句抽象为计算器类,这样您就可以编写[myCalc performOp:'+' withNumber:number];之类的内容。< / p>

答案 1 :(得分:0)

scanf通常是一个不好用的功能。通常最好将输入行读入字符串,然后在字符串上使用sscanf(或其他一些解析器)。

但是,这种情况下的修复很简单。 scanf返回成功分配的输入项的数量。你期待两个。如果出现错误或达到文件结尾,则返回少于两个。因此:

        int rc = scanf("%lf, %c", &number, &operator);
        if (rc < 2) {
            break;
        }