GFA-Kurs (2)

Nachdem ich im ersten Teil einige nützliche und teilweise sogar unentbehrliche Tools vorgestellt habe, werde ich in diesem zweiten Teil eine kleine Einführung zur Programmplanung bringen. Nebenbei werden einige Grundbefehle erläutert, die zum Programmausbau nötig sind.

Das Nassi-Shneidermann-Struktogramm

Kaum ein Hobbyprogrammierer erstellt es, aber für große Programme ist es so gut wie unentbehrlich - das Nassi Shneidermann-Struktogramm.
Bevor man mit dem eigentlichen Programmieren beginnt, sollte man sich Gedanken machen, was das Programm denn überhaupt können soll. Hierzu wird heute überwiegend das Struktogramm mit Symbolen nach Nassi Schneidermann eingesetzt. Mit diesem grafischem Hilfsmittel wird eine wesentliche Vereinfachung für die Planung, die Programmierung und den Programmtest (z.B. Fehlersuche) erreicht. Die Symbole und auch die in GFA-BASIC zu benutzenden Befehle werde ich im folgenden erläutern. Auch in den folgenden Teilen der "GFA-BASIC -Tips und Tricks" werde ich teilweise diese Symbole der einfachheitshalber zur Erklärung verwenden.

1. Der Block

Der Block steht für eine einzelne Anweisung. Der Block wird genau einmal abgearbeitet und sollte eine möglichst genaue Beschreibung der auszuführenden Anweisung erhalten. Für eine Bildschirmausgabe würde in diesem z.B. "Ausgabe: Hallo, hier bin ich!" stehen. Diese Anweisung würde dann im Programmcode mit PRINT "Hallo, hier bin ich!" ersetzt. Der PRINT-Befehl sorgt in diesem Fall für die Bildschirmausgabe des in Anführungsstrichen eingegrenzten, nachfolgenden Textes.

2. Die Sequenz

Die Sequenz. ist eine Folge von mehreren Anweisungen. Wie auch in Abbildung 2 zu sehen ist, besteht sie aus einer beliebigen Anzahl aneinander gehängter Blöcke.

3. Alternative

Die Alternative ist die Ausführung der Antwort einer Frage, auf die ausschließlich zwei mögliche Antworten - Ja oder Nein - zulässig sind. In diesem Struktogrammsymbol gibt es zwei parallel verlaufende Blöcke oder Sequenzen. Im oberen Teil steht die Frage, darunter folgen rechts der Ja-Block / die Ja-Sequenz - das sind die Anweisungen, die abgearbeitet werden sollen, wenn die Frage mit Ja beantwortet werden kann - und links der Nein-Block 1 die Nein-Sequenz - das sind die Anweisungen, die abgearbeitet werden sollen, wenn die Frage mit Nein beantwortet werden kann. Vorhanden sein muss mindestens einer dieser Blöcke, bevorzugt der Ja-Teil, der andere muss im Symbol zwar dargestellt werden, muss aber keine Anweisungen enthalten. Der Block bleibt dann leer oder enthält einen Querstrich.

In GFA-BASIC wird dieses Symbol durch den IF...ELSE-Befehl abgehandelt:

Quelltext mit Ja- und Nein-Block:

IF zahl%=10 
' Ja-Block 
PRINT "Zahl ist 10!" 
ELSE 
' Nein-Block 
PRINT "Zahl ist nicht 10!"
ENDIF

Quelltext mit Ja-Block und leerem Nein-Block:

IF zahl%=10 ' Ja-Block PRINT "Zahl ist 10!" ENDIF
Quelltext mit Nein-Block und leerem Ja-Block:
IF zahl%=10 
' Ja-Block 
ELSE 
' Nein-Block 
PRINT "Zahl ist nicht 10!" 
ENDIF
Da letzterer Fall unsinnig erscheint, sollte man stets so planen/programmieren, dass immer der Ja-Teil und der Nein-Teil nur bei Bedarf benutzt wird.

4. Die Fallabfrage

Da mit der "Alternative" die Möglichkeiten sehr eingeschränkt sind, gibt es die Fallabfrage. In ihr sind beliebig viele parallel verlaufende Blöcke bzw. Sequenzen möglich. In dem großen Dreieck steht wiederum die Frage, und in den kleinen Dreiecken links die möglichen Antworten (Fälle) und rechts der Sonst-Fall. Der Ablauf erfolgt genauso wie bei der Alternative. Je nachdem, welche Antwort auf die Frage zutrifft, wird genau der zugehörige Block bzw. die zugehörige Sequenz durchlaufen. In GFA-BASIC gibt es hierzu gleich zwei unterschiedliche Möglichkeiten, dieses Symbol umzusetzen.

a) IF..ELSE IF..ELSE...ENDIF

Diese Möglichkeit ist eine Erweiterung des IF...ELSE...ENDIF-Befehls. Gab es zuvor nur die beiden Antworten Ja und Nein, so gibt es hier beliebig viele Möglichkeiten:

