Nachdem im ersten Teil dieses Kurses die Grundelemente von Pascal und im zweiten Teil kurz der Umgang mit Pure-Pascal und die Programmstrukturen von Pascal gezeigt wurden, soll dieser Teil die Codierung von Struktogrammen anhand von Pascal-Beispielen zeigen.
Die folgenden Beispiele sollen zeigen, dass die Vorarbeit mit dem Struktogramm nach Nassi-Shneidermann eine logische und zeitsparende Arbeitsweise ermöglicht. Die gesamte Programmlogik kann in der grafischen Lösung erstellt und nachgewiesen werden. Wie schon im Kapitel 1 .2 geschrieben, sollte man sich von Anfang an angewöhnen, Programme sorgfältig zu planen, so dass sich mögliche Fehler hinterher einfacher finden lassen und man auch nach Jahren noch weiß, warum man was an welcher Stelle im Programmcode geschrieben hat. Die Struktogramme enthalten einfachen klaren Text, den man beim Programmieren nur noch in die Pascal-Befehle übersetzen muss. Anhand einiger typischer Fälle aus der täglichen Praxis soll gezeigt werden, wie die Umsetzung erleichtert werden kann. Zu beachten ist, dass alle Beispiele nur Teile aus einem Hauptprogramm und somit einzeln nicht ausführbar sind. Ausnahme hiervon ist das Beispiel in Kapitel 5.8.
Wie schon im Kapitel 2.1 geschrieben, beginnt jedes Programm mit einem Programmkopf. Dieser enthält unter anderem den Programmnamen. Abbildung 10 zeigt das Struktogramm für den Programmkopf des Programmes Summe. Wie an dem zugehörigen darunterstehenden Programmcode und allen folgenden Beispielen zu sehen ist, ist die Umsetzung des Struktogrammtextes in den Pascal-Befehl recht einfach.
Das folgende Beispiel besteht aus zwei Blöcken, d.h. einer Sequenz mit zwei Rechenschritten. Im ersten Block wird der 1,15fache Variableninhalt von Netto an die Variable Brutto übergeben, und im zweiten Block erhält die Variable Wert1 den Sinuswert der halben Summe der Variableninhalte von Alpha und Beta. Die Pascal-Anweisungen unter dem Struktogramm in Abbildung 11 zeigen, dass der Text im Struktogramm nahezu 1:1 übernommen werden kann. Lediglich bei der Zuweisung muss darauf geachtet werden, dass in Pascal nicht nur ein Gleichheitszeichen, sondern ein Doppelpunkt, gefolgt von einem Gleichheitszeichen, verwendet wird. Außerdem werden die Nachkommastellen immer durch einen Punkt von den Vorkommastellen getrennt. Ein Komma würde hier zu einem Fehler führen. Mehr zu den Operatoren in Kapitel 2.4.
Brutto := Netto * 1.15;
Wertl := Sin((Alpha + Beta) 12);
Unter Zuhilfenahme einer Alternative wird im folgenden nach der Eingabe des Umsatzes in dessen Abhängigkeit der Betrag für die Verpackung bestimmt, damit die Kosten berechnet und auf dem Bildschirm ausgegeben. Auch hier ist wieder zu sehen, wie einfach die Umsetzung vom Struktogrammtext (Abbildung 12) in die Pascal-Anweisungen ist.
Mit Ausnahme der letzten Anweisung sind alle zuvorstehenden schon im Laufe dieser Serie erläutert worden, weshalb ich deshalb darauf auch nicht weiter eingehe. Das Neue an der letzten WriteLN-Anweisung ist die formatierte Ausgabe. Der Inhalt in den Klammer führt dazu, dass zuerst der Text in den Hochkommata l: 1 auf dem Bildschirm ausgegeben wird. Ihm folgt der Inhalt der Variable Kosten mit 2 Nachkommastellen und 8 Stellen insgesamt (inklusive dem Punkt). D.h. der Inhalt von Variablen lässt sich durch die Schreibweise Variablenname:Gesamtstellen:Nachkommastellen formatiert ausgeben.
Write('Bitte den Umsatz in DM ein geben: ');
ReadLN(Umsatz);
if Umsatz < 200
then Verpackung := 5.00
else
Verpackung := 0.00;
Kosten := Umsatz + Verpackung;
WriteLN ('Die Gesamtkosten betra gen DM ', Kosten:8:2);
Schon etwas komplizierter wird es bei Verschachtelungen. Während im Struktogramm (Abbildung 13) noch alles einfach (von oben nach unten) zu lesen ist, kann man bei längeren Sequenzen in den einzelnen Alternativ-Zweigen schon leicht den Faden verlieren. Hier ist es also drin-gendst zu empfehlen, ein Struktogramm zu erstellen, wenn man später noch durch das Programm durchsteigen möchte. In diesem einfachen Beispiel wird je nach Größe des Inhaltes der Variablen Zahl ein Text auf dem Bildschirm ausgegeben.
if Zahl < 100 then
if Zahl < 10 then
WriteLN('Teil B') else
WriteLN('Teil C') else
if Zahl < 1000 then
WriteLN('Teil D') else
WriteLN('Teil E');
Die kopfgesteuerte Schleife in Abbildung 14 wird genau zehnmal durchlaufen und gibt die Quadrate der Zahlen 1 bis 10 auf dem Bildschirm aus. Wie auch schon in Kapitel 5.3 wird hier die Ausgabe der Variablen Zahl und Quad auf drei Gesamtstellen formatiert. Da es sich hierbei um Variablen des Datentypes "reelle Zahlen" (z.B. Integer) handelt, entfällt die Angabe der Nachkommastellen. Vorteil der Formatierung ist hier, dass die Zahlen in den 3 Stellen rechtsbündig angeordnet werden.
for Zahl := 1 to 10 do
begin
Quad := Zahl * Zahl;
WriteLN('Das Quadrat von', Zahl:3, ' ist ', Quad:3);
end;
Verschachtelungen sind nicht nur bei Alternativen, sondern bei allen Kontrollstrukturen möglich. Das folgende Beispiel (Abbildung 15) gibt auf kürzestem Wege und ohne viel Schreibarbeit das kleine Einmaleins aus. Durch den Einbau einer Alternativen (Abbildung 16) wird die Ausgabe noch ein wenig verfeinert - hier wird, sobald das Produkt größer als 50 ist, ein kurzer 440 Hz-Ton ausgegeben. Die Funktion Sound(Frequenz) startet die Tonausgabe, die Funktion Delay(Zeit in Millisekunden) hält das Programm für die angegebene Zeit an (der Ton wird weiterhin ausgegeben) und die Funktion No-Sound schaltet die Tonausgabe wieder ab. Alle 3 Funktionen benötigen die Unit Crt, die im Deklarationsteil mit der Anweisung Uses Crt eingebunden werden muss (mehr dazu im Kapitel 5.8).
for X := 1 to 10 do
for Y := 1 to 10 do
begin
Prod := X * Y;
WriteLN{X:4, Y:4, Prod:4);
end;
for X := 1 to 10 do
for Y := 1 to 10 do
begin
Prod := X * Y;
WriteLN(X:4, Y:4, Prod:4);
if Prod < 10 then
begin
Sound(440);
Delay(l00);
NoSound;
end;
end;
Die fußgesteuerte Schleife in Abbildung 17 wird solange ausgeführt, bis der Inhalt der Variablen Zahl größer 99 ist. Somit wird die Schleife, da der Inhalt der Variablen Zahl zu Beginn 10 ist und bei jedem Durchlauf um 1 erhöht wird, 90mal durchlaufen.
Zahl :- 10;
repeat
Zahl := Zahl + l;
until Zahl > 99;
Die fußgesteuerte Schleife in Abbildung 18 macht eine Ausgabe auf dem Bildschirm, wartet auf eine Eingabe, die an die Variable Antwort übergeben wird, und wird solange durchlaufen, bis ein kleines oder großes "J" eingegeben wurde. Nach jeder Eingabe wird ein 800 Hz-Ton für 100 ms ausgegeben. Neu in der Abfrage der Abbruchbedingung ist der Mengenvergleich. Mit dem Mengenvergleich können Variablen (in diesem Fall vom Datentyp char) darauf überprüft werden, ob ihr Inhalt einem Element einer Menge, hier die Ascii-Zeichen 106 und 74, entspricht.
Zahl := 10;
repeat
write('Soll das Programm fortgesetzt werden? j/n');
readln(Antwort);
Sound(440);
Delay(100);
NoSound;
until Antwort in ['j', 'J'];
Zum Schluß dieses dritten Teiles des Programmierkurses zeige ich noch die allgemeine Codierung eines Pascal-Programms, das nach Bestätigung beliebig oft wiederholt werden kann. Der Programmcode unter Abbildung 19 zeigt auch den allgemeinen Aufbau eines PASCAL-Programmes. Begonnen wird mit dem Programmkopf, der den Programmnamen "Addition" festlegt. Nach dem Löschen des Bildschirmes beginnt im Hauptprogramm eine fußgesteuerte Schleife, die beliebige Kontrollstrukturen und Sequenzen beinhalten kann. Am Ende dieser Schleife wird der Cursor mit dem Befehl GotoXY(Spalte, Zeile) an die gewünschte Position auf dem Bildschirm gesetzt und dort mit der Bildschirmausgabe der Wiederholungsabfrage fortgefahren. Das Programm mit den Anweisungen und Funktionsaufrufen innerhalb der Schleife wird solange wiederholt, bis ein kleines "n" bei der Abfrage eingegeben wird.
Zwischen dem Programmkopf und dem Hauptprogramm steht der Deklarationsteil. Hier wird die Unit Crt eingebunden, da diese für die Funktionen ClrScr zum Bildschirmlöschen und GotoXY() zum Positionieren des Cursors benötigt wird. Werden weitere Funktionen aus anderen Units benötigt, so werden sie in der gleichen Anweisung durch Komma getrennt aufgelistet. Nach den Units folgt die Deklaration aller benötigten globalen Variablen. In diesem Fall ist es nur die Variable Antwort vom Datentyp char, die zur Abfrage der Wiederholungsbedingung benötigt wird. Werden weitere benötigt, so werden diese ebenfalls an dieser Stelle deklariert.
program Addition;
uses crt;
var Antwort: char;
begin
ClrScr;
repeat
GotoXY(10,24)
write('Programm wiederholen? j/n') ;
readln(Antwort);
until Antwort = "n";
end.
Um die Beispiele nachvollziehen zu können, sollten Sie sich nach dem Durchlesen dieser Folge die Zeit nehmen und das letzte Beispiel dazu benutzen, alle anderen Beispiele ab Kapitel 5.3 auszuprobieren. Sie können die Anweisungen an Stelle der 3 untereinanderstehenden Punkte einfügen. Zur Übung ist es auch wichtig, herauszufinden, welcher Datentyp für welche Variable am besten paßt, weshalb in den Beispielen die benötigten Datentypen absichtlich nicht genannt worden sind.
In der nächsten Folge dieser Reihe werden dann Unterprogramme (Prozeduren) behandelt. Bis dahin sollten Sie sich in jedem Fall mit dem bisher Geschriebenen vertraut gemacht haben, da dieses zum weiteren Verständnis vorausgesetzt wird.