Quick Basic: For-Next

Aus Wikibooks

Grundlagen und Syntax[Bearbeiten]

Bei einer FOR-Schleife wird ein Anweisungsblock eine bestimmte Anzahl mal ausgeführt.

Syntax:

 FOR Laufvariable = Untergrenze TO Obergrenze [ STEP Schrittweite ]
     Anweisungen
     [ EXIT FOR ]
     Anweisungen
 NEXT Laufvariable


Dabei wird eine Variable verändert:

 FOR x = 0 TO 5
     Anweisungen
 NEXT x

Hier würden die Anweisungen insgesamt 6x ausgeführt werden. Beim ersten Durchlauf würde die Variable x 0 sein, beim zweiten 1, beim dritten 2, beim vierten 3, beim fünften 4 und beim sechten 5. Man kann durch das optionale STEP-Schlüsselwort festlegen, in welchen Schritten sich die Zählervariable - hier x - verändern soll:

 FOR zaehler = 1 TO 7 STEP 2
     Anweisungen
 Next zaehler

Hier würde zaehler im ersten Durchlauf 1, im zweiten 3, im dritten 5 und im vierten 7 sein. Die Schrittweite kann auch Werte kleiner 1 annehmen oder negativ werden: Bei For c=2 to 0 step -1 nimmt c nacheinander die Werte 2, 1 und 0 an.

EXIT FOR-Anweisung[Bearbeiten]

Mit der EXIT FOR-Anweisung ist es möglich eine FOR-NEXT-Schleife zu beenden.

FOR i = 1 TO 100
   IF i > 10 THEN EXIT FOR
   PRINT i
NEXT i

Dieses Beispiel wird nur die Zahlen von 1 bis 10 ausgeben. Beim 11. Durchlauf (wenn i = 11 ist) ist die Bedingung i > 10 erfüllt und die die EXIT FOR-Anweisung wird ausgeführt. Somit wird hier die FOR-Scheife verlassen.

Beispiele[Bearbeiten]

Quadratzahlen[Bearbeiten]

Im folgenden Programmbeispiel sollen die Quadratzahlen von 1 bis 5 berechnet werden. Hier wird zuerst eine Kopfzeile geschrieben, und darunter eine Liste der Zahlen 1, 2, 3, 4, 5 und den dazugehörigen Quadratzahlen 1, 4, 9, 16, 25.

  Dim i As Integer
  
  Print "Zahl", "Quadratzahl"    '''Kopfzeile''
  For i = 1 To 5
      Print i, i*i               '''Liste mit den Quadratzahlen erstellen''
  Next i

Primzahlen[Bearbeiten]

Das nächste Beispiel soll zeigen, wie du mit Hilfe einer FOR-Schleife überprüfen kannst ob eine gegebene Zahl eine Primzahl ist. (zur Erinnerung: eine Primzahl ist eine Zahl, die nur durch eins und sich selbst teilbar ist.)

Idee: wenn n unsere Zahl ist wollen wir einfach der Reihe nach ausprobieren ob n durch alle Zahlen von 2 bis n-1 teilbar ist. n ist durch eine Zahl i (ohne Rest) teilbar, genau dann wenn n MOD i = 0 Und nun zu unserem kleinen Programm:

  DIM i AS INTEGER, n AS INTEGER, nichtPrim AS INTEGER
  
  n = 12                      'die Zahl die wir überprüfen wollen
  
  nichtPrim = 0               'hier wird gespeichert ob ein Teiler gefunden wurde
  FOR i = 2 TO n - 1
     IF n MOD i = 0 THEN      'wenn Teiler gefunden..
        nichtPrim = 1         '..merken und..
        EXIT FOR              '..Schleife verlassen
     END IF
  NEXT i
  
  IF nichtPrim = 0 THEN       'und zum Schluss wollen wir das Ergebnis auf dem Bildschirm ausgeben
     PRINT n, "ist eine Primzahl!"
  ELSE
     PRINT n, "ist KEINE Primzahl!! -  Gefundener Teiler:", i
  END IF

Primzahlen, Teil 2[Bearbeiten]

Hier wollen wir den Code des vorigen Beispiels noch etwas optimieren.

Bekanntlich sind alle geraden Zahlen (2, 4, 6, etc.) durch 2 teilbar. Deshalb reicht es völlig aus die Teilbarkeit nur für ungerade Zahlen zu überprüfen.

Darüber hinaus ist der größte Teiler einer Zahl n maximal gleich der Wurzel aus n. Also reicht es als Obergrenze der Schleife die Wurzel aus n, also SQR(n) anzugeben.

  DIM i AS INTEGER, n AS INTEGER, nichtPrim AS INTEGER
  
  n = 377                        'die Zahl die wir überprüfen wollen
  
  IF n MOD 2 = 0 THEN            'Zahl ist durch 2 teilbar
     PRINT n, "ist durch 2 Teilbar."
  
  ELSE                           'falls nicht durch 2 teilbar
     nichtPrim = 0
     FOR i = 3 TO SQR(n) STEP 2  'neue Grenzen und Schrittweite
        IF n MOD i = 0 THEN
           nichtPrim = 1
           EXIT FOR
        END IF
     NEXT i
     
     IF nichtPrim = 0 THEN
        PRINT n, "ist eine Primzahl!"
     ELSE
        PRINT n, "ist KEINE Primzahl!! -  Gefundener Teiler:", i
     END IF
  END IF

Im Vergleich zur ersten Version ist unser neuer Algorithmus um einiges schneller als der vorherige, das liegt insbesondere daran, dass die Schleife wesentlich enger bei einanderliegende Grenzen hat und dass wir in größeren Schritten die Schleife durchlaufen.