2.6 Schleifen 

Schleifen werden in Programmen häufig benötigt. Sie ermöglichen den mehrfachen Durchlauf von Anweisungen. Darin liegt eine besondere Stärke der Programmierung allgemein: die schnelle wiederholte Bearbeitung ähnlicher Vorgänge. Es gibt die Schleifenstrukturen: Do...Loop, For...Next, For Each...In... und With.
Mithilfe der Strukturen steuern Sie die Wiederholungen eines Anweisungsblocks (die Anzahl der Schleifendurchläufe). Dabei wird der Wahrheitswert eines Ausdrucks (der Schleifenbedingung) oder der Wert eines numerischen Ausdrucks (Wert des Schleifenzählers) benötigt.
Collection
Die Schleife For Each...In... wird meist bei Feldern oder Collections (Auflistungen) eingesetzt, siehe Abschnitt 4.5.8. Die Anweisung With dient zur Steuerung einer besonderen Schleife mit nur einem Durchlauf.
2.6.1 For ... Next 

Falls die Anzahl der Schleifendurchläufe bekannt oder vor Beginn der Schleife berechenbar ist, sollten Sie die For... Next-Schleife verwenden. Ihr Aufbau sieht wie folgt aus:
For Zähler = Anfang To Ende [ Step = Schritt ] [ Anweisungen ] [ Exit For ] [ Anweisungen ] Next [ Zähler ]
Step
Die Zahlen-Variable Zähler wird zunächst auf den Wert von Anfang gesetzt. Nach jedem Durchlauf wird sie um den Wert von Schritt verändert, also vergrößert oder verkleinert. Falls Step = Schritt nicht angegeben wurde, wird die Variable um 1 vergrößert. Der neue Wert von Zähler wird mit dem Wert von Ende verglichen.
- Falls die Schrittweite positiv ist und der Wert von Zähler nicht größer als der Wert von Ende ist, wird die Schleife wiederum durchlaufen.
- Falls die Schrittweite negativ ist und der Wert von Zähler nicht kleiner als der Wert von Ende ist, wird die Schleife ebenfalls wiederum durchlaufen.
- Falls die Schrittweite positiv ist und der Wert von Zähler größer als der Wert von Ende ist oder falls die Schrittweite negativ ist und der Wert von Zähler kleiner als der Wert von Ende ist, wird die Schleife beendet.
Exit For
Die Anweisung Exit For können Sie einsetzen, um die Schleife aufgrund einer speziellen Bedingung sofort zu verlassen.
In dem folgenden Programm im Projekt ForNext werden durch Aufruf von vier Buttons vier unterschiedliche Schleifen durchlaufen, siehe Abbildung 2.29.
Abbildung 2.29 Verschiedene For-Schleifen
Der Programmcode:
Public Class Form1 Private Sub cmdSchleife1_Click(...) Handles ... Dim i As Integer lblA1.Text = "" For i = 3 To 7 lblA1.Text &= i & vbCrLf Next End Sub Private Sub cmdSchleife2_Click(...) Handles ... Dim i As Integer lblA2.Text = "" For i = 3 To 11 Step 2 lblA2.Text &= i & vbCrLf Next End Sub Private Sub cmdSchleife3_Click(...) Handles ... Dim i As Integer lblA3.Text = "" For i = 7 To 3 Step –1 lblA3.Text &= i & vbCrLf Next End Sub Private Sub cmdSchleife4_Click(...) Handles ... Dim d As Double lblA4.Text = "" For d = 3.5 To 7.5 Step 1.5 lblA4.Text &= d & vbCrLf Next End Sub End Class
Listing 2.22 Projekt »ForNext«
Zur Erläuterung der ersten Schleife:
- Als Zählervariable dient i.
- Die Schleife wird erstmalig mit i = 3 und letztmalig mit i = 7 durchlaufen.
- Es ist keine Schrittweite angegeben, also wird als Schrittweite 1 genommen.
- Statt Next hätte man zur größeren Deutlichkeit auch Next i schreiben können.
Zur Erläuterung der restlichen Schleifen:
- Bei der zweiten Schleife wurde die Schrittweite 2 gewählt.
- Die dritte Schleife läuft abwärts, daher muß eine negative Schrittweite gewählt werden.
- In der vierten Schleife wird gezeigt, dass eine Schleife auch nicht-ganzzahlige Werte durchlaufen kann.
2.6.2 Do ... Loop 