IF zahl%=10 
' Fall 1-Block: 
PRINT "Zahl ist 10!" 
ELSE IF zahl%=11 
' Fall 2-Block: 
PRINT "Zahl ist 11!" 
ELSE 
' Sonst-Block 
PRINT "Sonstige Zahl" 
ENDIF

Hierbei kann der Sonst-Block, d.h. das ELSE, ebenfalls entfallen. Es können beliebig viele Fallabfragen eingefügt werden. Vorteil dieser Variante ist, dass man gleichzeitig nicht nur einen Variablentyp abfragen kann bzw. sich auf eine Frage konzentrieren muss, sondern zur Abfrage beliebige Vergleiche benutzen kann:

IF zahl%=10 
' Fall 1-Block:
PRINT "Die Zahl ist 10!" 
ELSE IF hund$<>"Katze"
' Fall 2-Block:
PRINT "Der Hund ist keine Katze!" 
ELSE
' Sonst-Block
PRINT "Wirrwarr in der Fallabfrage" 
ENDIF

b) SELECT...CASE... DEFAULT .. ENDSELECT

Diese Fallabfrage ist nicht so "speicherfressend" und teilweise sogar übersichtlicher als die erste. Hier wird genau eine Frage auf vorgegebene Antworten kontrolliert und kommt somit dem Struktogramm-Symbol eher nahe als der IF...ELSE IF...ELSE...ENDIF-Befiehl. Der Sonst-Fall (DEFAULT) kann hier ebenfalls entfallen.

SELECT zahl%
CASE 10
' Fall 1-Block:
PRINT "Die Zahl ist 10!"
CASE 11
' Fall 2-Block:
PRINT "Die Zahl ist 11!"
CASE 33
' Fall 3-Block:
PRINT "Die Zahl ist 33!"
DEFAULT
' Sonst-Block
PRINT "Sonstige Zahl ungleich 10, 11 und 33!"
ENDSELECT

5. Bedingte Wiederholung

Für die bedingte Wiederholung gibt es zwei Symbole: Zum einen das kopfgesteuerte und zum anderen das fußgesteuerte. In beiden Fällen handelt es sich um Wiederholungen, die so oft durchgeführt werden, bis eine Bedingung erfüllt bzw. nicht mehr erfüllt ist. Im Gegensatz zur Kopfsteuerung werden der Block bzw. die Sequenz der fußgesteuerten Wiederholung mindestens einmal durchlaufen.

a) Kopfsteuerung

In dem länglichem Teil des nach rechts gekippten L steht die Wiederholvorschrift. Danach folgt ein Block oder eine Sequenz. Der Block bzw. die Sequenz wird nur dann durchlaufen, wenn die Wiederholvorschrift tnit Ja beantwortet werden kann. Es findet solange eine Wiederholung statt, bis die Antwort Nein lautet. In GFA-BASIC gibt es hierfür folgende Befehle:

a.1) FOR...NEXT-Schleife

FOR i%=1 TO 10 ! Von i%=1 bis 10
	'Diese Schleife wird
	'solange wiederholt,
	'bis i% gleich 10 ist.
	PRINT i% ! Bildschirmausgabe von i%
NEXT i%  ! i% wird um 1 erhöht

Diese Beispielschleife wird 10-mal durchlaufen und bewirkt, dass die Zahlen 1 bis 10 auf dem Bildschirm ausgegeben werden. Die Schleife wird in jedem Fall durchlaufen, da die Wiederholvorschrift zu Beginn immer mit Ja beantwortet werden kann, es sei denn in der ersten Zeile würde anstelle der 10 eine Zahl kleiner 1 stehen.

a.2) WHILE...WEND-Schleife
i%=1 ! Anfangsbedingung
WHILE i%<=LO ! Solange i%<=10 wiederhole
	' Diese Schleife wird
	' solange wiederholt,
	' wie i% kleiner-gleich 10 ist.
	PRINT i% ! Bildschirmausgabe von i
	INC i% ! Erhöhe i% um 1
WEND
Diese Beispielschleife wird ebenfalls 10 mal durchlaufen und bewirkt konsequenterweise die gleiche Bildschirmausgabe wie oben. Sie erfordert allerdings mehr Schreibarbeit, denn hierfür ist eine Anfangsbedingung und eine Zeile zur Veränderung der Laufvariable i% nötig. Würde in der Anfangsbedingung eine Zahl größer 10 stehen, so würde diese Schleife nicht ausgeführt werden. Wenn man die Laufvariable nicht erhöht, so landet man in einer Endlosschleife (Dauer-Wiederholung), da die Wiederholbedingung i%<=10 immer mit Ja beantwortet werden kann.

b) Fußsteuerung

In dem länglichen Teil des nach links gekippten L steht die Wiederholvorschrift. Danach folgt ebenfalls ein Block oder eine Sequenz. Der Block bzw. die Sequenz wird mindestens einmal durchlaufen und dann solange wiederholt, bis die Abbruchwiederholvorschrift mit Ja beantwortet werden kann. In GFA-BASIC gibt es hierfür folgende Befehle: Beide Beispielschleifen erwirken die gleiche Ausgabe wie die anderen auch.

