BASIC-Tutorial (Vorwort, Installation, Kapitel 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)

SUBs und Funktionen

In diesem Kapitel:

8.1. SUBs (Prozeduren)

Immer wieder wird ein bestimmter Code mehrmals benötigt. Solche "Quellcodestücke" lassen sich in BASIC in einem SUB (bezeichnet man in anderen Programmiersprachen als Prozedur) zusammenfassen. Der Aufbau eines SUBs sieht folgendermaßen aus:

SUB Name
   Anweisung 1
   Anweisung 2
   Anweisung 3
   ...
END SUB

Die Anweisungen (hier mit 1 bis 3 bezeichnet) werden ausgeführt, nachdem der SUB aufgerufen wurde. Für den Anwender ist vollkommen gleichgültig (kein sichtbarer Unterschied), ob die Anweisungen, die ausgeführt werden sollen, in einem SUB untergebracht werden, oder "normal" im Programm stehen. Letzteres erfordert jedoch einiges mehr an Tipparbeit, da derselbe Code immer wieder geschrieben werden muss, weil er öfters benötigt wird. Solche Redundanzen (z.B. Zeilen, die mit Copy&Paste mehrfach eingefügt werden) sollten Sie tunlichst vermeiden!

"Einfach so" in den Quellcode können Sie die SUB-Definition jedoch auch nicht verfrachten. Sie muss nach dem "eigentlichen" Quellcode folgen. Dieser wird mit END abgeschlossen, siehe nächstes Beispiel.

Tipp: Übrigens dient END auch als Befehl dazu, um das Programm zu beenden!

Vorletzte Anweisung
Letzte Anweisung
END

SUB Name
   Anweisung 1
   Anweisung 2
   Anweisung 3
   ...
END SUB

Name bezeichnet hierbei den Namen/Bezeichner des SUBs, der aufgerufen werden soll. Allerdings macht uns hier QBasic einen Strich durch die Rechnung. Sobald man SUB sowie den Namen schreibt, landet man in einem fast leeren Editorfenster, denn die Grundstruktur des SUBs ist bereits eingetragen (SUB + Name am Anfang, END SUB am Ende). Es müssen lediglich die Programmierzeilen hinzugefügt werden. Wie gelangen wir nun wieder zum Quellcode unseres Programmes? Angezeigt bekommen wir zu diesem Zeitpunkt immer noch den Quellcode des SUBs. Klicken Sie in QBasic auf Ansicht (View) und darauffolgend auf SUBs. Nun wählen Sie die erste Zeile in der Liste aus. Dies ist normalerweise der Namen, unter dem Sie Ihr Programm abgespeichert haben. Wenn es noch nicht gespeichert wurde, wird Unbenannt (Untitled) angezeigt.

Übrigens können Sie auch einen SUB hinzufügen, indem Sie auf Bearbeiten (Edit) und Neuer SUB... (New SUB...) klicken. Daraufhin geben Sie den Namen des SUBs ein, woraufhin Ihnen der Editor den Quelltext nur dieses einen SUBs anzeigt. Aufgerufen werden kann ein SUB einfach, indem man seinen Namen im Quellcode anbringt:

Subname

Das nächste Beispiel demonstriert die Verwendung von SUBs. Der Sinn des Beispiels liegt darin, Potenzen von Zahlen zu berechnen. Das Beispiel besteht aus zwei Teilen: 1. Teil: Unser "eigentlicher" Quellcode (Hauptprogramm), 2. Teil: Der SUB, der die Berechnung durchführt. Tippen Sie den 1. Teil bitte normal ab, den SUB (2. Teil) fügen Sie - wenn Sie QBasic verwenden - wie oben beschrieben durch Klicken auf Ansicht (View) und Neuer SUB... (New SUB...) hinzu. Verwenden Sie als Name für den SUB berechnen. Sie können natürlich auch einen anderen Namen verwenden, wenn Sie den Quellcode dementsprechend anpassen (eigentlich nur eine Änderung in einer Zeile).

