Pętla repetycyjna (pętla warunkowa) w programowaniu, to rodzaj pętli, w której wykonanie kolejnej iteracji uzależnione jest od pewnego, zdefiniowanego przez programistę warunku. Warunek zawarty w definiowanej pętli jest pewnym wyrażeniem, które zwraca wartość typu logicznego (np. Pascal, Visual Basic, VBA). Istnieją języki programowania, w których składnia nie przewiduje takiego typu danych. W językach tych stosuje się wyrażenia zwracające pewną wartość innego typu, która następnie podlega odpowiedniej interpretacji, np. wartość zero może być utożsamiana z wartością false typu logicznego, a pozostałe wartości z wartością true, lub inne rozwiązania (np. PL/I, C, C++ i pochodne). W zależności do tego, czy wartość logiczna, uzyskana w wyniku ewaluacji wyrażenia reprezentującego warunek, jest równa wartości logicznej true (prawda), czy false (fałsz), wykonywanie pętli jest kontynuowane, bądź przerywane.

Wyrażenia warunkowe Jak wyżej zaznaczono, pętla repetycyjna definiowana jest za pomocą określonego wyrażenia, które określa czy ma nastąpić przejście do kolejnej iteracji, czy też ma zostać zakończone wykonywane pętli i w konsekwencji ma nastąpić przejście do kolejnej instrukcji umieszczonej za daną pętlą. Zapis wyrażenia, oraz typ wartości wyrażenia, zależny jest od składni konkretnego języka programowania. Powszechnym jest zapis wyrażeń kontrolnych analogicznie do zapisu tych wyrażeń dla instrukcji warunkowej. Szczególne znaczenie mają w tym przypadku operatory porównań, choć warunek może zostać wyrażony także całkiem inaczej, np. jako wywołanie funkcji zwracającej wartość logiczną, bądź jako identyfikator zmiennej logicznej, której wcześniej przypisano rezultat ewaluacji wyrażenia warunkowego. Powszechna jest również w językach programowania dostępność operatorów logicznych, umożliwiających budowanie warunków złożonych z kilku warunków łącznych lub alternatywnych (ewentualnie mogą w konkretnym języku być dostępne inne operatory logiczne, np. alternatywy wykluczającej czy implikacji). Ponadto operator logiczny realizujący operację negacji pozwana na rekompensatę ewentualnego braku pętli powtarzanej przy spełnieniu lub niespełnieniu warunku, gdyż zastosowanie tego operatora do podanego warunku jest równoważne zastosowaniu frazy przeciwnej.

+ Wybrane przypadki wyrażeń warunkowych (przykłady w Turbo Pascalu) warunek złożony użycie zmiennej powtarzaj gdy warunek nie spełniony(sprawdzany na początku pętli)alternatywny wobec braku odpowiedniej instrukcjiwhile (a<b) and ((b>c) or (b>d)) do begin { instrukcje pętli } end;var logic : Boolean; begin repeat { instrukcje pętli 1 } logic:=(a<b) xor (b>c); { instrukcje pętli 2 } until logic; end.while not (a>=b) do begin { instrukcje pętli } end;

Warunki kontynuacji bądź zaniechania wykonywania pętli W różnych językach programowania stosowane są warunki, które decydują o kontynuacji wykonywania pętli lub jej przerwania, w następujący sposób: pętla jest kontynuowana gdy warunek jest spełniony (true), a przerywana gdy nie (false), lub odwrotnie pętla jest kontynuowana gdy warunek nie jest spełniony (false), a przerywana gdy jest spełniony (true).

+ Porównanie pętli i kodu z użyciem instrukcji warunkowych oraz skokuna przykładzie języka Visual Basic i VBA miejsce sprawdzania warunku przypadek kod z użyciem pętli kod "zastępczy" sprawdzanie warunku na początku pętli powtarzaj, gdy warunek spełnionyDo While warunek ' treść pętli Loopstart: If Not warunek Then Goto koniec ' treść pętli Goto start koniec: ' koniec pętli powtarzaj, gdy warunek nie spełnionyDo Until warunek ' treść pętli Loopstart: If warunek Then Goto koniec ' treść pętli Goto start koniec: ' koniec pętli sprawdzanie warunku na końcu pętli powtarzaj, gdy warunek spełnionyDo ' treść pętli Loop While warunekstart: ' treść pętli If warunek Then Goto start ' koniec pętli powtarzaj, gdy warunek nie spełnionyDo ' treść pętli Loop Until warunekstart: ' treść pętli If Not warunek Then Goto start ' koniec pętli

