• QBasic - Unterprogramme, Subs und Functions

Interne Unterprogramme

Manchmal haben verschiedene Teile eines Programms ganz ähnliche Aufgaben zu bewältigen. Normalerweise müßte man dann dieselben Zeilen zweimal oder noch öfter eingeben. Das ist aber nicht notwendig. Die Zeilen können einmal in einer sogenannten Subroutine (oder auch Unterprogramm) eingegeben werden und dann überall im Programm verwendet werden, ohne daß sie ein zweites Mal getippt werden müssen.
Dazu benutzt man z.B. die Anweisungen GOSUB (GO to SUB routine = gehe zum Unterprogramm) und RETURN.


Das folgende Beispiel besteht aus einem Hauptprogramm und einem Unterprogramm, das vom Hauptprogramm aus mehrmals aufgerufen wird. Wichtig ist der END-Befehl, der das Hauptprogramm beendet und verhindert, daß der Computer ohne GOSUB-Aufruf das Unterprogramm ausführt. Beachte, daß der Name des Unterprogramms (Linie) mit einem Doppelpunkt endet. Tippe das Programm ein und speichere unter sub1.bas

REM Sub1
Hauptprogramm:
CLS
zaehler=0
PRINT "Drei Chinesen mit dem Kontrabaß,"
GOSUB Linie
PRINT "saßen auf der Straße und erzählten sich was,"
GOSUB Linie
PRINT "da kam die Polizei, na was ist denn dass?,"
GOSUB Linie
PRINT "Drei Chinesen mit dem Kontrabaß."
GOSUB Linie
PRINT "Das Unterprogramm wurde ";zaehler;"-mal aufgerufen"
END

Linie:
zaehler=zaehler+1
PRINT "--------------------"; zaehler
RETURN

Das folgende Programm gibt nach Eingabe von Namen und Noten ein Minizeugnis aus. Die Eingabe erfolgt im Hauptprogramm, die Zuordnung der Schriftnoten im Unterprogramm noten. Probiere das Programm aus und speichere unter zeugnis1.bas

REM Zeugnis schreiben
CLS
INPUT "Name des Schülers: ", schueler$
INPUT "Deutschnote? ", deu
INPUT "Englischnote? ", eng
INPUT "Mathenote? " , math
CLS
PRINT TAB(15); "Zeugnis"
PRINT
PRINT "Name des Schülers: "; schueler$
PRINT
PRINT "Deutsch ";
zens = deu
GOSUB noten
PRINT "Englisch ";
zens = eng
GOSUB noten
PRINT "Mathe ";
zens = math
GOSUB noten
END

noten:
IF zens = 1 THEN PRINT TAB(20); "sehr gut"
IF zens = 2 THEN PRINT TAB(20); "gut"
IF zens = 3 THEN PRINT TAB(20); "befriedigend"
IF zens = 4 THEN PRINT TAB(20); "ausreichend"
IF zens = 5 THEN PRINT TAB(20); "mangelhaft"
IF zens = 6 THEN PRINT TAB(20); "ungenügend"
RETURN

Externe Unterprogramme (Sub und Function)

In QBASIC gibt es noch eine weitere Möglichkeit, Unterprogramme zu verwenden. Man unterscheidet zwischen Subs und Functions. Subs und Functions erscheinen nicht im eigentlichen Programmlisting, für beide wird ein eigenes Fenster erzeugt. Das Anlegen einer Sub oder einer Function erfolgt über das Menü Bearbeiten - Neue Sub ... oder Bearbeiten - Neue Function ...
Daraufhin öffnet sich eine Dialogbox, in der der Name der Sub bzw. Function gewählt werden kann. Schließlich wird zum Sub- bzw. Function-Fenster umgeschaltet. Der Rahmen für eine neue Sub

SUB Name_der_Sub
END SUB

analog für eine neue Function


FUNCTION Name_der_Function
END FUNCTION

wird vorgegeben. Zwischen SUB und END SUB bzw. FUNCTION und END FUNCTION wird dann der Programmcode eingegeben. Es ist auch möglich, innerhalb von Subs und Functions weitere Subs zu schreiben. Zwischen den Subs, Functions und dem Hauptmodul des Programms kann mit Ansicht - SUBs ... oder der F2-Taste umgeschaltet werden.


