Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Hauslekture. Методическое пособие - Ситникова О.А., Галкина О.В

..pdf
Скачиваний:
67
Добавлен:
24.05.2014
Размер:
466.19 Кб
Скачать

bekannten Verfahren geht das gar nicht. Und ansonsten ist 32767 auch nicht so toll, manchmal will man doch etwas höher hinaus (oder auch etwas tiefer stapeln). Es muß also ein weiterer Datentyp her, der auch gebrochen rationale Zahlen aufnimmt. Hier wendet man einen Trick an. Man zerlegt eine solche reelle Zahl in zwei Teile, die Mantisse und einen Exponenten. Das ist nicht weiter schlimm, denn jede Zahl kann man in einer Exponentialform schreiben. Als Basis für dem Exponenten nimmt man aber die Zahl 2, weil wir ja im Dualsystem arbeiten! Die Mantisse wird ebenfalls im Dualsystem abgelegt, die Tabelle auf Seite 10 kann nämlich nicht nur nach unten, sondern auch nach oben verlängert werden! Verwendet man sieben Bit für den Exponenten, ein Bit für das Vorzeichen des Exponenten, sieben Bit für die Mantisse und ein Bit für das Vorzeichen der Mantisse, erhält man auch wieder 16 Bit, die aber jetzt eine völlig andere Bedeutung haben. Man sieht, so ein Compiler hat es auch nicht leicht.

Fassen wir zusammen: Für Zahlen gibt es zwei verschiedene Datentypen. Ganze Zahlen können im Bereich -32768 bis +32767 dargestellt werden. Diesen Datentyp nennt man INTEGER. Sein Vorteil: Jede Zahl wird exakt dargestellt, es gibt keine Fehler durch die Umrechnung ins Dualsystem.

Andere die Darstellung für reelle Zahlen. Durch die Umrechnung ins Dualsystem und die dort begrenzte Stellenzahl geht etwas von der Zahl verloren, die exakte

Darstellung ist nicht garantiert. Dieser Datentyp heißt REAL. Er reicht von :p2.5 * КГ33 bis ±2.5 * 10+33.

Soweit die Zahlen. Es gibt noch zwei Datentypen, die zum Standard von Pascal gehören. Dies ist zum einen der Typ CHAR, der in der Lage ist genau ein Zeichen aufzunehmen. Unter Zeichen versteht man einen Buchstaben, eine Ziffer oder ein Sonderzeichen. Eine Ziffer, die als CHAR-Datentyp verwendet wird, verliert ihre Bedeutung als Zahl! Näheres dazu folgt später.

Der vierte Datentyp ist ein ganz kleiner, aber feiner. Er nennt sich BOOLEAN und kann die beiden Zustände TRUE für wahr und FALSE für Falsch annehmen.

Fassen wir zusammen: Pascal kennt die vier Grunddatentype INTEGER, REAL, CHAR und BOOLEAN. Sie decken alle Bedürfnisse für die Speicherung von Daten ab. Durch Zusammenfügen dieser Datentypen lassen sich auch komplizierteste Strukturen bilden

17. Bezeichner

Typen haben wir jetzt, aber noch keine Einzelexemplare dieses Typs. Diese Einzelexemplare nennt man Variablen. Sie stellt das eigentliche Speichermedium dar, der Typ gibt nur über die Bedeutung der zugehörigen Speicherstellen Auskunft.

Nun legt der Compiler eine Variable an irgendeiner Stelle im beliebig großen Hauptspeicher ab. Und er wird uns niemals freiwillig verraten, wo er das getan hat.

Wie kommen wir also an den Inhalt einer Variable. Nun, jede Variable braucht einen Namen oder Bezeichner. Man kann diese Bezeichnung mit den Gewurzgläsern

51

in der Küche vergleichen. Alle Gläser sehen von vorne gleich aus, erst dag Ettikett (der Bezeichner) unterscheidet sie voneinander.

Wie sieht nun so ein Bezeichner aus? In 5.1 kam mit programmname bereit, ein solcher Bezeichner vor. Hier nun die Spielregeln für die Bildung eines Bezeichnete:

Ein Bezeichner besteht aus einer Folge von Zeichen.

