Instrukcje iteracyjne służą do organizowania cykli programowych, tj. wielokrotnego wykonywania pewnych instrukcji. Oprócz opisanej w poprzednim odcinku pętli FOR istnieją również:
WHILE <wyrażenie> DO <instrukcja>
lub
WHILE <wyrażenie>
<instrukcje>
ENDWHILE
Pętla FOR używana jest do powtarzania zmiennej (np. x - rosnącej lub malejącej) i sprawdzaniu czy zmienna nie przekroczyła wymaganej wielkości. Natomiast dzięki pętli WHILE możesz stworzyć swoją własną pętlę (np. podobną do FOR). Pętla jest powtarzana dopóki spełnia warunek, np.
PROC main()
DEF x
x:=1
WHILE x<=100
WriteF('d ',x)
x:=x+1
ENDWHILE
ENDPROC
Program robi to samo co program przykładowy FOR w poprzednim odcinku. W tym przykładzie wymieniliśmy polecenie FOR na przypisaną do x wartość 1 oraz polecenie WHILE z dodatkowym wyrażeniem do zwiększania wartości x (x:=x+1). Właśnie w podobny sposób "pracuje" pętla FOR. Jest ważne, aby pamiętać, że sprawdzanie zmiennej x odbywa się przed instrukcjami w pętli WHILE. To znaczy, że pętla może nie zostać w ogóle wykonana, np. jeśli zamienimy z "x=<100" na "x>=100" to pętla będzie fałszywa (x ma przypisaną wartość 1, czyli x nie spełnia warunku). W takiej sytuacji pętla zostanie natychmiast przerwana i program zacznie dalsze działania po poleceniu ENDWHILE.
Teraz troche bardziej skomplikowany przykład:
PROC main()
DEF x,y
x:=1
y:=2
WHILE (x<10) AND (y>10)
WriteF('x is d and y is dn', x, y)
x:=x+2
y:=y+2
ENDWHILE
ENDPROC
W tym przykładzie użyliśmy 2 zmiennych. Jak tylko x lub y jest równe 10 lub więcej to pętla zostanie przerwana. Ustalamy na początku, że x ma wartość 1, a y ma wartość 2 oraz że x i y będzie rosło o tę samą wartość (czyli o 2). Z tego wynika, że po wykonaniu pętli WHILE x będzie się równało 7, a y będzie się równał 8.
REPEAT
<instrukcje>
UNTIL <wyrażenie>
Pętla REPEAT jest bardzo podobna do pętli WHILE z tą różnicą, że sprawdzanie warunków odbywa się po wykonaniu pętli, czyli powtarzaj coś dopóki coś innego nie spełnia warunku. Pętla jest powtarzana dopóki warunek nie jest spełniony, np.
PROC main()
DEF x
x:=1
REPEAT
WriteF('d ', x)
x:=x+1
UNTIL x>100
ENDPROC
Pętla jest podobna do pętli WHILE z tą różnicą, że nie jest sprawdzany żaden
warunek. Tak więc ta pętla w normalnych warunkach nigdy się nie skończy.
Chociaż jak wiemy pętlę możemy przerwać używając polecenia JUMP (skocz - tak
jak na przykładzie).
LOOP
<instrukcje>
ENDLOOP
np.
PROC main()
DEF x
x:=0
LOOP
IF x<100
WriteF('x is dn', x++)
ELSE
JUMP end
ENDIF
ENDLOOP
end:
ENDPROC
EXIT <wyrazenie>
Każdą pętle możesz przerwać dzięki poleceniu EXIT (lub poprzez użycie
polecenia JUMP). Pętla zostanie przerwana gdy wyrażenie spełnia warunek, np.
FOR x:=1 TO 10
y:=f[x]
EXIT y=-1
WriteF('x=d, f(x)=dn', x, y)
ENDFOR
to bez użycia EXIT wyglądałoby tak:
FOR x:=1 TO 10
y:=f[x]
IF y=-1 THEN JUMP end
WriteF('x=d, f(x)=dn', x, y)
ENDFOR
end:
Wyjście z pętli nastąpi w obu przypadkach gdy y będzie się równało -1.
Tak jak inne języki również E ma pewne ograniczenia
CHAR [rozmiar]: 0 .. 255
INT [rozmiar]: -32k .. +32k
LONG/PTR [rozmiar]: -2gig .. +2gig
Długość jednej lini w źródle: 2000 znaków
Długość pliku źródłowego: 2 giga (teoretycznie)
Długość identyfikatorów (np. zmienne): 100 bajtów
Maksymalna głębokość pętli (FOR, IF, etc.): 500 głębokości
Rozmiar jednej procedury: 32k
Rozmiar pliku wykonywalnego: 32k (typ SMALL), 2 giga (typ LARGE)
Dane lokalne dla jednej procedury: 250 mega
Dane globalne: 250 mega
Ilość lokalnych zmiennych dla jednej procedury: 8000
Ilość globalnych zmiennych: 7500