Kurs:FreeBASIC/Lerngruppen/Testlauf/Anfängerkurs IV
Thema | Unterprogramme |
Bearbeitet | 01.07.2008 bis 21.11.2024 |
Material | Anfängertutorial IV |
Kommentar | Die Beispiele mit GOSUB erwiesen sich als nicht lauffähig. Das mag an einem Versionskonflikt (neuere FB-Versionen unterstützen kein GOSUB mehr?) liegen |
Was haben wir gemacht?
[Bearbeiten]- Wir haben uns angesehen, wie wir mit Unterprogrammen arbeiten.
- Wir haben uns mit der Einteilung von Haupt- und Unterprogrammen vertraut gemacht.
- Wir haben den Einstieg in die "rekursive Programmierung" geschafft.
Wichtige Begriffe und Definitionen
[Bearbeiten]- Was leistet das Hauptprogramm?
Das Hauptprogramm die Steuerung bzw. die Verwaltung des Programms.
- Was machen die Unterprogramme (UP)?
Sie werden vom Hauptprogramm aufgerufen bzw. rufen sich gegenseitig auf.
- Welche 2 Typen von Unterprogrammen lassen sich unterscheiden?
- UP, die einen Wert zurückliefern, sie werden Funktionen genannt (z.B. Abs(), liefert der Absolutbetrag des übergebenen Wertes)
- UP, die einfach bestimmte Anweisungsfolgen (wiederholt ausführen), das sind die SUBs(von SUBroutine)
Für beide Typen gilt, dass an sie Parameter übergeben werden können und beide auch Werte im Hauptprogramm bzw. in anderen Bereichen ändern können.
- Was gilt für alle UPs?
Sie haben immer einen Namen, über den sie aufgerufen werden können.
- Was bedeuten byVal und byRef?
- byVal - ist die Abkürzung für by Value (also: als Wert), das UP kann mit dem Wert machen, was es will, der ursprüngliche Wert wird nicht geändert...
- byRef - ist die Abkürzung für by Reference (also: als Adresse), das UP hat direkten Zugriff auf die Variable und kann sie also verändern...
Hinweis, Anregung, Tipp
[Bearbeiten]Die Befehlsreferenz zu GOSUB sagt: „Seit FreeBASIC v0.16b, März-Release ist es nicht mehr zulässig, GOSUB auf Prozedurebene zu verwenden.“ Vermutlich deshalb liefert das erste Beispiele einen Fehler. --Michael Reschke 16:52, 1. Jul. 2008 (CEST)
Notizen
[Bearbeiten]GOSUB (nicht lauffähig)
[Bearbeiten]Beispielprogramm für die Verwendung von Unterprogrammen
Dim As Integer a, b, c 'die drei Variablen deklarieren
Input "Summand1=", a
Input "Summand2=", b
GoSub Addieren
Print "Summe=" &c
Sleep
End
Addieren:
c=a+b
Return
Es lieferte bei mir einen Fehler. Ich habe wohl eine neuere Version von FB bei mir im Einsatz.
Auch nicht lauffähig ist das Bsp. der Referenz:
GOSUB message
END
message:
PRINT "Welcome!"
RETURN
'Fehlermeldungen 135 und 50
'Nr. 135: Only valid in -lang qb, found 'GOSUB' in 'GOSUB message'
Ich habe es mal mit SUB umgesetzt:
DECLARE SUB message 'Die SUB message wird deklariert
PRINT "Das Programm startet."
message 'Die SUB message wird aufgerufen.
PRINT "Das Programm endet."
SLEEP
END 'Hier endet offensichtlich das Hauptprogramm
SUB message 'Hier ist das Unterprogramm (SUB) message zu finden, außerhalb des Hauptprogramms
PRINT "Hier das ist die SUB!"
END SUB
SUB
[Bearbeiten]Anderes Layout als beim Portal (!)
Declare Sub Addieren(byVal Summand1 As Integer, _
byVal Summand2 As Integer, _
byRef Summe As Integer)
Dim As Integer a, b, c, d
' - - - - - - - - - - - E I N G A B E - - - - -
Input "Summand1=", a
Input "Summand2=", b
Addieren(a, b, c)
Print "Summe in c=" &c
Addieren(a+19, b+4, d)
Print "Summe in c=" &c
Print "Summe in d=" &d
Sleep
End
Sub Addieren(byVal Summand1 As Integer, byVal Summand2 As Integer, byRef Summe As Integer)
Summe=Summand1+Summand2
End Sub
- Eingabe: 8, 12
- Ausgabe: 20, 20, 43
Bei c kann sich nichts ändern, weil c gar beim Aufruf auftaucht (a, b, d).
Function
[Bearbeiten]Grundvariante
Declare Function Summe(byVal Summand1 As Integer,_
byVal Summand2 As Integer)_
As Integer
Dim As Integer a, b
Input "Summand1=", a
Input "Summand2=", b
Print "Summe in c=" &Summe(a, b) 'Hier wird die Summe berechnet..
Print "Summe in d=" &Summe(a+19, b+4) 'Hier wird die Summe mit anderen Werten berechnet..
Sleep
End
Function Summe(byVal Summand1 As Integer, byVal Summand2 As Integer) As Integer
Return Summand1+Summand2 'Summe berechnen und mit dem Ergebnis zurückkehren
Summe =Summand1+Summand2 'Summe berechnen und in der Function bleiben..
' Function=Summand1+Summand2 'diese Zeile ist mit der darüber gleichbedeutend..
End Function 'Ende der Function, jetzt mit der Wert von Summe(oder Function) zurückkehren
Variante Return
Declare Function Summe(byVal Summand1 As Integer,_
byVal Summand2 As Integer)_
As Integer
Dim As Integer a, b
Input "Summand1=", a
Input "Summand2=", b
Print "Summe in c=" &Summe(a, b) 'Hier wird die Summe berechnet..
Print "Summe in d=" &Summe(a+19, b+4) 'Hier wird die Summe mit anderen Werten berechnet..
Sleep
End
Function Summe(byVal Summand1 As Integer, byVal Summand2 As Integer) As Integer
Return Summand1+Summand2 'Summe berechnen und mit dem Ergebnis zurückkehren
End Function
Variante Summe
Declare Function Summe(byVal Summand1 As Integer,_
byVal Summand2 As Integer)_
As Integer
Dim As Integer a, b
Input "Summand1=", a
Input "Summand2=", b
Print "Summe in c=" &Summe(a, b) 'Hier wird die Summe berechnet..
Print "Summe in d=" &Summe(a+19, b+4) 'Hier wird die Summe mit anderen Werten berechnet..
Sleep
End
Function Summe(byVal Summand1 As Integer, byVal Summand2 As Integer) As Integer
Summe = Summand1+Summand2 'Summe berechnen und mit dem Ergebnis zurückkehren
End Function
Ein Beispiel für byVal und byRef
[Bearbeiten]Declare Sub Summieren _
(byVal Summand1 As Integer, _
byVAL Summand2 AS Integer, _
byRef Summe As Integer)
DIM as Integer a = 1, b = 2, c = 0
PRINT a, b, c
Summieren (a, b, c)
PRINT a, b, c
PRINT
SLEEP
PRINT a, b, c
Summieren (a, c, b)
PRINT a, b, c
SLEEP
End
Sub Summieren (byVal Summand1 As Integer, byVal Summand2 As Integer, byRef Summe As Integer)
Summe=Summand1+Summand2
End Sub
Rekursion
[Bearbeiten]Dim i As Integer
Declare Function Fakultaet(byVal n As Integer) As ULongInt
'Funktions-Deklaration, damit sie überall im Programm erreichbar ist
Function Fakultaet(byVal n As Integer) As ULongInt 'Erstmal nur größter Integer(64Bit)
Dim i As Integer, Ergebnis As ULongInt=1 'Ergebnis mit 1 vorbesetzen, wg. 0!=1
For i=1 To n 'Alle ganzen Zahlen bis n, warum darf die Schleife nicht mit 0 beginnen?
Ergebnis*=i 'Ergebnis=Ergebnis*i
Next i
Function=Ergebnis
End Function
Do
Print "Geht nur bis 20!=2432902008176640000 wg. ULongInt"
Input "Wert fuer n eingeben:", i
If i<0 Then End
Print Str(i); "!="; Fakultaet(i) 's.u., geht nur in der Print-Anweisung
Loop
Kommentar
[Bearbeiten]Bei mir produzierte das Beispiel mit GOSUB einen Fehler.