In Programmiersprachen müssen häufig irgend welche Arbeiten mehrmals abgearbeitet werden. Zum Beispiel die Ausgabe aller Datensätze einer Adressdatenbank. In diesem Fall kommt eine Schlaufe zur Anwendung. Wir kennen folgende Schlaufen
For next ist eine Schlaufe mit einer bekannten Anzahl Durchläufen.
for i = 1 to 10 beep next i
Würde zehn mal einen Pipston von sich geben. Dieser wäre vermutlich nicht hörbar weil die töne derart schnell hintereinander folgen, dass das menschliche träge Ohr diese als einen einzigen Ton wahr nehmen würde.
Die folgende Schlaufe i hat eine zweite geschachtelte Schlaufe x welche eine Verzögerung verursacht.
for i = 1 to 10 beep for x = 1 to 100000 next next i
Grundsatz: "Wer misst, der misst Mist".
Der folgende Code kann verwendet werden um die Arbeitsgeschwindigkeit des Prozessors unter der Verwendung unterschiedlicher Variabeldeklarationen zu testen. Die Variabeln v1 und v2 wird unterschiedlich deklariert. Braucht die Zuweisung von Informationen an v1 und v2 nun unterschiedlich viel Zeit wenn v1 und v2 Byte oder long ist?
Sub SpeedTest() Dim x As Long Dim i As Integer Dim v1 as byte Dim v2 as byte vStart = Time() For x = 1 To 100000 For i = 1 To 254 v1 = i v2 = v1 Next Next vEnde = Time() Debug.Print "Start:" & vStart Debug.Print "Ende :" & vEnde Debug.Print "Dauer:" & vEnde - vStart End Sub
Ersetzen Sie die Zeile: "Dim v1 as byte" und "Dim v2 as byte" mit unterschiedlichen Variabeltypen und füllen sie die folgende Tabelle mit der Ausführungsgeschwindigkeit bei unterschiedlichen Schlaufenanzahlen aus:
Variabeltyp: | Arbeitsdauer | ||
---|---|---|---|
100'000 | 200'000 | 400'000 | |
byte | |||
integer | |||
long | |||
single | |||
double | |||
ohne Deklaration |
Ist die Ausführungszeit bei 200'000 Durchläufen doppelt solange wie bei 100'000? Und wie ist der Faktor bei 400'000 Durchläufen? Ist die erste Zeitmessung identisch mit einer zweiten Zeitmessung?
Problemzonen dieses Testes: a) Die kurze Zeit welche dieses Programm arbeitet ergibt kein genaues Testergebnis. b) Windows wird durch Manipulation des Arbeitsspeichers (Chache) das Testergebnis beeinflussen.
Do while ist eine Schlaufe mit einer unbekannten Anzahl Durchläufen. Das Ende der Schlaufe wird durch eine Bedingung festgelegt. Das Folgende Beispiel prüft ob der Inhalt der Funktion time() kleiner als 11:45 ist. Solange dies der Fall ist (die Bedingung ist wahr) wird die Schlaufe von loop bis do geschlossen und die dazwischen liegenden Befehle abgearbeitet. Ist die Bedingung false, so wird der Befehl nach loop ausgeführt.
do while time()<#11:45# print "Arbeiten!" loop Print "Mittagszeit"
Im obigen Beispiel kann es vorkommen, dass die Schlaufe nie ausgeführt wird, weil die Bedingung zum Beispiel am Nachmittag nie wahr sein wird. Möchte man jedoch mindestens einen Schlaufendurchlauf erzwingen kann die Bedingung auch ans Schlaufenende gesetzt werden.
do print "Arbeiten!" loop while time()<#11:45# Print "Mittagszeit"
Viele Programmiersprachen kennen die do while Schlaufe nicht, dafür jedoch while wend. Das Funktionsprinzip ist identisch. Mit dem kleinen Unterschied dass bei While wend die Bedingung immer am Beginn der Schlaufe steht (jedenfalls in VB). do while ist also wesentlich besser strukturierbar und ist zu bevorzugen.
while bedingung anweisungen wend
Die whit-Schlaufe ist ab VB4 und in VBA (mindestens VBA Excel) bekannt. Sie ist in der Lage eine Collection abzuarbeiten. Sind zum Beispiel auf einer Dialogbox mehrere Radio-Buttons, so bezeichnet man diese als eine Collection. Auch alle Checkboxen einer Dialogbox bilden eine Collection. Oder alle Symbolleisten einer Anwendung bilden eine Collection.
So kann nun mit der whit-Schlaufe geprüft werden, welcher Radiobutton einer Collection angeklickt ist. Die Grundsätzliche Schreibweise lautet:
whit objekt .Eigenschaft .Eigenschaft end whit
Wenn während des abarbeiten einer Schlaufe etwas eintritt welches den vorzeitigen Abbruch der Schlaufe notwendig macht, so kann dies in VB mit exit erreicht werden. Soll zum Beispiel für mindestens eine Minute lang geheizt werden, jedoch beim erreichen der Temperatur von 65° abgebrochen werden, so könnte das folgendermassen aussehen (Pseudocode):
vStart=now() do now()-vStart > 1 Minute Heize weiter if Temperatur > 65° then exit loop