我正在做cs193p课程的基础计算器作业,但我的
+evaluateExpression:usingVariables:
方法不起作用。它总是返回 0。
这是我的方法:
+ (double)evaluateExpression: (id)anExpression usingVariablevalues: (NSDictionary *)variables {
CalculatorBrain *worker = [[[CalculatorBrain alloc] init] autorelease];
double returnValue = 10.0;
if ([anExpression isKindOfClass:[NSMutableArray class]]) {
for (id term in anExpression) {
NSLog(@"%f", returnValue); // breakpoint
if ([term isKindOfClass:[NSString class]]) { // string
if ([term hasPrefix:@"%"] && [term length] == 2) { // variable
double value = [(NSNumber *)[variables objectForKey:[term substringFromIndex:1]] doubleValue];
NSLog(@"Variable: %@, value: %d", [term substringFromIndex:1], value);
[worker setOperand:value];
}
else if ([term length] == 1) { // operation
returnValue = [worker performOperation:term];
}
else {
NSLog(@"Invalid expression.\n\tMultiple character operation found: %@", term);
}
}
else if ([term isKindOfClass:[NSNumber class]]) { // operand
double value = [term doubleValue];
[worker setOperand:value];
}
else {
NSLog(@"Invalid expression.\n\tWrong type in expression: %@, The value is: %@.",[term class], term); // Wrong type in expression
}
}
}
else {
NSLog(@"Invalid expression.\n\tThe expression is of the wrong type: %@.", [anExpression class]); // expression is of wrong type
}
//returnValue = worker.operand;
return returnValue;
}
有什么提示吗?它总是返回 0。
/* Ouput from Console */
2012-06-27 20:01:05.487 Calculator[2823:207] 0
2012-06-27 20:01:05.488 Calculator[2823:207] 0
2012-06-27 20:01:05.489 Calculator[2823:207] 0
2012-06-27 20:01:05.490 Calculator[2823:207] Variable: x, value: 0
2012-06-27 20:01:05.490 Calculator[2823:207] 0
2012-06-27 20:01:05.491 Calculator[2823:207] 0
2012-06-27 20:01:05.491 Calculator[2823:207] 0
注意:我在开始时将 returnValue 设置为 10.0 以检查它是否完全改变了。
更新:
我发现它从字典中得到 0。我认为调用代码是原因:
- (IBAction) performSampleExpression {
NSMutableArray *expr = [[NSMutableArray alloc] init];
[expr addObject:[NSNumber numberWithDouble:3.0]];
[expr addObject:@"+"];
[expr addObject:@"%x"];
[expr addObject:@"*"];
[expr addObject:[NSNumber numberWithDouble:4.0]];
NSDictionary *varsdict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithDouble:10.0], @"x", nil];
double result = [CalculatorBrain evaluateExpression:expr usingVariablevalues:varsdict];
if (!result) NSLog(@"result = nil");
NSLog(@"%f", result);
display.text = [NSString stringWithFormat:@"%f", result];
[expr release];
}
结果不是零。
更新 2:
使用调试器(很好的提示。这可能会解决它。)我发现了一些奇怪的东西:
在这条线上:(第一次)
returnValue = worker.operand;
它说 returnValue 仍然是 10,而不是 3(worker.operand IS)。
作业失败了,还是应该这样?(就是想)。
更新 3:
好的,这里发生了一些非常奇怪的事情:我在 return 语句的最后一行设置了一个断点+evaluateExpression:usingVariables:
,它说
returnValue = 4
。
这意味着,实际问题出在-performSampleExpression
. 我究竟做错了什么?
更新 4:
变身帮@"%d", double
了@"%f", double
大忙。这就解释了奇怪的控制台输出。但是,它解决了它,因为我更新了显示,如显示[setText:@"%d", result];
导致我的双精度显示为 0 由于错误的演员阵容。
我通过使用调试器发现了这一点,因此建议的人实际上解决了它。(我要求的是hints
,而不是解决方案。毕竟,功课是要学习的)。