Claus Schönleber

Hitchhacker´s Guide To PASCAL  [Vol. 1]

 [ zurück | weiter ]
   [ Start | Beispielprogramme Download | Home ]

Inhalt

Compiler
Programmieren
Datentypen,
Variablen,
Standardfunktionen
Logik
Verzweigung,
Strukturierung
Schleifen
Felder (Arrays)
Verteiler: CASE
Zeichenketten
(Strings)
Textdateien
Module
(Prozeduren,
Funktionen)
Anhang
(Operatoren,
abgeleitete
Funktionen)
 
 
 
 

 

 

Verzweigungen und Strukturierung 

Bisher 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. 

PASCAL-Block
Ein PASCAL-Block ist der beliebig lange und beliebig komplexe Teil eines PASCAL- Programms, der aus Anweisungen besteht und zwischen den PASCAL-Worten BEGIN und END eingeschlossen ist. 
Beispiele
(siehe oben stehende Beispiele und nachfolgende Programme.) 
Ein PASCAL-Block besteht aus mindestens einer Anweisung. Enthält er mehr als eine Anweisung, muß er in BEGIN und END eingeschlossen werden. Dabei steht hinter dem BEGIN kein Semikolon, hinter dem END muß eines stehen. Blöcke werden eingeführt, wenn die Struktur des Programms von der einer einfachen, linearen Anweisungsfolge abweicht. Das ist bei Verzweigungen und Schleifen der Fall (siehe später). PASCAL-Blöcke, im Folgenden meist nur noch Blöcke genannt, stellen Teile dar, die alternativ (Entscheidungen) oder repetativ (Wiederholungen) abgearbeitet werden sollen. Genaueres über Blöcke und Strukturierung folgt im nächsten Abschnitt. 

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! 

Blockstrukturierung 

Programmiersprachen 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. 
  1. Reservierte Worte werden immer vollständig in Großbuchstaben geschrieben. Alles andere wird vollständig in Kleinbuchstaben geschrieben. 
  2. Am Beginn eines Blockes wird immer eingerückt. Benutzen Sie dafür immer dieselbe Anzahl von Leerzeichen. Optimal sind zwei Leerzeichen. 
  3. BEGIN und END leiten einen Block ein und werden deswegen nicht eingerückt. Sie beginnen immer in der Spalte des übergeordneten Blocks. 
  4. Besteht ein Block nur aus einer Anweisung, benötigt man also keine Klammerung durch BEGIN und END, so wird die Anweisung trotzdem eingerückt. 
  5. In jeder Zeile darf nur eine Anweisung stehen. 
  6. BEGIN und END belegen immer eine Extrazeile, so daß zusammengehörige BEGINs und ENDs immer untereinander in derselben Spalte zu stehen kommen. 
Um die Regeln in vollem Umfang zu verstehen, schauen Sie sich einfach die Beispiele im Buch an. Sie sind nach diesen Regeln strukturiert. Natürlich hat jeder Programmierer seinen eigenen Stil. Es ist aber ratsam, sich erst an diese Regeln zu halten. Wie beim Schreiben lernen kann man den eigenen Stil erst entwickeln, wenn man schreiben gelernt hat. Es ist jedoch notwendig, auch wenn man später von diesen Regeln abweicht, einen konsequenten und logischen Stil zu entwickeln. Beliebiges Einrücken ohne Sinn und Verstand, nur weil es so toll ist, nützt genuso wenig wie gar kein Einrücken. 

Kommentare

Eine weiter Hilfe beim Programmieren sind Kommentare. Sie stehen im Quelltext, werden aber vom Compiler ignoriert. Sie dienen ausschließlich der übersicht des Programmierers. 
PASCAL-Kommentar
Ein PASCAL-Kommentar ist jede beliebige Zeichenkette im Quelltext, die durch geschweifte Klammern eingeschlossen ist. Anstatt der geschweiften Klammer kann auch die Kombination "(*" für den Anfang und "*)" für den Schluß benutzt werden. 
Beispiele
{ Dies ist ein PASCAL-Kommentar } 
(* Dies ist auch ein PASCAL-Kommentar *)
Das Umsatzsteuerprogramm, mit Kommentaren versehen, sieht dann beispielsweise so aus: 
  (*** 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.
Pseudocode
Pseudocode ist die Benutzung eines Kommentars in der Art einer Anweisung. Die zum Kommentar gehörenden Anweisungen werden wie üblich eingerückt. 
Beispiele
(siehe oben stehendes Beispiel) 
Gerade bei komplizierten Programmen ist es unerläßlich, bestimmte Programmteile ausführlich zu kommentieren, wobei die gerade beschriebene Methode den Programmierer in effektiver Weise unterstützt. 

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. 
 

 [ zurück | weiter ]
   (c) 2001 Schoenleber.com