Das erste Zeichen muß ein Buchstabe sein.

Die weiteren Zeichen können Buchstaben oder Ziffern sein. In Tfcrbo-Paecal ist auch das Zeichen . (Unterstrich) als Buchstabe erlaubt.

Verboten sind alle anderen Zeichen, vor allem das Leerzeichn, der Punkt und

die sogenannten Sonderzeichen $,

%, (, ) usw. Auch die

deutschen Umlaute ä,

o, u und ß gehören in die Kategorie Sonderzeichen!

 

Beispiele

für

korrekte

Bezeichner:

Pi

 

 

 

Donaudampschiffahrtskapitaensanwaerter Ypsilon

G22345

J0815

Ungültig sind dagegen ISS (weil da* erste Zeichen kein Buchstabe ist) und

Müller

(weil das „ü" kein Buchstabe sondern ein Sonderzeichen ist.

Standardbezeichner

Mit jedem Pascal-System werden ein Satz von fertigen Funktionen mitgeliefert die man im tägliche Leben braucht, dazu gehören z.B. die mathematischen Funktionen zum Loganthmieren, für Sinus und Cosinus usw.

Die Funktionen werden unter einem Bezeichner verfügbar gemacht. Dieser heißt in der Regel so wie man es erwartet, also »in, со», log usw. Diese Namen müssen nicht so verwendet werden, wie sie vom Erfinder gedacht sind, aber sie sollten. Wer will scnon das Rad immer wieder neu erfinden?

18. Variablendeklaration

Jetzt können wir daran gehen, unseren Deklarationsteil mit Inhalt zu füllen. Der Variablen-Deklarationsteil beginnt mit dem Schlüsselwort VAR. Dahinter werden die Bezeichner aufgelistet und mit ihrem Typ versehen. In einer Zeile können mehrere Bezeichner vom selben Typ stehen. Jede Zeile wird mit einem Semikolon (Strichpunkt) abgeschlossen. Mehrere Bezeichner werden durch Komma getrennt, die Trennung von Bezeichner und Datentyp erfolgt durch einen Doppelpunkt (:). Ein Variablendeklaration sieht also so aus:

52

VAR anfangende: REAL;

 

zaehler,summe:

IITEGER;

eingäbe,auswahl: CHAR;

 

Wenn wir den Programmkopf dazunehmen, ergibt sich folgendes Bild:

PROGRAM

programmname;

VAR anfangende: REAL;

 

zaehler,summe: IHTEGER;

 

eingäbe, aus wähl: CHAR;

 

19. Konstantendeklaration

Man wird sehr schnell merken, daß es neben Variablen (mit variablem Inhalt) auch solche Daten gibt, die sich im Laufe eines Programmes nicht ändern. Diese Daten nennt man Konstanten. Eine Konstante stellt einen unveränderlichen Wert dar. Der Compiler macht nichts anderes, als überall dort, wo die Konstante im Programm auftaucht den entsprechenden Wert einzusetzen. Auf den ersten Blick mag das keinen besonderen Sinn machen, aber auf den zweiten Blick sieht das anders aus. Nehmen wir eine Finanzbuchhaltung. In einer solchen Anwendung wird sehr oft mit der Mehrwertsteuer operiert, und überall, wo das passiert, steht der Faktor 0.14. Wird jetzt der Steuersatz geändert, müssen alle (!) Stellen, an denen diese 0.14 stehen geändert werden. Da kann man leicht den ein oder anderen Fall vergessen. Gibt es dagegen eine Konstante für den Steueresatz, wird an einer (!) Stelle geändert und die Sache ist erledigt! Konstantendefinition:

COHST

Bezeichner

=

Wert;

Beispiele:

Steuersatz

=

 

COHST

0.14;

Pi = 3.1415926;

 

 

 

Im übrigen gelten hier dieselben Regeln wie für die Variablendeklaration. Üblicher-

weise schreibt man bei Konstanten den ersten Buchstaben auch groß.

20. Der Anweisungsteil

Zum vollständigen Programm fehlt nur noch der Anweisungsteil. Der einfachste Anweisungsteil ist der leere Anweisungsteil und der besteht lediglich aus:

BEGIH

EID.

Die (hier nicht vorhandenen) Anweisungen stehen zwischen BEGIB und EID geklammert (man nennt das einen Block). Der Punkt am Schluß zeigt das Ende des Programms an. Unser gesamtes Programm sieht also so aus:

PROGRAM soJeann^es-sein; COHST Steuersatz = 0.14; VAR anfangende:

REAL;

zaehler,summe: IITEGER;

53

eingäbe,

aus

 

wähl:

 

 

CHAR;

BEGIH

 

 

 

 

 

 

 

(*

Achtung:

Dieses

Programm

tut

nichts

!!!

*)

EID.

 

 

 

 

 

 

 

Zwischen die Blockbefehle BEGII und EID hat sich eine Zeile gemogelt, die man als Kommentar bezeichnet. Alles was zwischen (* und *) steht, wird vom Compiler ignoriert. Daher sind hier auch alle möglichen und unmöglichen Sonderzeichen erlaubt, lediglich das Schachteln von Kommentaren ist verboten. Ein Kommentar ist überall da erlaubt, wo auch Leerzeichen stehen dürfen.

Nun zu den eigentlichen Anweisungen. Neben der (trivialen) leeren Anweisung gibt es natürlich auch viele andere, denn sonst hätten wir mit unseren Struktogrammen doch leichte Probleme bei der Umsetzung.

21.Die Wertzuweisung

Die Wertzuweisung hat die Form:

Bezeichner := Ausdruck;

Was ein Bezeichner ist, wissen wir ja, aber ein Ausdruck? Unter Ausdruck versteht man hier genau dasselbe wie in der Mathematik. Der einfachste Ausdruck ist eine einzelne Variable, kompliziertere Ausdrücke bestehen aus mehreren Variablen mit den üblichen Rechenzeichen dazwischen.

Pascal kennt neben +,-,* und / noch weitere Operatoren, die zum Teil auf bestimmte Datentypen beschränkt sind:

Multiplikationeoperatoren: Operatoren für Multiplikation schließen auch die für die Division mit ein. Dazu gehören * und /. Das / ist aber nur für reelle Daten brauchbar und erlaubt. Die entsprechenden Operatoren für Integerdaten lauten MOD und DIV, DIV liefert den ganzzahligen Anteil einer Integer-Division, MOD liefert den dabei verbleibenden Rest.

Additionsoperatoren: Dazu gehören die hinlänglich bekannten Operatoren + und —, die das machen, was man auch erwartet.

Vergleichsoperatoren: Diese Operatoren braucht man (wie sollte es anders sein) für den Vergleich zweier Ausdrücke. Diese Operatoren lauten =, <, >,<> (für ungleich), >= und <=.

Logische Operatoren: Für Kombinationen aus mehreren Ausdrücken stehen zusätzlich noch die Operatoren HOT, AHD und OR zur Verfügung.

Bei der Verknüpfung der Terme zu Ausdrücken gelten die allgemeinen Regeln wie „Punktrechnung geht vor Strichrechnung'' usw. Wenn das nicht so gewünscht ist, muß man entsprechend Klammern setzten. Aber zur Erhöhung der Unübersichtlichkeit kann man nur die einfache runde Klammer ( und ) verwenden.

54

Besonders vorsichtig muß man bei Kombination vom logischen und arithmetischen

Ausdrücken sein. AHD, OR und HOT haben in diesem Fall die höchste Priorität. Beispiel:

PROGRAM Mas.und-Moritz ; COHST Pi=3.14159S6;

VAR x,y,j/?ua,nu//s<e//e:REAL; (tenn:IMTEGER;

c.-CHAR; 0e/unden.-BOOLEAH; BEGIH

x:= (y + x) / (y-x); nullstelle := Pi * x / y; yqua := Sqr ( у );

c:= 'A';

kenn := Ord(c);

gefunden := kenn = ord(c);

EHD.

Bemerkungen zu diesem Beispiel:

Um ein einzelnes Zeichen (man nennt so etwas auch eine Zeichenkonstante) einer Variablen vom Typ CHAR zuzuweisen, muß man diese in einfache Hochkomma setzten. Verwendet werden die nach rechts oben zeigenden Hochkomma, keine anderen!

Soll das Hochkomma selbst verwendet werden, muß es verdoppelt werden!

Standardfunktionen (wie Ord oder Sqr) können wie Variablen verwendet werden. Die Variable in Klammern nennt man Parameter oder Argument für die

Funktion. Es wird der Funktionswert für die angegebene Variable berechnet und zurückgegeben.

Selbstverständlich ist es erlaubt, auch kompliziertere Ausdrücke an eine Funktion zu übergeben, gültig ist jeder Ausdruck, auch eine Funktion selbst! So ist die Anweisung у :=• Sqr(Sqr(y)); eine gültige Zuweisung, um y4 zu berechnen und an die Variable у zuzuweisen.

Eine Übersicht über die vorhandenen Standardfunktionen findet sich auf Seite 35.

• Taucht ein und dieselbe Variable auf beiden Seiten einer Zuweisung auf, ist das kein Fehler. Man darf eine Zuweisung nicht durch „gleich" im allgemeinen Sprachgebrauch ausdrücken, sondern durch „ergibt sich zu". Die PascalAnweisung z := x + l; muß man so lesen: Nimm den momentanen Wert von x, zähle l dazu und lege das Ergebnis wieder in x ab. Dies ist eines der gebräuchlichsten Verfahren, um einen Zähler zu erhöhen.

• Pascal-Schlüsselworte und Bezeichner dürfen nicht durch Leerzeichen auseinandergerissen werden. Das gilt auch für die Operatoren zu denen auch der Zuweisungsoperator „:=" gehört.

55

22. Das Semikolon

Das Semikolon ist in der deutschen Sprache ein eher unbedeutendes Satzzeichen. In Pascal ist das aber anders. Hier spielt das Semikolon eine zentrale Rolle. Ein Semikolon steht in einem Pascalprogramm immer zwischen zwei Anweisungen. Anders ausgedrückt: Das Semikolon trennt zwei Pascal-Anweisungen voneinander, es beendet die Anweisung nicht!

Dies sollte man sich bei bei langen Anweisungen (die über mehrere Zeilen gehen), wie z.B. der IF-THEH-ELSE-Anweisung zu Gemüte führen. Diese Anwesiung ist erst hinter dem ELSE-Zweig zu Ende und nicht davor!!!

23. Einfache Einund Ausgabe

Wir können jetzt wunderbare Berechnungen mit unseren Pascal-Programm ausführen, nur erfahren wir nichts von den Ergebnissen. Irgendwie muß etwas auf den Bildschirm!

24. Ausgabeanweteungen

Zur Ausgabe der uns bekannten Datentypen gibt es die Prozedur Write bzw. WriteLn. Die beiden Buchstaben Ln sorgen nach einer Ausgabe dafür, dafi die nächste Ausgabe in einer neuen Zeile beginnt.

Aber wie gibt man aus? Nun, das geht analog zu der Verwendung von Standardfunktionen. Hinter WriteLn oder auch Write wird in Klammern eine Liste von Ausdrucken angegeben, die dann ausgegeben werden. Eine Liste ist eine Folge von gleichartigen Objekten, hier sind es Ausdrucke, die durch Kommas getrennt werden. Übrigens sind die Prozeduren für die Einund Ausgabe die einzigen, die eine variable Anzahl von Parametern verarbeiten können!

Wenn wir das Programm aus 5.1.2.1 verwenden, sind folgende Ausgabeanweisungen möglich:

WriteLnfkenn);

