Claus SchönleberHitchhacker´s Guide To PASCAL [Vol. 1] |
||
|
[ Start | Beispielprogramme Download | Home ] | |
InhaltCompilerProgrammieren Datentypen, Variablen, Standardfunktionen Logik Verzweigung, Strukturierung Schleifen Felder (Arrays) Verteiler: CASE Zeichenketten (Strings) Textdateien Module (Prozeduren, Funktionen) Anhang (Operatoren, abgeleitete Funktionen)
|
Verzweigungen und StrukturierungBisher haben unsere Beispiele immer die Eigenschaft einer Liste gezeigt, die nur in der angegebenen Weise abgearbeitet werden kann. Das ist aber oft störend. Denn mit dem Computer möchte man ja gerade Problemlösungen berechnen, die von verschiedenen Fällen abhängen. Das ist ja die Stärke solcher Maschinen. Also brauchen wir die Möglichkeit, Entscheidungen zu treffen und darauf zu reagieren. Das ermöglicht die Struktur IF..THEN..ELSE, die bedingte Verzweigung.Die Anwendung ist denkbar einfach. Zwischen den PASCAL-Worten IF und THEN darf jeder beliebige logische Ausdruck stehen. Die hatten wir ja gerade im letzten Kapitel. Hinter THEN und ELSE dürfen beliebig große PASCAL-Blöcke stehen.
Bemerkung: Ein Block ist ein "compound statement", also eine zusammengesetzte Anweisung. Immer, wenn mehr als eine Anweisung an einer Stelle stehen muß, an der normalerweise nur eine Anweisung stehen darf, wie zum Beispiel hinter THEN oder ELSE, dann kann man beliebig viele Anweisungen zu "einer einzigen Anweisung" machen, indem man mit BEGIN und END klammert. Das folgende Beispiel gibt das Vorzeichen einer Zahl aus: PROGRAM vorzeichen; VAR zahl : real; BEGIN write ('Geben Sie eine beliebige Zahl ein: '); readln (zahl); IF (zahl < 0) THEN writeln (zahl,' ist negativ!'); IF (zahl > 0) THEN writeln (zahl,' ist positiv!'); IF (zahl = 0) THEN writeln ('Es war die Null!'); END.Natürlich läßt sich das Problem einfacher formulieren; mir ging es aber zunächst um die Anwendung von IF..THEN. Wenn man weiß, daß es nur zwei Möglichkeiten gibt, kann man sie, anstatt die andere Möglichkeit überflüssigerweise abzufragen, gleich mit ELSE (engl. für andernfalls) einleiten. Wir werden das gerade bearbeitete Beispiel gleich besser formulieren: PROGRAM vorzeichen2; VAR zahl : real; BEGIN write ('Geben Sie eine beliebige Zahl ein: '); readln (zahl); IF (zahl <= 0) THEN IF (zahl < 0) THEN writeln (zahl,' ist negativ!') ELSE writeln ('Es war die Null!') ELSE writeln (zahl,' ist positiv!'); END.Wie man an den schon zahlreichen Beispielen sieht, wird jede Anweisung mit einem Semikolon abgeschlossen. BEGIN und END sind keine Anweisungen, sondern leiten solche ein oder schließen eine solche ab, somit steht hinter Ihnen kein Semikolon. Problematisch ist die Angelegenheit beim ELSE. Der Erfinder und Entwickler der Sprache PASCAL, Nikolaus Wirth, ging von der Interpretation aus, daß das Semikolon ";" ein Trennzeichen zwischen zwei Anweisungen ist. Das impliziert die Forderung, daß es vor einem ELSE nicht stehen darf, da der gesamte IF..THEN..ELSE-Komplex als (aus einzelnen Anweisungen) zusammengesetzte Anweisung gilt und als solche nicht getrennt werden darf. Das ist nicht sehr günstig beim Entwickeln von Programmen, da viel geändert werden muß und es daher vor einem ELSE unbeabsichtigt immer wieder zu einem Semikolon kommt. Daß es auch anders geht, und das sogar sehr gut einsehbar, zeigen sehr viele andere Programmiersprachen, unter anderem C. In einer normalen Umgangssprache gehört das abschließende Satzzeichen nämlich mit zum Satz, ist also Bestandteil einer Anweisung. Genauso kann man es auch in Programmiersprachen halten. Dann ist das Semikolon (z.B. in C) nicht Trennzeichen zwischen zwei Anweisungen, sondern abschließender Bestandteil einer Anweisung. Das leuchtet viel eher ein und verleitet nicht so leicht zu Störungen wie die Praxis in PASCAL. Merksatz: Vor einem ELSE darf niemals ein Semikolon stehen! BlockstrukturierungProgrammiersprachen in der Art von PASCAL, C, LISP, SMALLTALK und PROLOG sind nicht dazu geschaffen worden, weil der Computer damit besser umgehen könnte. Der Microprozessor, so haben wir es eingangs gelernt, kann nur eine einzige Sprache verstehen, Maschinensprache. Es ist also der Mensch, der sich das Hilfsmittel Programmiersprache gewählt hat, weil er damit besser umgehen kann. Nebenbei fällt auch noch der Vorteil einer Abstrahierung von der Maschine dabei ab.Merksatz: Programmiersprachen sind ein Hilfsmittel für den Menschen, damit er einen möglichst guten Überblick über und Verständnis für den geschriebenen Quelltext bekommt. Weiterhin ist es durch solche Sprachen möglich, Programme in einer dem menschlichen Verständnis besser angepaßten Weise zu formulieren. Das heißt, daß die Sprache Lösungen und Strukturen für elementare Probleme bereitstellt, so daß man sich mit dem eigentlichen Problem beschäftigen kann. Also: Wir benutzen PASCAL nicht, weil der Computer damit besser funktioniert, sondern deswegen, weil wir, die Menschen, damit besser umgehen können! Das bedeutet, daß man der Optik eines Programms einen großen Wert beimessen sollte. Das Wichtige beim Programmieren ist, immer die Übersicht über das, was man selbst oder jemand anders geschrieben hat, zu behalten. Die Struktur des Programms muß möglichst auf den ersten Blick erkennbar sein. Sonst sind Änderungen nur mit großen Aufwand durchführbar und die Wahrscheinlickkeit von Fehlern sehr groß. Wenn das Neuschreiben eines Programmes weniger Zeit in Anspruch nimmt als das Korrigieren und Ändern des alten, dann ist entweder die Programmiersprache falsch gewählt oder der Programmierer hat die Übersichtlichkeit vernachlässigt. Dem Compiler ist es egal, wie er ein Programm geliefert bekommt; das letzte Beispiel dürfte auch zum Beispiel in folgender Form geschrieben werden. Es würde auch so funktionieren: PROGRAM steuer; VAR netto,brutto,steuer : real; BEGIN write ('Nettobetrag: '); readln (netto); write ('Steuersatz in Prozent: '); readln (steuer); IF (steuer = 14) THEN brutto := netto * 1.16 ELSE brutto := netto * 1.07; writeln ('Bruttobetrag: ',brutto:5:2,' Euro'); writeln ('Steuersatz : ',steuer,'%'); END.Wie Sie sehen, ist jedoch praktisch nicht mehr erkennbar, was passiert. Deswegen hat man in PASCAL die Möglichkeit der Strukturierung eingebaut. Unglücklicherweise ist aber der ansonsten höchst verdienstvolle Erfinder von PASCAL, Herr Wirth, das schlechteste Beispiel dafür. Er hat sich zwar in den neuen vorliegenden Auflagen gebessert; trotzdem möchte ich Ihnen einige Grundregeln zur Strukturierung geben. Diese Regeln sollen Ihnen zunächst helfen, eine gewisse Ordnung in Ihren Quelltext zu bringen.
KommentareEine weiter Hilfe beim Programmieren sind Kommentare. Sie stehen im Quelltext, werden aber vom Compiler ignoriert. Sie dienen ausschließlich der übersicht des Programmierers.
(*** Programm zu Berechnung des Bruttobetrages ***) (*** mit 16% bzw. 7% ***) PROGRAM mehrwert; VAR netto, (* enthält Nettobetrag *) brutto, (* enthält Ergebnis *) steuer : real; (* enthält Steuersatz *) BEGIN (*** Eingabe des Nettobetrages ***) write ('Nettobetrag: '); readln (netto); (*** Eingabe des Steuersatzes ***) write ('Steuersatz in Prozent: '); readln (steuer); (*** Berechnung ***) IF (steuer = 14) THEN brutto := netto * 1.16 ELSE brutto := netto * 1.07; (*** Ausgabe des Bruttobetrages ***) writeln ('Bruttobetrag: ',brutto:5:2,' Euro'); writeln ('Steuersatz : ',steuer,'%'); END.Wie Sie sehen, benutze ich hier die Kommentare im Quelltext wie normale Anweisungen und rücke die zum Kommentar gehörigen Anweisungen ein wie normale Blöcke. Dies ist eine weitere Möglichkeit den Quelltext übersichtlicher zu gestalten. Man nennt diese Art der Kommentierung Pseudocode, da es kein echter PASCAL-Text ist und vom Compiler überlesen wird. Um einen Quelltext zu verstehen, ist aber der Pseudocode wichtiger als der eigentliche Programmquelltext.
Merksatz: Ein trickreiches und unübersichtliches Programm zeugt nicht von gutem Programmierstil, sondern von Unfähigkeit. Reichhaltige Kommentierung erlaubt schnelle und effektive Wartung des Programms. Es ist ein Irrtum, zu glauben, man könne durch Weglassen von Kommentaren
irgendetwas einsparen, z.B. Arbeitszeit des Programmierers. Die eingesparten
Minuten werden mit Sicherheit später durch Stunden der Suche nach
Fehlern oder Aufsetzpunkten oder beim Verändern des Programms bezahlt.
Ein Programmierer, der mit Kommentaren spart, gleicht einem Manne, der,
um das Geld für den Omnibus zu sparen, mit dem Taxi fährt.
|
|
|
(c) 2001 Schoenleber.com |