Nachdem ich diese Anfrage auch per PM bekommen hab, hier meine Antwort, da sie evtl. auch für andere interessant sein könnte;
Ich würde das ungefähr so ablegen:
Operator (+, -, * oder /)
Klammer auf (X oder leer)
Wert (Floating-Point)
Klammer zu (X oder leer)
Also in einer Tabelle dann:
+ 0.5
* X 1
+ 2 X
Würde folgende Formel ergeben:
+ 0.5 * ( 1 + 2 )
Die Verarbeitung könnte dann in einem rekursiven Aufruf erfolgen. Wenn "Klammer auf" erreicht wird, muss über den Inhalt in der Klammer eine Teilberechnung erfolgen. Wenn "Klammer zu" erreicht wird den rekursive Aufruf beenden.
function berechnen ( formel :tabelle, index :integer ):float {
ergebnis = 0;
for (i = index;i < formel.length;i++) {
value = formel
.value;
if (formel.open = 'X') value = berechnen(formel, i);
if (formel.close = 'X') return ergebnis;
switch formel.operator {
case '+': ergebnis = ergebnis + value;
case '-': ergebnis = ergebnis - value;
case '*': ergebnis = ergebnis * value;
case '/': ergebnis = ergebnis / value;
}
}
return ergebnis;
}
Ist jetzt nicht ganz korrekt, der Index müsste als CHANGING Parameter definiert sein, aber in der C-Systax gibt es sowas leider nicht. ABAP-Syntax wäre zu lange geworden
Und irgendwas musst du schon selber machen
lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.
ECC: 6.18
Basis: 7.50