Kurs:FreeBASIC/Lerngruppen/Testlauf/Anfängerkurs IV

Thema Unterprogramme
Bearbeitet 01.07.2008 bis 22.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?
  1. UP, die einen Wert zurückliefern, sie werden Funktionen genannt (z.B. Abs(), liefert der Absolutbetrag des übergebenen Wertes)
  2. 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)

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

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.