2017-04-07 77 views
0
#import "Calculator.h" 

@implementation Calculator 

- (long) calcNumbers:(NSString *)myOperator andNumberOne:(NSString *)numberOne andNumberTwo:(NSString *)numberTwo { 

    long result; 

    if ([myOperator isEqualToString:@"+"]){ 
     result = [numberOne integerValue] + [numberTwo integerValue]; 
    } else if ([myOperator isEqualToString:@"-"]) { 
     result = [numberOne integerValue] - [numberTwo integerValue]; 
    } else if ([myOperator isEqualToString:@"*"]){ 
     result = [numberOne integerValue] * [numberTwo integerValue]; 
    } else if ([myOperator isEqualToString:@"/"]) { 
     result = [numberOne integerValue]/[numberTwo integerValue]; 
    } else { 
     result = [numberOne integerValue] % [numberTwo integerValue]; 
    } 

    return result; 

} 


- (long) postFix:(NSMutableArray *)symbols 
{ 

    NSMutableArray * newSymbols = [[NSMutableArray alloc]init]; 
    NSString * operatorSigns = @"*/%"; 
    long result = 0; 

    for (int i = 0; i < symbols.count; i++){ 

     // operand 
     if (i%2 == 0){ 
      [newSymbols addObject:symbols[i]]; 
     } else { // operator 

      if ([operatorSigns containsString:symbols[i]]){ 
       result = [self calcNumbers:symbols[i] andNumberOne:symbols[i-1] andNumberTwo:symbols[i+1]]; 
       [newSymbols insertObject:[NSNumber numberWithLong:result] atIndex:i-1]; 
       i = i + 1; 
      } else { 
       [newSymbols addObject:symbols[i]]; 
      } 
     } 
    } 

    for (int i = 0; i < newSymbols.count; i++){ 
     if (i%2 == 1){ 
      result = [self calcNumbers:newSymbols[i] andNumberOne:newSymbols[i-1] andNumberTwo:newSymbols[i+1]]; 
     } 
    } 

    return result; 
} 

@end 

这是我的课。我正在尝试在命令行中运行RPN计算器。但在calcNumbers方法中,存在EXC_Arithmetic错误。我认为星号是作为(所有)unix_command工作的。我怎样才能解决这个问题?在此先感谢EXC_ARITHMETIC错误目标C

+0

这个错误可能意味着你除以零('/'或'%'操作符)。你必须解决这个问题。 – Sulthan

+1

请添加'postFix'函数的输入。 – Sulthan

回答

0

我不认为你现在在做什么postFix是正确的,我甚至不知道你在做什么。

发生崩溃是因为您发送错误值为calcNumbers。由于数值不好,我的意思是意想不到的顺序。

例如,如果myOperator@"10"numberTwo*,那么你将进入else分支:

result = [numberOne integerValue] % [numberTwo integerValue]; 

,你将被划分(计算模数)由零,这将导致碰撞(你不能被零除)。

如何找到问题(不是实际的解决方案):

添加

NSLog(@"Operator %@, operands: %@, %@", myOperator, numberOne, numberTwo); 

这将有助于你看到了什么值传递给您的功能和发现问题。