The following article was printed in issue 12'91/1'92 of the magazine „PC AMSTRAD INTERNATIONAL".
A base article programming loops with Turbo Pascal and Basic.
|
|
Schöne Schleifchen
Pascal-Kolleg: Schleifenprogrammierung in Turbo Pascal und Basic
Auch diese Folge des Pascal-Kollegs bietet wieder allen Joyce- und CPC-Programmierern, die mit Turbo Pascal arbeiten, Grundlagenwissen rund um Code und Struktur.
Diesmal geht es um Schleifenkonstruktionen und das nötige Drumherum.
In praktisch allen höheren Programmiersprachen kennt man Zählschleifen.
Ihr Zweck besteht darin, daß ein bestimmter Anweisungsblock mehrfach abgearbeitet wird und die Anzahl der Durchläufe von vornherein feststeht.
In FORTRAN gibt es hierzu zum Beispiel die DO-Anweisung, in LOGO den REPEAT-Befehl und in BASIC die FOR..TO-Konstruktion mit der Option STEP.
Etwas Ähnliches kennt natürlich auch Pascal:
Es gibt die FOR..TO..DO-Schleifen (für wachsenden Laufindex) und FOR..DOWN-TO..DO-Schleifen (für fallenden Laufindex).
BASIC
FOR <Var> = <Wert1> TO <Wert2> STEP <Schrittweite>:NEXT <Var>
WHILE <Bedingung = Wahr> WEND
PASCAL
FOR <Var1> = <Wert1> TO <Wert2> DO <Ausführung>
REPEAT <Ausführung> UNTIL <Bedingung = Wahr>
WHILE <Bedingung = True> DO <Ausführung>
|
|
Alle Schleifenfimktionen in Pascal und Basic auf einen Blick
|
Jedoch ist ein wichtiger Unterschied zu beachten.
In Pascal darf der Laufindex nicht vom Typ REAL sein, während das in BASIC die Regel ist.
In Pascal kommen nur die sogenannten Ordinaltypen in Frage, wie zum Beispiel die ganzen Zahlen (Integer) und die Zeichen (Char).
Das folgende BASIC-Programm dient dem Ziel, eine Tabelle der Quadrate aller Zahlen zwischen eins und drei mit der Schrittweite 0.05 zu erzeugen:
10 FOR X=1 TO 3 STEP 0.05
20 PRINT X,X×X
30 NEXT X
Die Variable X steht in diesem BASIC-Programm unzweifelhaft für eine REAL-Zahl.
Wie können wir jedoch das gegebene Programm in Pascal übersetzen?
Versuchen wir zunächst einmal eine Konstruktion mit eine Zählerschleife!
Benötigt wird ein Laufindex, den wir als INTEGER-Variable L wählen.
In welchen Grenzen soll L variieren?
Dazu müssen wir berechnen, wieviele Werte benötigt werden.
Von X=1 bis X=2 sind es zwanzig, von X=2 bis X=3 noch einmal zwanzig;
zusammen macht das ... 41, denn den letzten Wert drei dürfen wir nicht vergessen.
Es ist daher sinnvoll, den Wert L von eins bis 41 laufen zu lassen.
Als nächstes muß aus dem jeweiligen Wert von L (der als solcher niemanden ernsthaft interessiert) der eigentlich gemeinte Real-Wert X ermittelt werden.
Dazu stellen wir eine kleine Tabelle auf:
für L=1 wollen wir X=1,
für L=2 wollen wir X=1.05,
für L=3 wollen wir X=1.10,
für L=4 wollen wir X=1.15,
...
REAL - Schleifen in PASCAL
Ein bißchen Nachdenken führt zu dem Ergebnis, daß der Wert der Hauptvariablen X aus L allgemein wie folgt berechnet werden kann:
X:=1+(L-1)×0.05
Damit sind wir schließlich in der Lage, den entsprechenden Pascal-Programmteil zu schreiben:
Var L:Integer; X:Real;
...
For L:=1 To 41 Do
Begin
X:=1+(L-1)×0.05
WriteLn(X:10:4, X×X:10:4);
End;
Dieses Programmstück ist korrekt, jedoch erscheint die Umrechnung von L in X kompliziert.
Aufgabe 1:
Es ist besser, die Schleife von
L:=0 bis 40 laufen zu lassen.
Formulieren Sie das entsprechende Programmstück!
[Lösung]
Auf jeden Fall lauern in der mentalen Arithmetik Fehlerquellen, auch wenn man sich das Leben durch geeignete Wahl der Grenzen vereinfacht.
Und ist es nicht ärgerlich, für einen solch simplen Vorgang einige Minuten Denkarbeit investieren zu müssen?
Glücklicherweise bietet die Sprache Pascal weitere Konstruktionen zur Erzeugung von Schleifen:
Es gibt noch die REPEAT..UNTIL-Schleifen und die WHILE..DO-Schleifen.
Exemplarisch werden wir die eben als FOR..TO-Schleife realisierte Konstruktion nun als REPEAT..UNTIL-Schleife formulieren.
Die Laufvariable L wird hier nicht mehr benötigt.
Die Real-Variable X wird anfangs auf den Startwert X=1 gesetzt und danach so lange in Schritten von 0.05 heraufgezählt, bis der Endwert überschritten ist.
Var X:Real; {Vorsicht!}
...
X:=1;
Repeat
WriteLn(X:10:4,X×X:10:4);
X:=X+0.05;
until X:=3.05;
Der Vorteil einer solchen Konstruktion ist — neben dem Einsparen der Variablen für der Laufindex — das Vermeiden der umständlichen Umrechnung von der Laufvariablen L in die Hauptvariable X.
Allerdings liegt hier noch ein Haar in der Suppe:
In der angegebenen Konstruktion ist ein Fehler verborgen, der sich erst zur Laufzeit bemerkbar macht.
Aufgabe 2:
Worin liegt der Fehler und wie kann er behoben werden?
[Lösung]
Wolfgang J. Weber/
Andreas Knösel/rs
Scanned by
Werner Cirsovius
August 2007
© DMV-Verlag