Das Beispiel ggT1 berechnet mit einer Function den größten gemeinsamen Teiler (ggT) zweier Zahlen. Außerdem werden mittels der Sub Tausche zwei Variablen der Größe nach sortiert. Wähle zuerst Datei - Neu, um ein neues Programm zu beginnen. Gib dann das Hauptmodul des Programmes ein.


REM ggT1
CLS
PRINT "ggT"
PRINT "--------------------"
INPUT "Zahl 1: ",z1
INPUT "Zahl 2: ",z2
PRINT "--------------------"
IF z1>z2 THEN Tausche z1,z2
PRINT "ggT("; z1; ","; z2 ; ")=";
PRINT ggt(z1,z2)
PRINT
END

Speichere das Programm an dieser Stelle unter dem Namen ggt1.bas in deinem Datenverzeichnis ab.
Wird das Programm an dieser Stelle mit <Shift> F5 gestartet, so meldet das Programm einen Fehler, weil sowohl die Sub als auch die Function noch nicht definiert sind. Für QBASIC sind "Tausche" und "ggT" (noch) unbekannte Befehle oder Variablen.

Wähle im Menü Bearbeiten den Punkt Neue Sub .... In der folgenden Dialogbox trägst du bei Name den Text "Tausche" ein. Das Programm schaltet um zum Modul Tausche.
Gib dann den folgenden Programmcode ein:


SUB Tausche (x,y)
merke=x
x=y
y=merke
END SUB

Wähle im Menü Bearbeiten den Punkt Neue Function .... In der folgenden Dialogbox trägst du bei Name den Text "ggT" ein. Das Programm schaltet um zum Modul ggT.
Gib dann den folgenden Programmcode ein:


FUNCTION ggT (x,y)
DO
rest = INT(y / x)
w = rest * x
rest = y - w
result = x
IF rest < 1 THEN EXIT DO
y = x
x = rest
LOOP
ggT=result
END FUNCTION

Speichere das Programm an dieser Stelle unter dem Namen ggt2.bas in deinem Datenverzeichnis ab. Das Programm kann jetzt gestartet werden.

Weiter gehts mit Lektion 4!


Aufgaben

  1. Das Programm Zeugnis soll ein vollständiges Zeugnis in zwei Spalten ausdrucken. Ergänze das Programm zeugnis1.bas mit den Nebenfächern und speichere unter zeugnis2.bas
  2. Die Post befördert Briefe nach Gewicht. Schreibe einen Portorechner, der bei Eingabe des Gewichts das Porto ausgibt. Schreibe dazu folgende Zuordnungen ähnlich dem Programm Zeugnis in ein Unterprogramm:
      • ist das Gewicht < 20g kostet der Brief 55 Cent
      • ist das Gewicht < 50g kostet der Brief 1 Euro
      • ist das Gewicht < 500g kostet der Brief 1,44 Euro
      • ist der Brief < 1000g kostet der Brief 2,20 Euro
      • ist der Brief > 1000g, spricht man von einem Paket!
    Speichere das Programm unter porto.bas und überlege: macht hier ein Unterprogramm Sinn?
  3. Schreibe ein Programm zur Berechnung des kleinsten gemeinsamen Vielfachen (kgV) zweier Zahlen. Das kgV der Zahlen a und b wird berechnet, indem man die Zahlen a und b multipliziert und das Ergebnis durch den ggT der Zahlen a und b dividiert.
    Hinweise: Öffne gegebenenfalls die Datei ggt2.bas und speichere sie unter dem Namen kgv.bas ab.
 

Wähle im Menü Bearbeiten den Punkt Neue Function .... In der folgenden Dialogbox trägst du bei Name den Text "kgV" ein. Das Programm schaltet um zum Modul kgV.

Das Modul kgV benötigt als Parameter zwei Variablen a und b. Der Modulkopf sieht also wie folgt aus:
FUNCTION kgV(a,b)
Die Berechnung erfolgt nach:
kgV = a * b / ggT(a,b)
Ändere die übrigen Teile des Hauptmoduls und speichere das Programm.



... zurück zum Inhalt