Steuerung über Bedingung
Ist die Anzahl der Schleifendurchläufe nicht bekannt bzw. vor Beginn der Schleife nicht berechenbar, so sollten Sie die Do ... Loop-Schleife verwenden. Es gibt sie in fünf verschiedenen Varianten:
While
- Do While...Loop: Prüft die Bedingung zum Weiterlaufen der Schleife am Anfang der Schleife.
- Do...Loop While: Prüft die Bedingung zum Weiterlaufen der Schleife am Ende der Schleife.
Until
- Do Until...Loop: Prüft die Bedingung zum Abbruch der Schleife am Anfang der Schleife.
- Do...Loop Until: Prüft die Bedingung zum Abbruch der Schleife am Ende der Schleife.
- Do...Loop: Die Bedingung zum Weiterlaufen oder Abbruch der Schleife wird nicht geprüft, daher ist eine Verzweigung in der Schleife und ein Exit Do zur Beendigung der Schleife notwendig.
Der allgemeine Aufbau sieht wie folgt aus:
Do { While | Until } Bedingung [ Anweisungen ] [ Exit Do ] [ Anweisungen ] Loop
oder
Do [ Anweisungen ] [ Exit Do ] [ Anweisungen ] Loop { While | Until } Bedingung
Zufallsgenerator
Im folgenden Programm im Projekt DoLoop werden alle fünf Möglichkeiten genutzt. Es werden Zahlen addiert, solange die Summe der Zahlen kleiner als 5 ist, siehe Abbildung 2.30. Da die Zahlen durch einen Zufallsgenerator erzeugt werden, ist die Anzahl der Schleifendurchläufe nicht vorhersagbar.
Randomize(), Rnd()
Der Zufallszahlengenerator wird mithilfe der Funktion Rnd() realisiert. Diese liefert quasizufällige Zahlen zwischen 0 und 1. Der Zufallszahlengenerator muss mithilfe der Prozedur Randomize() vor der Benutzung initialisiert werden, da anderenfalls immer die gleichen Zufallszahlen geliefert würden. Die Initialisierung wird pro Programmaufruf einmalig beim Laden des Formulars vorgenommen.
Abbildung 2.30 Bedingungsgesteuerte Schleife
Load, MyBase
Dieser Zeitpunkt wird durch das Ereignis Load gekennzeichnet. Sie erstellen den Rahmen dieser Ereignisprozedur, indem Sie einen Doppelklick auf einer freien Stelle des Formulars ausführen. Die zugehörige Ereignisprozedur behandelt das Ereignis MyBase.Load. Mit MyBase können Sie auf die Basisklasse der Klasse zugreifen, in der Sie sich befinden; in diesem Fall ist das die Klasse des Formulars Form1. Mehr zum Begriff MyBase finden Sie in Abschnitt 5.8.
Public Class Form1 Private Sub Form1_Load(...) Handles MyBase.Load Randomize() End Sub Private Sub cmdSchleife1_Click(...) Handles ... Dim Summe As Single lblAnzeige.Text = "" Summe = 0 Do While Summe < 5 Summe += Rnd() lblAnzeige.Text &= Summe & vbCrLf Loop lblAnzeige.Text &= "Fertig!" End Sub Private Sub cmdSchleife2_Click(...) Handles ... Dim Summe As Single lblAnzeige.Text = "" Summe = 0 Do Summe += Rnd() lblAnzeige.Text &= Summe & vbCrLf Loop While Summe < 5 lblAnzeige.Text &= "Fertig!" End Sub Private Sub cmdSchleife3_Click(...) Handles ... Dim Summe As Single lblAnzeige.Text = "" Summe = 0 Do Until Summe >= 5 Summe += Rnd() lblAnzeige.Text &= Summe & vbCrLf Loop lblAnzeige.Text &= "Fertig!" End Sub Private Sub cmdSchleife4_Click(...) Handles ... Dim Summe As Single lblAnzeige.Text = "" Summe = 0 Do Summe += Rnd() lblAnzeige.Text &= Summe & vbCrLf Loop Until Summe >= 5 lblAnzeige.Text &= "Fertig!" End Sub Private Sub cmdSchleife5_Click(...) Handles ... Dim Summe As Single lblAnzeige.Text = "" Summe = 0 Do Summe += Rnd() lblAnzeige.Text &= Summe & vbCrLf If Summe >= 5 Then Exit Do Loop lblAnzeige.Text &= "Fertig!" End Sub End Class
Listing 2.23 Projekt »DoLoop«
Zur Erläuterung:
- Im Folgenden wird nur die erste Ereignisprozedur cmdSchleife1_Click() erläutert. Die anderen sind vergleichbar aufgebaut. Auf die unterschiedliche Schleifensteuerung wurde bereits weiter oben eingegangen.
- Der Inhalt des Labels wird von alten Ausgaben gelöscht.
Summe berechnen
- Die Variable Summe wird zunächst mit dem Wert 0 initialisiert. Dies ist in Visual Basic eigentlich nicht nötig, gehört aber zum guten Programmierstil, da Sie auf diese Weise den Wert der Variablen zu Beginn der Schleife sicherstellen können.
- Zu Beginn der Schleife wird geprüft, ob die Summe der Zahlen kleiner als 5 ist. Trifft dies zu, kann die Schleife durchlaufen werden.
-
- Hinweis: Bei einer solchen kopfgesteuerten Schleife (d. h., die Abbruchbedingung wird im Kopf der Schleife geprüft) kann es vorkommen, dass sie niemals durchlaufen wird.
- Der Wert der Variablen Summe wird um eine Zufallszahl zwischen 0 und 1 erhöht.
- Der Inhalt des Labels wird um den aktuellen Wert der Summe und einen Zeilenumbruch verlängert.
- Sie kommen zum Ende der Schleife, zur Anweisung Loop. Sie führt dazu, dass das Programm wieder zu Beginn der Schleife fortsetzt. Es wird wiederum geprüft, ob die Summe der Zahlen kleiner als 5 ist. Sobald dies nicht mehr zutrifft, läuft das Programm hinter der Anweisung Loop weiter.
- Es wird die Ausgabe Fertig! erzeugt.
2.6.3 With 

