Zum Inhalt springen

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

Aus Wikiversity
Thema Kontrollstrukturen: Bedingungen, Schleifen usw. (Anfängerkurs III)
Hinweis Der Anfängerkurs III ist nicht unbedingt Anfänger-freundlich! Nicht entmutigen lassen.
Bearbeitet 29.06.08 bis 30.06.2008
Material Anfängertutorial III
Zwischenstand Seite 3, mit der Continue-Anweisung müssen wir uns noch mal befassen (war Seite 2)
Notiz Die Seiten 1 und 2 wurden durchgearbeitet. Bei den Seiten 3 und 4 ist der konkrete Nutzen noch nicht ersichtlich: Wie man mit Arrays arbeitet, müsste man sich daher später noch einmal ansehen!

Was haben wir gemacht?[Bearbeiten]

  • Wir haben uns mit dem Problem / der Fähigkeit befasst, wie man im Programm Entscheidungen treffen kann.
  • Wir haben die If-Anweisung und den SELECT CASE-Block kennengelernt sowie die folgenden Schleifen:
    • For-Next-Schleife
    • Do-Loop-Schleife
    • While-Wend-Schleife
    • Außerdem haben wir erfahren, dass man mit 'Exit For', 'Exit While' und 'Exit Do' eine Schleife auch (vor Abschluss) wieder verlassen kann.
  • Wir haben die Booleschen Operatoren AND und OR zur Verknüpfung von Bedingungen kennengelernt.
  • Als neue Befehle kam Screen sowie INKEY hinzu.


Wichtige Begriffe und Definitionen[Bearbeiten]

Die If-Anweisung
IF <bedingung(en)> THEN <befehl(e)> ELSE <befehl(e)> end if
Der Select Case-Block
select case wahl
    case chr(27)
        end
    case "1"
        print "..."
    case "2"
        print "..."
    case "3" 
        print "..."
    case "4" 
        print "..."
    case else
        print "falsche Eingabe!"
end select

1, 2, 3, 4 oder etwas anderes wäre hier der Inhalt der Variable „wahl“. (...)

Die DO...LOOP-Schleife (funktioniert mit While und Until)

Mit while...

do
    <befehl1>
    <befehl2>
    .......
loop while <bedingung>

Mit until...

do
    <befehl1>
    <befehl2>
    .......
loop until <bedingung>
Die FOR-NEXT-Schleife (Eine Zählschleife!)
for x = a to b step 4
    <befehl>
    <befehl>
    ...
next x

Die For-Next-Schleife ist eine Zählschleife. Bei jedem Durchlauf wird die Variable mit dem Ausgangswert a um 1 erhöht. Sobald der Wert b erreicht wurde, wird die Schleife abgebrochen.

Die Erweitertung mit step 4 ist optional. Standardmäßig ist die Erhöhung um 1.

Hinweis, Anregung, Tipp[Bearbeiten]

Arbeitet den Anfängerkurs III durch. Verschafft euch zunächst einen Überblick über die vier Seiten (einfach mal durchklicken und überfliegen) und arbeitet dann die Seiten durch. --Michael Reschke

Notizen[Bearbeiten]

Beispielprogramm: If-Anweisung[Bearbeiten]

Ich zitiere einfach nur „die If-Schleife taucht hier gar nicht auf? (...) Ganz einfach, weil die If-Anweisung keine Schleife ist“[1] --Michael Reschke

dim wahl as integer
'
cls
'
print "Was möchtest du tun?"
print  'die Möglichkeiten anzeigen
print "1) aus dem Fenster starren"
print "2) weiterhin auf die Auswahl starren"
print "3) das Tutorial fertig lesen"
print "4) mich entscheiden...."
print
print
input "Deine entscheidung (1-4): ", wahl 'entscheidung abfragen
'
if wahl = 1 then'erste möglichkeit
    print "Dann starre halt weiterhin aus dem Fenster..."
    sleep
end if
if wahl = 2 then 'zweite möglichkeit
    print "Dann starre halt weiterhin auf den Bildschirm..."
    sleep
end if
if wahl = 3 then 'die dritte
    print "gute entscheidung!"
    sleep
end if
if wahl = 4 then 'die vierte
    print "bitte mach das...."
    sleep
end if
if wahl < 1 or wahl > 4 then ' ansonsten
    print "falsche eingabe!"
    sleep
end if
'
end

Beispielprogramm: SELECT CASE-Block[Bearbeiten]

