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