Write(gefunden,x,nullatelle);

WriteLn;

WriteLnf Sqr ( у ));

WriteLnf'Der Wert von у beträgt:',y);

Bemerkungen zu diesem Beispiel:

Eine IVrtteLn-Anweisung ohne Parameter erzeugt einen Zeilenvorschub.

In einer UVifeLn-Anweisung können alle bisher bekannten Datentypen beliebig verwendet werden.

Text in Hochkomma wird genau so ausgegeben, wie er innerhalb dieser Hochkomma vorkommt. Innerhalb von Hochkomma sind alle Zeichen erlaubt, also auch Leerzeichen, Sonderzeichen und Umlaute.

56

25. Formatierung der Ausgabe

Wenn man die obigen Anweisungen einmal ausprobiert, stellt man sehr schnell fest, daß die Ausgabe anders aussieht als erwartet. Vor allem das Format der REALZahlen laß sehr zu wünschen übrig. Enthält die Variable у den Wert 5, liefert die Zeile Writeln(Sqr(y)); die Ausgabe 2.5000000000E+01. Das ist mehr als nur schwer lesbar, denn eine einfache 25 würde uns vollkommen genügen. Auch eine 25.00 wäre ganz nett.

Diese von Pascal normalerweise verwendete Ezponentialdarstellung wird immer dann für REAL-Zahlen verwendet, wenn man als Programmierer nichts anderes sagt. Wir wollen aber etwas anderes, nämlich 25.00. Dies gelingt durch die Verwendung der sogenannten Formatierungsparameter in der Ausgabeanweisung. Man gibt unmittelbar (!) an den zu formatierenden Ausdruck zwei IITEGER-Werte durch Doppelpunkt getrennt, mit an. Der erste Wert steht für die Gesamtstellenzahl, die der auszugebende Wert annehmen soll, der zweite für die Zahl der Nachkommastellen. Man nennt den ersten Wert auch Feldbreite. Ändern wir unsere Ausgabeanweisung um in WriteLn(sqr(y):6:S); so erhalten wir das gewünschte Ergebnis 25.00, weil :6:2 uns eine sechsstelliges Feld mit zwei Nachkommastellen vorgibt. Der auszugebende Wert wird immer rechtsbündig in das Feld eingestellt. Damit ist es möglich, eine Tabelle auszugeben, bei der alle Dezimalpunkte (Kommas gibts es bei Zahlen nur in Deutschland) untereinander stehen.

