Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Anfängerkurs Teil 4 - Unterprogramme

von RedakteurytwinkySeite 2 von 2

Mit diesen benannten UP bieten sich nun weitere Möglichkeiten. In einem UP kann die Ermittlung von Ergebnissen iterativ erfolgen.
Was ist denn das nun wieder? Iterativ bedeutet soviel wie schrittweise und die Berechnung findet immer in dem selben Block statt.

Eine Alternative dazu wäre rekursive Programmierung.
Rekursiv oder nicht rekursiv
..das ist hier die Frage. Oder:
Was antworte ich auf die Aussage: "Mein neues Programm ist sogar rekursiv!"
Nun, die Antwort ist einfach: "Cool"
Aber was steckt denn nun dahinter? Rekursiv heißt einfach, daß sich das Programm zur Berechnung selbst aufruft.
Das ist ja wirklich cool und welchen Vorteil hat das?
Jetzt wird es fast philosophisch, denn die Antwort hängt von den Programmiergewohnheiten ab:
1. Rekursion brauche ich nicht, das geht alles mit Schleifen!
Betrachten wir das klassische Beispiel für Rekursion, die Fakultät n!
Die Zahl n wird n-mal mit sich selbst multipliziert: 5!=1*2*3*4*5=120
Aha, wie geschaffen für eine Schleife, doch halt: Es müssen Sonderfälle berücksichtigt werden,
denn Fakultät ist nur für n größer oder gleich 0 definiert, wobei 0 wieder ein Sonderfall ist: 0!=1
Programmtechnisch gesehen, ist nur der DatenTyp ein Problem, da hier sehr schnell
ziemlich große Werte erreicht werden, z.b. 29!=8841761993739701954543616000000
(29! ist der größte Wert, den Rechner-Plus als ganze Zahl darstellen kann)

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 fr n eingeben:", i
  If i<0 Then End
  Print Str(i); "!="; Fakultaet(i) ''s.u., geht nur in der Print-Anweisung
Loop

2. Rekursion ist COOL, kann ich das auch haben? Na gut:

Dim i As Integer
Declare Function Fakultaet(byVal n As Integer) As ULongInt 'Erstmal nur größter Integer(64Bit)

Function Fakultaet(byVal n As Integer) As ULongInt 'Erstmal nur größter Integer(64Bit)
  If n=1 Then Fakultaet=n Else Fakultaet=n*Fakultaet(n-1) 'n=1, dann fertig, sonst weiterrechnen
End Function

Do
  Print "Geht nur bis 20!=2432902008176640000 wg. ULongInt"
  Input"Wert fr n eingeben:", i
  If i<0 Then End
  Print "" &i &"!=" &Fakultaet(i) 's.o. ist aber EIN String
Loop

..wirklich cool, die Berechnung findet offensichtlich nur noch in einer einzigen Zeile statt.
Auf der anderen Seite benötigt das Programm natürlich eine Menge Platz, um die Zwischenergebnisse zu
speichern und die ganzen Rücksprung-Adressen zu verwalten, cool?
Bei einem so kleinen Beispiel kann der Verwaltungsaufwand leicht in Kauf genommen werden, bei größeren
Sachen ist abzuwägen, was einfacher ist. Beim QSort ist es sehr schwer, eine Schleifenkonstruktion
zufinden, deshalb wird er traditionell rekursiv programmiert.(Siehe QSort-Beispiel)
Ja, und nun? Welchen Weg soll ich nun nehmen? Das weiß ich doch nicht :D
Diese Entscheidung muß jeder für sich treffen und sie kann von Fall zu Fall anders ausfallen ^^
Für kleinere Berechnungen mag es ausreichen, wie hier im Beispiel ULongInt als Datentyp zu nehmen.
Bei Berechnungen in der Kombinatorik ist allerdings sehr schnell Schluß damit:
Die Anzahl der Möglichkeiten von 6 Richtigen im Lotto 6 aus 49 soll berechnet werden.
Dazu werden verschiedene Fakultäten benötigt. 6! ist kein Problem, aber es ist auch 49! erforderlich.
Das schafft keins der hier vorgestellten Programme, Externer Link!http://ytwinky.freebasic-portal.de/freebasic/6aus49.bas schafft es.
Allerdings wird dort der DatenTyp Double benutzt, einer der rechenintensivsten DatenTypen von FreeBASIC.
Hier gilt es also abzuwägen, was ausreichend, was erforderlich und was möglich ist.
Das Programm führt die Befehle letztendlich nur aus, wie das geschieht, legt der Programmierer fest.

Auf der Suche nach Funktionen die Strings bearbeiten können, bin ich im Anfängerkurs allerdings nicht fündig geworden. Ein einfacher Code als Beispiel erscheint mir deshalb hier angebracht zu sein:

SCREENRES 400, 200    ' Bildschirmmodus 800x600 bei 32bpp
COLOR 15,0
DECLARE Function Datum As String


PRINT
PRINT "heutiges Datum: "+DATUM
Sleep


Function Datum As String
    Datum=Mid$(Date$,4,2)+"."+left$(Date$,2)+"."+Right$(Date$,4)
End Function

 

Gehe zu Seite Gehe zu Seite  1  2  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 09.06.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 10.03.2020 von MitgliedJuergen gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen