Zum Inhalt springen

Visual Basic .NET: Feldschleifen

Aus Wikibooks

Am häufigsten werden Felder in der Praxis in Zusammenhang mit Schleifen verwendet, besonders mit Zählschleifen. Mit Zählschleifen wird die Zählvariable von 0 bis zur Obergrenze hochgezählt, diese Variable wird dann als Index für das Feld verwendet. Mit jedem Schleifendurchlauf wird so eines der Feldelemente bearbeitet, diese Methodik dient dazu, an allen Elementen des Feldes eine ähnliche Operation vorzunehmen. Das folgende Beispiel zeigt ein elementares Beispiel. Ein Feld wird mit Werten initialisiert. Zuerst die Initialisierung mit der klassischen Methode:

Code:  

Dim Feld() As Integer = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

Vor allem bei komplexeren Werten, die sich aus Berechnungen ergeben, ist diese Variante sehr schreibaufwändig und meist auch redundant, da viele Werte auf die gleiche Art und Weise berechnet werden. Im folgenden wird das Feld mit denselben Werten belegt:

Code:  

Dim Feld(10) As Integer
For Zähler As Integer = 0 To 10
    Feld(Zähler) = Zähler
Next

Das Feld wird zunächst ohne Initialisierung deklariert, die Wertzuweisung erfolgt in der Schleife. In jedem Schleifendurchlauf wird der Zähler um eins erhöht, im ersten Schleifendurchlauf ist der Zähler null, im letzten zehn. Die dritte Zeile liest sich so: Dem Feldelement mit dem Index, der dem im Zähler gespeicherten Wert entspricht (Feld(Zähler)), wird der Wert des Zählers zugewiesen. Im ersten Schleifendurchlauf lautet dieser Befehl also Feld(0) = 0, im zweiten Durchlauf Feld(1) = 1, im dritten Durchlauf Feld(2) = 2, und so weiter.

Ein anderes Beispiel: Vorhin hatte ich die Fibonaccifolge erwähnt. Diese wird wie folgt gebildet: Das nullte Element ist 0, das erste Element ist 1. Jedes weitere Element ist die Summe der beiden vorhergehenden Elemente. Das zweite Element ist also die Summe des nullten und des ersten Elementes, also 1. Das dritte Element ist die Summe des ersten (1) und des zweiten Elementes (1), also 2. Versuchen Sie einmal, den Code zu entwickeln, der die ersten 20 Elemente der Fibonaccifolge in ein Feld schreibt und dann alle Werte ausgibt. Die Lösung sehen Sie unten.

Code:  

'Felddeklaration
Dim Fibonacci(20) As Integer
'Belegung der Feldelemente
Fibonacci(0) = 0
Fibonacci(1) = 1
For Count1 As Integer = 2 To 20
    Fibonacci(Count1) = Fibonacci(Count1 - 1) + Fibonacci(Count1 - 2)
Next
'Ausgabe
For Count2 As Integer = 0 To 20
    Console.WriteLine("Das " & Count2 & ". Element ist: " & Fibonacci(Count2))
Next

Ausgabe:  

Das 0. Element ist: 0
Das 1. Element ist: 1
Das 2. Element ist: 1
Das 3. Element ist: 2
Das 4. Element ist: 3
Das 5. Element ist: 5
Das 6. Element ist: 8
Das 7. Element ist: 13
...

Ich habe dieses Beispiel mit einigen Kommentaren versehen, die deutlich machen, wofür die einzelnen Befehle stehen. Zuerst wird das passende Feld deklariert. Dann werden die beiden vorgegebenen Werte im Feld gespeichert. Im folgenden errechnet eine Schleife die restlichen Werte rekursiv. Zuerst wird das dritte Element belegt, dann das vierte, dann das fünfte, und so weiter. Da nur auf die vorhergehenden Elemente zugegriffen wird, ist gesichert, dass nicht fälschlicherweise auf ein Element zugegriffen wird, dass noch nicht belegt wurde. Bei der Ausgabe wird für das Hinweisfeld ein Satz mithilfe der Verkettungsoperation erstellt. Dazu wandelt Visual Basic die Integer-Werte zunächst in String-Werte um, da die Verkettungsoperation nur für String-Operanden definiert ist.

Da die Werte der Fibonaccifolge in einem Feld vorliegen, können wir auch noch andere Sachen damit anstellen. Der folgende Code berechnet das Verhältnis zweier jeweils aufeinanderfolgender Werte. Wenn Sie diesen Code an den vorhergehenden Code anhängen oder die Ausgabeschleife (mit Count2) durch diesen Code ersetzen, wird Ihnen auffallen, dass sich die Verhältnisse bei steigenden Indizes immer weiter an 1,618... annähern. Dies ist eine spezifische Eigenschaft der Fibonaccifolge.

Code:  

'Ausgabe der Verhältnisse
For Count3 As Integer = 2 To 20
    'mit dem nullten Element können wir nicht rechnen - Gefahr der Division durch Null
    'deshalb müssen wir das Verhältnis von 0 und 1 auslassen und fangen mit dem von 1 und 2 an
    Console.WriteLine(Fibonacci(Count3) & "/" & Fibonacci(Count3 - 1) & " ergibt: " & (Fibonacci(Count3) / Fibonacci(Count3 - 1)))
    'was für ein Klammernhaufen...
Next

Ausgabe:  

1/1 ergibt: 1
2/1 ergibt: 2
3/2 ergibt: 1.5
5/3 ergibt: 1.6666667
8/5 ergibt: 1.6
13/8 ergibt: 1.625
21/13 ergibt: 1.6153846

Die Einsatzmöglichkeiten von Feldern mit Schleifen sind vielfältig. Bis jetzt sind wir noch nicht so weit, als dass ich alle Möglichkeiten vorführen könnte. Vieles wird man sich auch erst im Alltag ausdenken.

For-Each-Schleifen

[Bearbeiten]

Neben den klassischen Schleifen und Zählschleifen gibt es in Visual Basic eine besondere Schleifenart, die Feldschleife. Sie durchläuft nicht einen bestimmten Wertebereich, sondern die Elemente eines Feldes vom ersten bis zum letzten. Das klappt auch mit mehrdimensionalen Feldern. Auch hier muss man eine Zählvariable angeben, die vom gleichen Typ sein muss wie die Elemente des Feldes. Bei jedem Schleifendurchlauf wird der Wert von jeweils einem Schleifenelement in die Zählvariable kopiert, sodass man den Wert bearbeiten kann. Nach dem Schleifendurchlauf wird der Wert wieder in das aktuelle Feldelement zurückgespeichert und ein neuer Durchlauf mit dem nächsten Feldelement gestartet.

Code:  

Dim Feld() As Integer = {1, 2, 3, 4}
Dim Wert As Integer 'die Zählvariable
'Berechnung
For Each Wert In Feld
    Wert *= 5
Next
'Ausgabe
Dim Text As String
For Each Wert In Feld
    Text &= Wert & " "
Next
Console.WriteLine(Text)

Ausgabe:  

5 10 15 20

Hier sehen wir zwei typische Einsatzbereiche für Zählschleifen. Zählschleifen eignen sich dafür, an allen Feldelementen die gleiche Operation durchzuführen. In der ersten Zählschleife wird etwa jeder der Werte im Feld verfünffacht. Ein weiteres Einsatzgebiet ist die geordnete Behandlung von einzelnen Feldelementen nacheinander. Hier werden die Werte in einer Zeichenkette zusammengefügt und dann zusammenausgegeben. (Außerdem wird jeweils ein Leerzeichen eingefügt, damit man die Werte voneinander unterscheiden kann. Sonst wäre die Ausgabe nämlich „5101520“.)

Die Feldschleife hat einen großen Vorteil gegenüber der normalen Schleife: Man braucht nicht immer den aktuellen Index anzugeben, dadurch wird der Code kürzer. Andererseits hat sie auch einige Nachteile: Man weiß den aktuellen Index nicht und kann nicht etwa auf benachbarte Feldelemente zugreifen. Deshalb wird die Feldschleife vor allem bei Auflistungen von voneinander unabhängigen Elementen eingesetzt, was vor allem beim Programmieren mit Objekten sehr häufig vorkommt.

Ein Tipp: Wie bei der Zählschleife können Sie auch bei der Feldschleife die Zählvariable am Schleifenanfang deklarieren. Nach Ende der Schleife gibt es die Variable dann nicht mehr, wodurch die Übersichtlichkeit erhöht wird und Fehler von vornherein verhindern werden können.

Code:  

For Each Wert As Integer In Feld
    Wert *= 5
Next