package infix; public class InfixCalulator { 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 InfixCalulator(String rechnung){ this.rechnung=rechnung+"_";//hinten ein Stopzeichen System.out.println(this.rechnung); } // 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; double kommazahl = 0.0; double potenz = 1.0; while (ziffer()) { zahl *= 10; zahl += Character.getNumericValue(aktuell); weiter(); } if(aktuell=='.'){ weiter(); while (ziffer()) { potenz *= 10; kommazahl += Character.getNumericValue(aktuell)/potenz; weiter(); } } return zahl+kommazahl; } // TERM --> ZAHL | (SUMME) private double term(){ double term = 1.0; if(ziffer()) { term = zahl(); } if(aktuell=='(') { weiter(); term = summe(); weiter(); } 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(aktuell==')') { return summe; } if(ziffer()) { summe += produkt(); } if(aktuell=='(') { summe += produkt(); } if(aktuell=='+') { weiter(); summe += produkt(); } if(aktuell=='-') { weiter(); summe -= produkt(); } if(aktuell!='_') { summe += summe(); } return summe; } public static void main(String[] args) { String lese = "(2-5)+(-3+1)-5+10-10"; System.out.println("Tip: java InfixCalculation"+lese); InfixCalulator calc=new InfixCalulator(lese); System.out.println(lese +" = "+calc.berechne()); } }