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

Ceci est ma classe. J'essaie de lancer la calculatrice RPN en ligne de commande. Mais dans la méthode calcNumbers, il y a une erreur EXC_Arithmetic. Je pense que l'astérisque fonctionne en tant que (tous) unix_command. Comment puis-je réparer cela? Merci d'avanceEXC_ARITHMETIC Erreur Objectif C

+0

Cette erreur signifie probablement que vous divisez par zéro (opérateurs '/' ou '%'). Vous devez résoudre ce cas. – Sulthan

+1

Veuillez ajouter l'entrée pour la fonction 'postFix'. – Sulthan

Répondre

0

Je ne pense pas que ce que vous faites maintenant dans postFix est correct, je ne sais même pas ce que vous essayez de faire.

Le blocage se produit car vous envoyez des valeurs incorrectes à calcNumbers. Par mauvaises valeurs, je veux dire les valeurs dans un ordre inattendu.

Par exemple, si myOperator est @"10" et numberTwo est *, alors vous entrez dans la branche else:

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

et vous allez diviser (calcul modulo) par zéro, ce qui entraînera l'accident (vous ne peut pas diviser par zéro).

Comment trouver le problème (pas une solution réelle):

Ajouter

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

Cela devrait vous aider à voir quelles valeurs sont transmises à votre fonction et trouver le problème.