Miejsce sprawdzania warunków Warunki decydujące o kontynuacji lub zaprzestaniu wykonywania pętli mogą być sprawdzane: na początku pętli, przed wykonaniem pierwszej instrukcji zawartej w bloku definiowanej pętli, wewnątrz pętli, w jej bloku, po wykonaniu części instrukcji, a przed wykonaniem pozostałych, na końcu pętli, po wykonaniu wszystkich instrukcji zawartych w bloku definiowanej pętli. Jeżeli warunek jest sprawdzany na początku pętli, to może nastąpić taka sytuacja, że instrukcje zawarte w pętli nigdy nie zostaną wykonane. Będzie to miało miejsce w sytuacji, gdy przy pierwszym wykonaniu warunek nie będzie spełniony (lub odwrotnie, w zależności od rodzaju pętli – zobacz wyżej). Inaczej jest, gdy warunek jest sprawdzany na końcu pętli. W tym przypadku instrukcje zawarte w pętli zostaną wykonane co najmniej jeden raz. Natomiast, jeżeli warunek jest sprawdzany wewnątrz pętli mamy sytuację stanowiącą połączanie obu powyższych przypadków. Mianowicie instrukcje zapisane przed sprawdzeniem warunku, zostaną zawsze wykonane co najmniej jeden raz, a instrukcje zapisane po warunku sprawdzającym, mogą nie zostać wykonane ani jeden raz.

+ Porównanie wyników programu dla różnych miejsc sprawdzania spełnienia warunku w pętli repetycyjnej (przykłady w języku C) miejsce sprawdzania warunku na początku wewnątrz na końcu przykład#define MIN=4 int a; scanf("a=%d",a); while(MIN>=a) { printf("Teraz a=%d\n\r",a++); printf("Teraz a=%d\n\r",a++); }#define MIN=4 int a; scanf("a=%d",a); while(1) { printf("Teraz a=%d\n\r",a++); if (!(MIN>=a)) break; printf("Teraz a=%d\n\r",a++); }#define MIN=4 int a; scanf("a=%d",a); do printf("Teraz a=%d\n\r",a++); printf("Teraz a=%d\n\r",a++); while(MIN>=a) wartość zmiennej a 1 3 5 1 3 5 1 3 5 wyniki Teraz a=1Teraz a=2Teraz a=3Teraz a=4 Teraz a=3Teraz a=4 Teraz a=1Teraz a=2Teraz a=3Teraz a=4Teraz a=5 Teraz a=3Teraz a=4Teraz a=5 Teraz a=5 Teraz a=1Teraz a=2Teraz a=3Teraz a=4 Teraz a=3Teraz a=4 Teraz a=5Teraz a=6

Zazwyczaj w danym języku programowania zdefiniowane w składni konstrukcje pętli repetycyjnych są tak określone, że jest możliwe sprawdzenie jedynie warunku albo na początku, albo na końcu pętli – nie ma w tym przypadku możliwości zdefiniowania warunków sprawdzanych zarówno na początku, jak i na końcu pętli (np. C, C++, Pascal). Inaczej jest jednak, gdy zdefiniowana jest w języku jedna konstrukcja pętli, w której można definiować warunki za pomocą opcjonalnych fraz instrukcji, tak jak zostało to przyjęte np. w języku PL/I.