Aber was passiert, wenn die Feldbreite zu schmal gewählt wurde? Dann denkt unser Compiler mit (ausnahmsweise) und fügt die fehlenden Stellen vorne an. Das bedeutet, es wird nichts abgeschnitten oder gekürzt, sondern die Feldbreite wird automatisch entsprechend vergrößert. Dieser Fall ist für Tabellen absolut unerwünscht, weil dann die Tabellenstruktur zum Teufel geht, aber in Fließtext (so wie in diesem Text) genau das Richtige. Soll nämlich eine Ausgabe so nah wie möglich an den vorherigen Text herangerückt werden, verwendet man eine Feldbreite von l, die dann automatisch so weit vergrößert wird, wie es im Moment erforderlich ist. Dadurch werden die im Fließtext störenden, führende Leerzeichen verhindert.

Man muß für die Formatierungsparameter übrigens keine festen Zahlen angeben, erlaubt ist ein beliebiger Ausdruck, der einen IHTEGER-Wert zurückliefert! Damit kann man dann die Feldbreiten im Programm selbst ausrechnen lassen, was man in manchen Fällen durchaus braucht. Aber auch mit Konstanten kann man hier viel an Übersichtlichkeit gewinnen.

Soweit die Formatierung für REAL-Werte. Das Prinzip funktioniert aber für alle bisher bekannten Datentypen, nur daß es keine Nachkommastellen gibt. Die Anweisung WriteLn (gefunden:20) schreibt den Inhalt von gefunden rechtsbündig in ein 20 Zeichen breites Feld und füllt vorne mit Leerzeichen auf. Das Ergebnis sieht (ungefähr)2 so aus FALSE. Einfach mal ausprobieren.

