0

我正在编写我的第一个真正的目标 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;
}
4

2 回答 2

0

简而言之:不要使用scanf(). 它不像你想象的那样工作。

我已经尝试解释出了什么问题,但基本上它不喜欢换行符之类的东西,而且很迂腐。搜索类似的问题。简单的解决方案是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++ 关键字作为标识符仍然不是一个好主意。让我们new保留operator。调用那个变量op

此外,作为一种设计改进,您可以将大switch语句抽象计算器类中,这样您就可以编写类似的东西[myCalc performOp:'+' withNumber:number];

于 2013-07-14T05:30:40.707 回答
0

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

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

        int rc = scanf("%lf, %c", &number, &operator);
        if (rc < 2) {
            break;
        }
于 2013-07-14T05:40:25.490 回答