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());
}
}