Nachkommastellen gibt es aber nur bei reellen Zahlen, daher darf man auch nur dann Nachkommastellen verlangen, wenn es welche gibt. Handelt es sich um ganze Zahlen (IHTEGER oder CHAR), darf man nur die Feldbreite angeben, sonst gibts Ärger.

57

26. Eingabeanweisungen

Wenn man etwas ausgeben kann, möchte man natürlich auch ewas eingeben. Und wenn die Ausgabe WriteLn heißt, kann man durch geschicktes Raten darauf kommen, daß die Eingabe ReadLn heißt. Auch hier gibt es die Form ohne Ln, dazu später mehr.

Was bei der Ausgabe geht, geht auch bei der Eingabe, nämlich mehrere Argumente als Parameter. Die Anweisung ReadLn (y,i,z,eingäbe) liest von der Tastatur die Inhalte für die vier Variablen y, x, z und eingabt ein. Die Eingabe erfolgt in einer Zeile, die verschiedenen Werte werden durch mindestens ein Leerzeichen getrennt.

Das Ende der Eingabe wird auf dem PC durch die Enter-Taste angezeigt. Die davor stehenden Werte werden dann in einen internen Puffer kopiert, aus dem dann der Pascal-Compiler wirklich liest. Werden mehr Werte eingegeben, als mit ReadLn gelesen werden, wird der Rest der Eingabe ignoriert.