Mit leichten Korrekturen ('-Kommentare) gegenüber der FB-Portal.de-Version:

dim wahl as string
'
cls
'
print "Was möchtest du tun?"
print  'die möglichkeiten anzeigen
print "1) aus dem Fenster starren"
print "2) weiterhin auf die Auswahl starren"
print "3) das Tutorial fertig lesen"
print "4) mich entscheiden...."
print
print
print "Deine Entscheidung (1-4)" 'entscheidung abfragen
' die schleife zur abfrage
do
    wahl = inkey 'wahl wird der Wert von inkey zugewiesen
    'inkey ist eine Variable, in der der ASCII Wert der momentan gedrückten Taste steht
loop until wahl <> "" 'Abbruch der Schleife, wenn wahl nicht ““ ist
'
select case wahl 'select case block
    case chr(27)
        end
    case "1" 'erste möglichkeit
        print "Dann starre halt weiterhin aus dem Fenster..."
    case "2" 'zweite möglichkeit
        print "Dann starre halt weiterhin auf den Bildschirm..."
    case "3" 'die dritte
        print "gute Entscheidung!"
    case "4" 'die vierte
        print "bitte mach das...."
    case else ' und der else-Block
        print "falsche Eingabe!"
end select
'
sleep
end

Die Do-Loop-Schleife[Bearbeiten]

DIM wahl AS String

Do

    do
        wahl = inkey 'wahl wird der Wert von inkey zugewiesen
    loop while wahl = "" 'Schleife wird durchlaufen, solange wahl den Wert ““ hat.

    PRINT wahl

loop while wahl <> "x"

SLEEP

Die FOR-NEXT-Schleife[Bearbeiten]

dim x as integer

for x = 0 to 100 'Die Schleife wird durchlaufen, bis x den Wert 100 hat.
    print "Schleifendurchlauf nummer:", x
next x

sleep
end
um eine If-Bedingung erweitert
dim x as integer

for x = 0 to 100 'Die Schleife wird durchlaufen, bis x den Wert 100 hat.
    
    If x < 100 then 
        
        print "Schleifendurchlauf Nummer: "; x
        
    Else
        
        print "Schleifendurchlauf Nummer:"; x
        print "Schleifendurchlauf beendet."
    
    End if
    
next x

sleep
end
For-Next-Schleife mit Step
dim x as integer

screen 15 'Anzeige: 400x300 Pixel und 256 Farben

for x = 0 to 256 step 4 'Die Schleife wird in 4erschritten durchlaufen, bis x den Wert 256 hat.
    color x
    print "Na, welche Farbe ist das?"
next x

sleep
end

Die While-Wend-Schleife[Bearbeiten]

Ich habe mir gerade in der Befehlsreferenz die Erklärung für die While-Wend-Schleife gesucht. Sie ist hier zu finden.

Die Syntax lautet:

WHILE Bedingung
   [...Programmcode...]
WEND
Beispiel der Referenz (überarbeitet!)
Dim As String Text, Text2
Dim As Integer index

Text  = "Das hier ist der Beispielsatz."
index = Len( Text ) - 1

While( index >= 0 )
    
   Text2 += Chr( Text [index] )
   index -= 1

Wend

Print "Original:     "  ; Text  
Print "Rueckwaerts:  "  ; Text2

SLEEP

Schleifen verlassen (Exit For, Exit While und Exit Do)[Bearbeiten]

DIM AS Integer Wert = 1, Testwert = 20

For i As Integer=1 To 20

    If Wert>Testwert Then Exit For

    Wert+=i*Wert
    
    Print "Die Werte lauten"; Wert; " und"; Testwert; "."

Next

SLEEP

Die Ausgabe auf dem Bildschirm lautet:

Die Werte lauten 2 und 20.
Die Werte lauten 6 und 20.
Die Werte lauten 24 und 20.

In Zeile 3 ist also der Wert bereits größer als der Testwert. Man muss hier aber bedenken, dass die Bedingung vor der Addition der Werte geprüft wird. Dass 24 größer als 20 ist, wird also erst erkannt, als die Schleife zum 4. Mal durchlaufen wird. Würde man die If-Anweisung vor der Print-Anweisung platzieren, so würde die dritte Zeile nicht mehr ausgegeben.

Siehe hier:

DIM AS Integer Wert = 1, Testwert = 20

For i As Integer=1 To 20

    Wert+=i*Wert

    If Wert>Testwert Then Exit For
    
    Print "Die Werte lauten"; Wert; " und"; Testwert; "."

Next

SLEEP

Die Ausgabe auf dem Bildschirm lautet jetzt:

Die Werte lauten 2 und 20.
Die Werte lauten 6 und 20.

Die Continue-Funktion[Bearbeiten]

Die Continue wird im Anfängerkurs III, Seite 2 eingeführt. Befehlsreferenz-Erläuterung.

DO
   PRINT "Diese Zeile wird immer angezeigt."
   IF INKEY <> "" THEN EXIT DO
   CONTINUE DO
   PRINT "Diese Zeile wird NIE angezeigt."
LOOP

PRINT "Schleife verlassen"

SLEEP

Wenn ich die Referenz richtig verstehe, leistet die Continue-Funktion zweierlei:

  1. Springt in einer DO...LOOP-, FOR...NEXT- oder WHILE...WEND-Schleife an das Schleifen-Ende. Dort wird dann die Ende-Bedingung überprüft.
  2. Bei einer FOR...NEXT-Schleife geht's ebenfalls ans Schleifenende (?), der Schleifenzähler wird erhöht.
Beispiel im Kurs, Seite 2
'Die Datei ist schon zum Lesen geöffnet
While Not Eof(#Datei) 'noch nicht am Dateiende?
  Line Input #Datei, Zeile ' eine Zeile einlesen..
  If Zeile="" Then Continue While 'Leerzeilen sollen nicht bearbeitet werden
  'hier wäre der Block zum Bearbeiten
  '..
  '
Wend 'Schleifenende
Close Datei 'ist immer guter Stil, wenn die Dateibearbeitung beendet ist

Das Beispiel kann man nicht ausführen, aber ich denke, ich verstehe grob, worum es geht: Wenn wir eine Leerzeile einlesen, dann soll er das nicht bearbeiten. Er soll dann die Schleife fortsetzen.

Ein weiteres Beispiel (Game-Gestaltung)
'Programminitialisierung
'..
Do 'Hauptschleife des Spiels
  '..
  '..
  If Leben<=0 Then Continue Do 'Spiel von vorne beginnen..
  If Status="Gewonnen" Then Exit Do 'Spielende, Tusch, Bildchen etc.
Loop 'diese Endlosschleife muß von einer Exit-Anweisung beendet werden
Ich hab selbst mal was versucht (Continue beim Spielen.bas)
'...

DIM AS integer A, B, C, D

'Spieler (1) - A = LPs, B = Schaden
'Spieler (2) - C = LPs, D = Schaden

A = 100 : B = 0 : C = 100 : D = 0

Print "Das Spiel beginnt. "
Print "Beide Figuren haben jetzt 100 Lebenspunkte. "
print "Bei jeder Runde erleiden die Figuren einen Schaden (0-10). "
print "In dieser Version des Spiels muessen Sie den Schaden noch "_
      "selbst beziffern. "
PRINT
PRINT

Do 'Hauptschleife des Spiels
    
    Print 
    PRINT "Spieler (1) hat "; A; "LPs."
    Print "Spieler (2) hat "; C; "LPs."
    Print
    
    INPUT "Spieler (1) erleidet als Schaden (0-10): ", B
    INPUT "Spieler (2) erleidet als Schaden (0-10): ", D
    
    A = A - B
    C = C - D
    
    If A > 0 AND C > 0 Then
        
        Continue Do 'Neuer Durchlauf

    End IF

    If A=0 Then 
        
        PRINT
        PRINT "Spieler (1) hat leider verloren."
        'Exit Do 'Ende der Do-Schleife
        
    Else
        
        PRINT
        PRINT "Spieler (2)  hat leider verloren."
        'Exit Do 'Ende der Do-Schleife

    End if
    
    Exit Do 'Ende der Do-Schleife

Loop 'diese Endlosschleife muß von einer Exit-Anweisung beendet werden

SLEEP

Arrays[Bearbeiten]

Arrays werden auf Seite 3 behandelt.

Was sind Arrays?

  • Arrays sind (grob gesagt) Felder mit Zeilen und Spalten, bei denen die einzelnen Elemente mit Indizes angesprochen werden können.
Anwendungsbeispiel
Dim As Integer a(9), i, j
For i=LBound(a) To Ubound(a) 'von der Untergrenze bis zur Obergrenze
  Print "" &i &":";
  Input "", j
Next i
Print "" &i &" Zahlen eingegeben"
Sleep
LBOUND
  • ...gibt den kleinsten Index des angegebenen Arrays zurück.
  • Referenz
UBOUND
  • ...gibt den größten Index des angegebenen Arrays zurück.
  • Referenz
Beispiel für den Befehl "LBOUND"
DIM Array(-10 TO 10, 5 TO 15, 1 TO 2) AS INTEGER
DIM unArray() AS INTEGER

PRINT LBOUND(Array, 1)
PRINT LBOUND(Array, 2)
PRINT LBOUND(Array, 3)
PRINT LBOUND(Array, 4)
PRINT
PRINT LBOUND(unArray)

Kommentar[Bearbeiten]

Bei den Seiten 3 und 4 ist der konkrete Nutzen noch nicht ersichtlich: Wie man mit Arrays arbeitet, müsste man sich daher später noch einmal ansehen! Der Anfängerkurs III ist wenig anfängerfreundlich. Daran müsste wohl noch gearbeitet werden.

Anmerkungen[Bearbeiten]

  1. Anfängerkurs III, S. 2