Dies ist eine alte Version des Dokuments!
public class InfixCalculation{ private String rechnung; // die vollständige Rechnung private int pos; // Position des nächsten Zeichens private char aktuell; // das aktuelle Zeichen // Stellt einen gewöhnlichen Infix-Ausdruck mit den vier // Grundrechenarten und Klammern dar, z.B. 3*(-(2+4)) public InfixCalculation(String rechnung){ this.rechnung=rechnung+"_";//hinten ein Stopzeichen } // Rechnet einmal durch public double berechne(){ pos=0; weiter(); return summe(); } private void weiter(){ aktuell=rechnung.charAt(pos++); } private boolean ziffer() { return aktuell>='0' && aktuell<='9'; } private double zahl(){ double zahl = 0.0; while (ziffer()) { zahl *= 10; zahl += Character.getNumericValue(aktuell); weiter(); } return zahl; } // TERM --> ZAHL | (SUMME) private double term(){ double term = 1.0; if(ziffer()) { term = zahl(); } if(aktuell=='(') { weiter(); term = summe(); } return term; } // PRODUKT --> TERM | TERM*TERM* ... | TERM/TERM/ ... // | (auch * und / gemischt) private double produkt(){ double produkt = 1.0; // Unsinn, aber compilierbar. if(ziffer()||aktuell=='(') { produkt = term(); } if(aktuell=='*') { weiter(); produkt = produkt*produkt(); } if(aktuell=='/') { weiter(); produkt = produkt/produkt(); } return produkt; } // SUMME --> +PRODUKT | -PRODUKT (evtl. führende Vorzeichen) // | PRODUKT // | PRODUKT+PRODUKT+ ... // | PRODUKT-PRODUKT- ... // | (auch + und - gemischt) private double summe(){ double summe = 0.0; if(ziffer()||aktuell=='(') { summe += produkt(); } if(aktuell=='+') { weiter(); summe += summe(); } if(aktuell=='-') { weiter(); summe -= summe(); } if(aktuell==')') weiter(); return summe; } public static void main(String[] args) { System.out.println("Tip: java InfixCalculation \"3*(4-7)\""); InfixCalculation calc=new InfixCalculation("3*(4-7)"); System.out.println("3*(4-7)"+" = "+calc.berechne()); } }