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