+ Porównanie: PL/I – C, C++ PL/I C, C++DO WHILE A<B UNTIL C>B; /* instrukcje pętli */ /* brak konieczności stosowania instrukcji warunkowej i opuszczenia wszystkie warunki zdefiniowane w nagłówku pętli za pomocą odpowiednich fraz */ END;while(a<b) { /* instrukcje pętli */ /* sprawdzenie dodatkowego warunku na końcu pętli wymaga użycia instrukcji warunkowej i opuszczenia */ if(!(c>b)) break;

Także rzadko występującą możliwością konstruowania pętli jest możliwość jej kontynuowania po zakończeniu bieżącego warunku, już dla innego, kolejnego warunku.

Przykład w PL/I: DO WHILE A<B UNTIL C>B, WHILE D<B, UNTIL D>A; /* instrukcje pętli */ /* wykonanie pętli nastąpi kolejno dla 3 niezależnych warunków: – dla A<B (warunek sprawdzany na początku pętli) i równocześnie C>B (ale warunek sprawdzany na końcu pętli), – a po zakończeniu pętli dla powyższych warunków, dla D<B (warunek sprawdzany na początku pętli), – i następnie dla D>A (warunek sprawdzany na końcu pętli) */ END;

O sposobie i miejscu zapisu warunków sprawdzających decyduje składnia danego języka programowania. Dla warunków sprawdzanych wewnątrz bloku instrukcji definiujących kolejne iteracje, zapis zawarty jest w ciągu tych instrukcji (np. Ada, Forth). Natomiast dla warunków sprawdzanych na początku i końcu pętli spotyka się rozwiązania, w których albo warunki zapisywane są odpowiednio w miejscu ich wykonywania, tj. na początku i na końcu (np. C, C++, Pascal, Modula-2, Visual Basic, VBA i wiele innych), albo rzadziej wszystkie warunki, także te sprawdzane na końcu pętli, definiowane są na początku pętli, w jej nagłówku, w jednym miejscu określającym sposób kolejnych iteracji (np. PL/I). W językach programowania, w których nie ma konstrukcji do sprawdzania warunku wewnątrz bloku pętli, dostępne są często instrukcje umożliwiające zmianę przebiegu wykonywania pętli, takie jak instrukcja opuszczenia czy instrukcja kontynuacji (np. C, C++: break, continue), które stosowane w połączeniu z instrukcją warunkową lub wyboru (np. C, C++: if, switch), zapewniają praktycznie równorzędne środki sterowania przebiegiem realizacji algorytmu.

+ Porównanie konstrukcji językowych z wbudowanym sprawdzeniem warunku wewnątrz pętli iodpowiadających im konstrukcji, gdy język nie przewiduje takich fraz dla pętli Sposób zapisu Przykłady Sprawdzenie warunku wewnątrz pętli Ada Forthloop -- instrukcje przed sprawdzeniem warunku exit when warunek; -- instrukcje po sprawdzeniu warunku end loop; -- instrukcje za pętląBEGIN ( instrukcje przed sprawdzeniem warunku ) ( warunek ) WHILE ( instrukcje po sprawdzeniu warunku ) REPEAT ( instrukcje za pętlą ) Konstrukcje "zastępcze" C, C++ PL/I wymagane użycie instrukcji warunkowej if, oraz instrukcji opuszczenia break wymagane użycie instrukcji warunkowej IF, oraz instrukcji skoku GOTO oraz etykiety LABwhile(1) { /* instrukcje przed sprawdzeniem warunku */ if(warunek) break; /* instrukcje po sprawdzeniu warunku */ } /* instrukcje za pętlą */DO WHILE '1'B; /* instrukcje przed sprawdzeniem warunku */ IF warunek THEN GOTO LAB; /* instrukcje po sprawdzeniu warunku */ END; LAB: /* instrukcje za pętlą */

Typowe konstrukcje składniowe Składnia poszczególnych języków programowania definiuje sposób zapisu poszczególnych elementów danego języka i jest różna w zależności od przyjętych przez jego autora rozwiązań. Spotyka się jednak w językach pewną grupę typowych, używanych słów kluczowych, które stanowią podstawę zapisu instrukcji lub odpowiednich fraz instrukcji, definiujących warunki jej wykonania. Są to np. while warunek to słowo kluczowe stosowane w wielu językach programowania definiuje warunek, który musi być spełniony, aby pętla była wykonywana, stosowana jest zarówno na początku pętli (np. C, C++: while(warunek) instrukcja; Pascal: while warunek do instrukcja), jak i na końcu (np. C, C++: do instrukcje while(warunek);). until warunek to słowo kluczowe w różnych językach ma różne implikacje: warunek który określa, iż pętla będzie powtarzana dopóki warunek nie stanie się spełniony, np. Pascal: reperat instrukcje until warunek; Visual Basic, VBA: Do Until warunek instrukcje Loop, Do instrukcje Loop Until warunek; warunek, który jest sprawdzany na końcu pętli (choć zapis warunku znajduje się na jej początku w nagłówku definiującym), a pętla jest powtarzana jeżeli warunek jest spełniony, np. PL/I: DO UNTIL warunek; instrukcje END; (odpowiednik instrukcji do ... while(warunek); z języka C, C++).

Przykłady pętli repetycyjnych + Przykłady pętli repetycyjnych spełnienie/nie spełnienie język programowania miejsce sprawdzania warunku miejsce zapisu warunkusprawdzanego na końcu pętli na początku pętli na końcu pętli powtórzeniegdy warunek spełniony CC++while(a<MAX_A) { printf("a=%d",a++); }do printf("a=%d",a++); while(a<MAX_A); na końcu Pascalwhile a<MAX_A do begin writeln("a=",a); a:=a+1 end; Modula-2WHILE A<MAX_A DO WRITE("a=",A); A:=A+1 END; PL/IDO WHILE A<MAX_A; CALL WRITE('A=',A); A=A+1; END;DO UNTIL A<MAX_A; CALL WRITE('A=',A); A=A+1; END; na początku Visual BasicVBADo While a<MAX_A Call WriteLine("a=", a) a=a+1 LoopDo Call WriteLine("a=", a) a=a+1 Loop While a<MAX_A na końcu powtórzeniegdy warunek nie spełnionyDo Until a=MAX_A Call WriteLine("a=", a) a=a+1 LoopDo Call WriteLine("a=", a) a=a+1 Loop Until a=MAX_A na końcu PascalModula-2 repeat writeln("a=",a); a:=a+1 until a=MAX_A; na końcu

Pętla repetycyjna w językach programowania