2017-04-07 9 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

私はあなたが今何をしているとは思わないdo、私はあなたが何をしようとしているのか分かりません。

calcNumbersに不正な値を送信しているためにクラッシュしました。値が悪いと、予期しない順序で値を意味します。あなたは(

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

、あなたはクラッシュの原因となる、ゼロで(計算モジュロ)を分割されます。

myOperator@"10"numberTwo*である場合たとえば、あなたはelse枝に入りますゼロで割ることはできません)。問題(ではない、実際の解決策を)見つける方法

あなたは値があなたの関数に渡されたものを見るのを助けると、問題を見つける必要があり

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

を追加します。