Das Hauptprogramm (1. Teil):

CLS
INPUT "Basis: ", basis
INPUT "Exponent: ", exponent
CALL berechnen (basis, exponent)

Der SUB (2. Teil):

SUB berechnen (bas, expo)
ergebnis = 1	' ergebnis mit 1 initialisieren
FOR i = 1 TO expo
   ergebnis = ergebnis * bas
NEXT i
PRINT ergebnis	' Ergebnis der Berechnung ausgeben
END SUB 

SUBs mit Parametern aufrufen

Hier gibt es Neues, das bisher nicht behandelt wurde. Der SUB verwendet Parameter, zwei um genau zu sein. Diese stehen in Klammer. Die Werte der Variablen basis (1. Parameter) und exponent (2. Parameter) werden an den SUB berechnen übergeben. Der Sinn von Parametern liegt also in der Wertübergabe. Wir müssen die eingegebenen zwei Werte an den SUB übergeben, da sie der SUB zur Berechnung benötigt. Je nachdem, welche Parameter übergeben werden, wird dann natürlich ein anderes Ergebnis geliefert.

Grundsätzlich gilt: Immer wenn Sie Parameter an einen SUB übergeben, muss der Aufruf mit CALL erfolgen!

8.2. Funktionen

Was SUBs jedoch nicht können, ist Werte zurückliefern (Rückgabewerte). Angenommen, man schreibt eine mathematische Funktion, deren Aufgabe es ist, eine Berechnung durchzuführen. Die Berechnung durchführen kann ein SUB durchaus, aber was mit dem Ergebnis? Ausgeben? Das vorherige Beispiel (Potenzen berechnen) macht genau das. Doch was, wenn das Ziel eine Weiterverarbeitung ist? Hierzu benötigt man eine Funktion. Sie erfüllt genau denselben Zweck wie ein SUB, jedoch mit einem kleinen Zusatz: Sie kann Werte zurückliefern. Schauen Sie sich einmal folgende Anweisung an:

endergebnis = berechnen (basis, exponent)

Nehmen Sie einfach an, berechnen sei nun eine Funktion und würde - wie oben - Potenzen berechnen. Der Wert wird nicht ausgegeben. Der Vorgang läuft nun wie bei einer Zuweisung üblich von rechts nach links ab. Zuerst wird die Funktion berechnen aufgerufen, und als Parameter werden die Werte der Variablen basis und exponent an sie übergeben. Die Funktion berechnet das Ergebnis und liefert es als Rückgabewert zurück. Dieser Wert wird dann in der Variable endergebnis gespeichert.

FUNCTION Name [(Parameter1 AS Datentyp,
               Parameter2 AS Datentyp, ...)]
   Anweisung 1
   Anweisung 2
   Anweisung 3
   ...
Name = Rueckgabewert
END FUNCTION

Die Parameter sind optional, was die eckigen Klammern [...] andeuten sollen. Sie können übrigens den Datentyp (z.B. AS INTEGER, AS STRING) der Parameter explizit angeben. Oder Sie stellen wie in Kapitel 2 gezeigt, das entsprechende Zeichen (% $ & ! #) hinten an die Variable an. Gleiches funktioniert auch mit dem Namen der Funktion. Soll Ihre Funktion etwa Werte vom Typ String zurückliefern, fügen Sie ein Dollar-Zeichen ($) dem Variablennamen hinzu (Name$).

Aufgabe: Versuchen Sie, das Beispiel aus 8.1 (Potenzen berechnen) so umzuändern, dass statt eines SUBs, der das Ergebnis ausgibt, eine Funktion verwendet wird, die den Wert zurückliefert. Im Hauptprogramm wird der Rückgabewert dann angezeigt. Das Beispiel muss dazu nur geringfügig angepasst werden.

Vorheriges Kapitel Nächstes Kapitel