我正在编写我的第一个真正的目标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;
}
答案 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 ++关键字作为标识符仍然不是一个好主意。允许保留new
和operator
。调用该变量op
。
此外,作为设计改进,您可以将大switch
语句抽象为计算器类,这样您就可以编写[myCalc performOp:'+' withNumber:number];
之类的内容。< / p>
答案 1 :(得分:0)
scanf
通常是一个不好用的功能。通常最好将输入行读入字符串,然后在字符串上使用sscanf
(或其他一些解析器)。
但是,这种情况下的修复很简单。 scanf
返回成功分配的输入项的数量。你期待两个。如果出现错误或达到文件结尾,则返回少于两个。因此:
int rc = scanf("%lf, %c", &number, &operator);
if (rc < 2) {
break;
}