b.l) REPEAT..UNTIL-Schleife

i%=1 ! Anfangsbedingung 
REPEAT ! Wiederhole 
	' Diese Schleife wird 
	' solange wiederholt, 
	' bis i% am Schleifen
	' ende größer 9 ist.
	PRINT i % ! Bildschirmausgabe von i% 
	INC i% ! Erhöhe i% um 1
UNTIL i%>9

b.2) DO...WHILE-Schleife

i%=1 ! Anfangsbedingung 
DO ! Führe aus 
	' Diese Schleife wird 
	' solange wiederholt, 
	' wie i% kleiner
	' gleich 10 ist.
	PRINT i % ! Bildschirmausgabe von i% 
	INC i%    ! Erhöhe i% um 1
WHILE i%<=10 ! Solange i%<=10 ist

6. Dauer-Wiederholung

Hierbei handelt es sich um das Struktogramm-Symbol für eine Endlosschleife. Eine Endlosschleife ist immer (meistens) ungewollt, d.h. durch irgendeinen Tippfehler in einer der bedingten Wiederholungen zustande gekommen. Es gibt in GFA-BASIC hierfür allerdings einen besonderen Befehl dafür:

DO 
' Diese Schleife wird 
' endlos wiederholt.
PRINT i% ! Bildschirmausgabe von i% 
INC i%   ! Erhöhe i% um 1
LOOP
**7. Unterprogramm-Aufruf**

Unterprogramme können in GFA-BASIC Prozeduren oder Funktionen sein. hierbei handelt es sich um kleine Teilprogramme, die in dem Programm enthalten sind und beliebig oft aufgerufen werden können. Mit den Unterprogrammen spart man sich eine Menge Text und somit auch Speicherplatz, denn ohne sie müsste man bei jeder Benutzung den kompletten Quelltext so oft wiederholend schreiben, wie man ihn benötigt/aufruft. Dem Unterprogramm können Parameter, d.h. Werte, Texte und Variableninhalte übergeben werden. Die Variablen können nach der Beendung des Unterprogramms mit einem Rückgabewert überschrieben werden.

a) PROCEDURE...RETURN

Eine Prozedur ist ein Unterprogramm, das im Gegensatz zu den Funktionen keinen Wert zurückliefert. Die Parametervariablen können allerdings bei vorgestelltem VAR auch Werte zurückliefern.

Deklaration:

PROCEDURE ausgabe(zahl%, VAR ziffer%)
	' Diese Prozedur gibt den Wert der
	' übergebenen Variable zahl% aus,
	' multipliziert sie mit dem Wert der
	' Variablenziffer% und schreibt das
	' Ergebnis zurück in die Variable
	' ziffer%
	'
	PRINT zahl% ! Ausgabe des Wertes von zahl%
	ziffer%=ziffer%*zahl% ! Multiplikation von zahl% und ziffer%
RETURN

Aufruf im Programm:

ergebnis%=5     ! Variable ergebnis% gleich 5 setzen
PRINT ergebnis% ! Wert der Variablen ergebnis% ausgeben
@ausgabe(ll,ergebnis%) ! Prozedur ausgabe aufrufen
PRINT ergebnis% ! Wert der Variablen ergebnis% ausgeben

Ausgabe auf dem Bildschirm:
5
11
55

b) FUNCTION...RETURN... ENDFUNC

Eine Funktion ist ein Unterprogramm, das immer einen Wert zurücklicfcrt. Die Parameter funktionieren genauso wie bei den Prozeduren.

Deklaration:
FUNCTION ausgabe(zahl%, VAR ziffer%)
	' Diese Funktion gibt den Wert der
	' übergebenen Variable zahl. aus,
	' multipliziert sie mit dem Wert der
	' Variablen ziffer% und schreibt das
	' Ergebnis zurück in die Variable
	' ziffer%. Zurückgegeben wird eben
	' falls der Wert der Variable ziffer%.
	PRINT zahl% ! Ausgabe des Wertes von zahl%
	ziffer%=ziffer%*zahl% ! Multiplikation von zahl. und ziffer%
	RETURN ziffer% ! Wert der Variablen ziffer%
	' zurückgeben. 
ENDFUNC

Aufruf im Programm:

ergebnis%=5 ! Variable ergebnis% gleich 5 setzen
PRINT ergebnis% ! Wert der Variablen ergebnis% ausgeben
PRINT FN ausgabe(11,ergebnis%) ! Rückgabewert der Funktion ausgabe ausgeben
PRINT ergebnis% ! Wert der Variablen ergebnis% ausgeben

Ausgabe auf dem Bildschirm:
5
11
55
55

Da nun die wichtigsten Befehle zum strukturellen Aufbau eines Programms bekannt sind, werde ich im nächsten Teil der "GFA-BASIC - Tips und Tricks" mit einem kleinen Beispielprogramm fortfahren, das Ausgaben auf Diskette/Festplatte und auf dem Drucker macht.


Torsten Runge
Aus: ST-Computer 06 / 1999, Seite 26

Links

Copyright-Bestimmungen: siehe Über diese Seite