Mithilfe von With führen Sie eine Reihe von Anweisungen für ein einzelnes Objekt durch. Dabei wird der einmal erstellte Bezug zum Objekt mehrfach verwendet. Bei einem längeren Objektnamen ist dies sehr nützlich und übersichtlich. Der Aufbau sieht wie folgt aus:
With Objekt [ Anweisungen ] End With
Ein Beispiel im Projekt WithBlock:
Public Class Form1 Private Sub cmdAnzeige_Click(...) Handles ... With lblAnzeige .BorderStyle = BorderStyle.Fixed3D .BackColor = Color.Yellow .Text = "Test" .Location = New Point(20, 50) End With End Sub End Class
Listing 2.24 Projekt »WithBlock«
Zur Erläuterung:
- Die Eigenschaften des Labels lblAnzeige werden mithilfe von With geändert.
- Die Eigenschaften Rahmenstil, Hintergrundfarbe, Textinhalt und Position werden nacheinander gesetzt. Dabei muss zu Beginn der Anweisung jeweils nur ein Punkt angegeben werden. Da das Programm sich innerhalb des With-Blocks befindet, ist es klar, auf welches Objekt sich die Änderungen beziehen.
2.6.4 Übungen 

Anhand einer Reihe von Übungsaufgaben zu Schleifen (und Verzweigungen) werden im Folgenden einige typische Probleme der Programmierung in Visual Basic trainiert. Der visuelle Teil der Lösung enthält in der Regel nur ein einfaches Textfeld zur Eingabe, einen oder zwei Buttons zum Durchführen der Aufgabe und ein einfaches Label zur Ausgabe.
Übung ÜForNext1
Übung ÜForNext1
For-Schleife: Schreiben Sie ein Programm mit einer einfachen Schleife, das nacheinander die folgenden Zahlen ausgibt: 35; 32,5; 30; 27,5; 25; 22,5; 20.
Übung ÜForNext2
Übung ÜForNext2
For-Schleife: Erweitern Sie die vorherige Aufgabe. Am Ende der Zeile sollen Summe und Mittelwert aller Zahlen angezeigt werden, siehe Abbildung 2.31.
Abbildung 2.31 Übung ÜForNext1 und 2
Übung ÜDoLoop
Übung ÜDoLoop
Do...Loop-Schleife: Schreiben Sie ein Programm, mit dessen Hilfe eine eingegebene Zahl wiederholt halbiert und ausgegeben wird. Das Programm soll beendet werden, wenn das Ergebnis der Halbierung kleiner als 0,001 ist, siehe Abbildung 2.32.
Abbildung 2.32 Übung ÜDoLoop
Übung ÜZahlenraten
Übung ÜZahlenraten
If…Else: Schreiben Sie ein Programm, mit dem das Spiel Zahlenraten gespielt werden kann: Per Zufallsgenerator wird eine Zahl zwischen 1 und 100 erzeugt, aber nicht angezeigt. Der Benutzer soll so lange Zahlen eingeben, bis er die Zahl erraten hat. Als Hilfestellung soll jedes Mal ausgegeben werden, ob die eingegebene Zahl größer oder kleiner als die zu ratende Zahl ist, siehe Abbildung 2.33.
Abbildung 2.33 Übung ÜZahlenraten
Übung ÜSteuertabelle
Übung ÜSteuertabelle
For-Schleife, If…Else oder Select Case: Erweitern Sie das Programm aus Übung ÜSteuerbetrag. Schreiben Sie ein Programm, das zu einer Reihe von Gehältern u. a. den Steuerbetrag berechnet und ausgibt. In Tabelle 2.15 sind die Steuersätze angegeben.
Gehalt | Steuersatz |
bis einschl. 12.000 € |
12 % |
von 12.000 bis einschl. 20.000 € |
15 % |
von 20.000 bis einschl. 30.000 € |
20 % |
über 30.000 € |
25 % |
Es sollen für jedes Gehalt von 5.000 € bis 35.000 € in Schritten von 3.000 € folgende vier Werte ausgegeben werden: Gehalt, Steuersatz, Steuerbetrag, Gehalt abzüglich Steuerbetrag. Jedes Gehalt soll mit den zugehörigen Werten in einer eigenen Zeile ausgegeben werden, siehe Abbildung 2.34.
Abbildung 2.34 Übung ÜSteuertabelle