Anders, wenn man mit Read arbeitet. Read behält die Eingabe im Puffer und liest beim nächsten Mal weiter aus dem Puffer. Leider arbeitet diese Funktion in TurboPascal nicht ganz fehlerfrei, so daß es in einigen Fällen passieren kann, das eine Eingabe nicht erfolgt, weil nach Meinung von Turbo-Pascal 4.0 noch etwas im Puffer ist, obwohl genau dieser Wert schon einmal gelesen wurde. Read sollte daher nur in besonderen Fällen verwendet werden.

27. Eingabeaufforderungen

Eine Eingabe allein macht noch keinen Sinn. Erst die Kombination von einer (sinnvollen) Eingabeaufforderung und anschließender Eingabe bringts so richtig. Denn was hilft es dem späteren Programmanwender, wenn auf dem Bildschirm ein kleiner Strich (genannt Cursor) blinkt und niemand weiß, warum nichts passiert und es nicht weiter geht.

Im Gegensatz zu anderen Programmiersprachen kennt nämlich Pascal keinen kombinierten Ein-/Ausgabebefehl. Man muß sich also einen solchen Befehl selbst basteln. Er besteht in der Regel aus einer Textausgabe der Form Wrt'fef'Bitte Wert für xxx eingeben:'); und einem anschließendem ReadLn(xxx);. Die Verwendung von Write anstelle von WriteLn stellt sicher, daß die nachfolgende Eingabe unmittelbar hinter dem ausgegebenem Text steht. Umgekehrt sorgt ReadLn dafür, daß die nächste Textausgabe wieder in einer neuen Zeile beginnt. Ein angenehmer Nebeneffekt ist, daß auch der TZeorf-Fehler von Turbo-Pascal umschifft wird.

Zu beachten ist dabei, daß das xxx in der Write Anweisung als Text in Hochkomma steht, d.h. es muß nicht unbedingt der Variablenname sein.

28. Standardfunktionen und –bezeichner

58

Pascal kennt von Haus aus eine Reihe Funktionen und Prozeduren,4 die-erst ein sinnvolles Arbeiten mit der Sprache ermögichen. Die beiden Standardprozeduren WriteLn und Readln haben wir schon besprochen.

Darüberhinaus gibt es grundsätzlich folgende Standardfunktionen: Die Parameter der Funktionen haben folgende Bedeutung:

x Eingabetyp REAL

i Eingabetyp INTEGER

s Eingabetyp Skalar (CHAR, INTEGER, BOOLEAN, nicht REAL) F Eingabetyp Datei (File)

Selbstverständlich gilt auch hier: in der runden Klammer darf nicht nur eine einfache Variable stehen, sondern ein beliebiger Ausdruck, der ein Ergebnis des erforderlichen Typs liefert.

Die hier genannten Funktionen sind in allen Pascal-Compilern implementiert =vorhanden). Turbo-Pascal verfügt über einen deutlich erweiterten Funktionsumfang. Um den Compiler nicht zu sehr aufzublähen, werden diese zusätzlichen Funktionen zu Bibliotheken zusammengefaßt und nur bei Bedarf eingebunden. Näheres dazu in 7.4 und im Anhang A.l

29. Anweisungsfolgen

Stillschweigend haben wir bisher die Anweisungsfolge verwendet, ohne zu wissen, wie das eigentlich geht.

