skip to main content

kiesler.at

Spaziergang durch einen Einheitenberechner
updated by rck, 2004-10-10

Der Ernstfall ist eingetreten. EPROG. Drei Beispiele, eines schlimmer als das andere. Zu allem Überfluss sind die mitgelieferten "Unterstützungsprogramme" mehr ein Klotz am Bein als sonst was.

Wie geht's weiter, wenn kein Stein und kein Seil verfügbar ist, das einen den Weg in die Donau begleiten könnte?

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13

berechne(String)

Hier passiert die eigentliche Arbeit. Gemäß der Top-Down Strategie entspricht berechne(String) im wesentlichen unserem "Schlachtplan". Hier sind die abstrakten Schritte aufgezählt, die wir für das Berechnen eines gegebenen Ausdruckes benötigen.

248         public static String berechne(String s) throws Exception {
249 
250                 // 1. Platz für den zerlegten Ausdruck reservieren
251                 //
252                 reset();
253 
254                 // 2. Ausdruck in mundgerechte Stücke zerteilen
255                 //    (dabei gleich auf die Klammern schauen)
256                 //    
257                 tokenize(s);
258 
259 
260                 // 3. Happen genauer analysieren. Alles syntaktisch
261                 //    korrekt ?
262                 //
263                 verify();
264 
265 
266                 // 4. zuerst alle Klammern auflösen (innerste zuerst)...
267 
268                 while(isGeklammert())
269                         berechneInnersteKlammer();
270 
271 
272                 // 5. ...und dann den gesamten verbleibenden Ausdruck
273                 //    gab's bis jetzt keine Exception, können wir das
274                 //    Ergebnis gleich ausgeben.
275 
276                 s=berechne(0, ausdruck.size());
277 
278 
279                 // 6. nachdem die Eingabe OHNE Leerzeichen, die Ausgabe
280                 //    aber mit ist, das ganze noch anpassen & gleich
281                 //    ausgeben.
282                 //
283                 return(beautify(s));
284         }

Beschreibung von berechne(String)

252: Hier wird Platz für den zu speichernden Ausdruck reserviert. In unserem Fall wird der String in die allseits beliebte ArrayList umgewandelt. Die Funktion reset() ist hier das, was bei einem objektorientierten Programm üblicherweise ein Constructor ist.

257: tokenize() ist ein handgeschnitzter lexikalischer Analysator. Üblicherweise nimmt man für solche Dinge eigene Programme, wie zB den Lex. Meiner Meinung nach sind beispiele wie diese schon aufgrund der String-Zerlegung sehr aufwendig. Für eine in die Programmierung einführende Veranstaltung vielleicht sogar zu aufwendig.

263: verify() der nächste Schritt, den man mit den Mitteln von Übersetzerbau (yacc / bison) bestens umsetzen könnte. Nach der Lexikalischen Analyse erfolgt das Parsen. Passt die Reihenfolge, die Semantik des Ausdrucks? Beispielsweise ist 4+*-1 ungültig, da + und * nicht aufeinander folgen dürfen.

268-269: Wie heißt es in der Aufgabenstellung so schön? Bei der Berechnung sind selbstverständlich Klammerregeln und die Rangfolge der Operatoren zu beachten.

Hier kümmern wir uns um die Klammerung -- Klammern werden von innen nach außen aufgelöst und entsprechend bei jedem Schritt berechnet.

276: gibt es einmal keine Klammer mehr im Ausdruck -- zur Erinnerung: Wir haben bereits geprüft, dass der Ausdruck korrekt ist, also zB auch die Klammerung gültig ist -- müssen wir den Ausdruck noch ein weiteres mal berechnen und erhalten so den Endbetrag.

283: bzw. noch nicht ganz. Der Einfachheit halber werden die Einheiten nicht ganz so abgespeichert, wie sie in der Ausgabe verlangt werden. beautify() erledigt das für uns.

reset()

Reset legt, wie gesagt, unsere ArrayList an. In diese speichern wir dann Happen für Happen unseres Eingabestrings und führen schrittweise die Berechnungen durch.

24         public static void reset() throws Exception {
25                 ausdruck=new ArrayList();
26         }

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13



RSSComments - Make a comment
The comments are owned by the poster. We are not responsible for its content.
RSSAll Articles
2008, 2007, 2006, 2005, 2004