2017-06-03 8 views
0

Mein Code schlägt fehl, wenn ich etwas wie 3(5) eingib. Wie ändere ich meinen Code so, dass er in Ausdruck in der Mitte löst und dann multipliziert?bekommen bedmas, um richtig zu arbeiten

double parseTerm() { 
    double x = parseFactor(); 
    while(true) { 
     if  (shift('*')){ 
      x *= parseFactor(); // multiply 
     } 
     else if (shift('/')){ 
      x /= parseFactor(); // divide 
     } 
     else{ 
      return x; 
     } 
    } 
} 

double parseExpression() { 
    double x = parseTerm(); 
    while(true) { 
     if  (shift('+')){ 
      x += parseTerm(); // addition 
     } 
     else if (shift('-')){ 
      x -= parseTerm(); // subtraction 
     } 
     else{ 
      return x; 
     } 
    } 
} 

double parseFactor() { 
    if (shift('+')){ 
     return parseFactor(); //plus 
    } 
    if (shift('-')){ 
     return -parseFactor(); //minus 
    } 

    double x; 
    int startPos = this.pos; 

    if (shift('(')) { // brackets 
     x = parseExpression(); 
     shift(')'); 
+5

Warum ist das mit Java und JavaScript getaggt? – Logan

+2

Für alle, die sich fragen: [BEDMAS, steht für Brackets, Exponenten, Division, Multiplikation, Addition, Subtraktion] (https://en.wikipedia.org/wiki/Order_of_operations) = Reihenfolge der Operationen –

+1

Bitte post a [mcve] - eine, die sowohl * minimal * und ** vollständig ** - der Code oben ist nicht vollständig und ich glaube auch nicht, dass es minimal ist. Dann geben Sie Ihren eigenen Versuch - und wenn es nicht funktioniert, zeigen Sie, was Sie versucht haben und was im Detail falsch läuft. Als Hinweis - wenn Sie eine öffnende Klammer haben möchten ('fungieren als De-facto-Multiplikationsoperator, dann müssen Sie etwas wie das, was Sie in der' parseFactor'-Methode für Sub-Ausdruck haben, auch in die 'parseTerm'-Methode einfügen. –

Antwort

0

Dies ist, was Sie in parseTerm ändern müssen würden einen Ausdruck wie 3(5) arbeiten, um die gleichen wie 3*(5) zu erhalten:

double parseTerm() { 
    double x = parseFactor(); 
    while(true) { 
     if (shift('*')) { 
      x *= parseFactor(); // multiply 
     } else if (shift('/')) { 
      x /= parseFactor(); // divide 
     } else if (shift('(')) { // brackets 
      x *= parseExpression(); 
      shift(')'); 
     } else { 
      return x; 
     } 
    } 
} 

(Dies ist unter der Annahme, dass Ihre parseFactor Methode richtig ist, weil es unvollständig in Ihrem Code)

+0

yeah, parseFactor ist korrekt. Konnte nicht alles einfügen. Danke, Ihre Lösung hat funktioniert. – byzht

Verwandte Themen