Kurs:FreeBASIC/Lerngruppen/Testlauf/Anfängerkurs III
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
BearbeitenArbeitet 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
BearbeitenBeispielprogramm: If-Anweisung
BearbeitenIch 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
BearbeitenMit 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
BearbeitenDIM 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
Bearbeitendim 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
BearbeitenIch 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)
BearbeitenDIM 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
BearbeitenDie 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:
- Springt in einer DO...LOOP-, FOR...NEXT- oder WHILE...WEND-Schleife an das Schleifen-Ende. Dort wird dann die Ende-Bedingung überprüft.
- 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
BearbeitenArrays 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
BearbeitenBei 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.