Unser Beispielprogramm auf Seite 30 macht ausführlich davon gebraucht. Dort werden mehrere Anweisungen nacheinander durchgeführt. Zwischen den Anweisungen steht ein Semikolon (Strichpunkt). Die Betonung liegt auf „zwischen", das ist nicht dasselbe wie „hinter". Damit ist auch die häufigste Frage in den Übungen (Muß da jetzt ein Semikolon hin?) beantwortet: Zwischen Anweisungen immer, aber nicht innerhalb von Anweisungen oder hinter der letzten Anweisung.(siehe dazu auch Seite 31.)

Im nächsten Abschnitt haben wir das Problem, daß in der Verzweigung in jedem Zweig nur eine Anweisung erlaubt ist. Das ist aber ziemlich wenig. Hier erlaubt Pascal einen Trick: Überall da, wo in Pascal nur eine Anweisung erlaubt ist, kann man durch Klammerung mit BEGII und EID beliebige Anweisungen zu einem Block zusammenfassen. Dieser Block verhält sich nach außen wie eine Anweisung. Und wie das in Pascal üblich ist, darf natürlich in einem Block ein neuer Block eingeschachtelt werden, darin wieder einer usw. bis man keine Lust mehr hat.

30. Alternative

Die Alternative baut eine Verzweigung in den Programmablauf ein (siehe Seite 19). Die magischen Worte Wenn, Dann und Sonst kann man direkt ins Englische übersetzen, um die richtigen Pascal-Schlüsselworte zu erhalten. Sie lauten IF, THE!

59

und ELSE. Zwischen diese muß Füllstoff, hinter IF die Bedingung, hinter THEI und ELSE jeweils eine Anweisung. Formal schreibt man das so:

IF Bedingung THEI Anweisung! ELSE AnweisungS

Unter Bedingung versteht man einen beliebigen Ausdruck, der aber ein Ergebnis vom Typ BOOLEAI haben muß. Das kann ein einfacher Vergleich (z.B. x > y) sein bis hin zu komplexen Ausdrücken, die mit mehreren logischen Operatoren verknüpft sind (z.B. ((x < y) AID (x > 17) AID IOT(y < 55))). Je komplexer ein Ausdruck, desto eher muß man auf korrekte Klammerung achten, um nicht mit den Prioritäten bei der Berechnung der Ausdrücke in Kalamitäten zu kommen.

Anweisung l und AnweisungS werden entsprechend den Regeln für Anweisungen gebildet. Das geht von der leeren Anweisung bis hin zu einem beliebigen Anweisungsblock. Eine Besonderheit stellt der Fall der leeren Anweisung im ELSE Zweig dar, dann darf das Schlüsselwort ELSE entfallen. Unsere allgemeine Form sieht dann so aus:

IF Bedingung THEI Anweisung

Diesen Fall nennt man dann bedingte Anweisung,, weil Anweisung nur ausgeführt, wird, wenn die Bedingung erfüllt ist.

31. Wiederholungen

Aus Abschnitt 4.3 wissen wir, daß es zwei Arten von Wiederholungen (oder Schleifen) gibt, die fußgesteuerte und die kopfgesteuerte Schleife.

32. Fußgesteuerte Schleifen

Bei dieser Schleifenvariante wird der Schleifenkörper zuerst durchgeführt und dann erst die Abbruchbedingung geprüft. Charakteristisch im Algorithmus waren die Worte wiederhole und bis. Die englische Überstzung liefert auch hier die richtigen Schlüssel-Worte REPEAT und UITIL. Dazwischen steht der Schleifenkörper, hier dürfen sogar mehrere Anweisungen stehen, die nicht mit BEGII und EID geklammert werden müssen. Formal sieht die fußgesteuerte Schleife so aus:

REPEAT

Anweisung(en) UITIL Bedingung

Bedingung ist auch hier wieder ein Ausdruck, der ein Ergebnis vom Typ BOOLEAI liefert.

33. Kopfgesteuerte Schleifen

Hier wird erst die Bedingung geprüft, und dann eventuell der Schleifenkörper durchgeführt. Diese abweisende Schleife ist im Algorithmus an den Worten solange

60