Najlepsze pytania
Chronologia
Czat
Perspektywa
Pętla (informatyka)
konstrukcja oprogramowania komputerowego Z Wikipedii, wolnej encyklopedii
Remove ads
Pętla – jedna z trzech podstawowych konstrukcji programowania strukturalnego (obok instrukcji warunkowej i instrukcji wyboru). Umożliwia cykliczne wykonywanie ciągu instrukcji określoną liczbę razy, do momentu zajścia pewnych warunków, dla każdego elementu kolekcji lub w nieskończoność.

for
typu CPętle licznikowe
Zawartość pętli licznikowych bądź iteracyjnych wykonuje się ustaloną liczbę razy. W najprostszym przypadku na początku pętli specjalna zmienna sterująca (licznikowa) jest ustawiana na wartość początkową, następnie przy każdym obiegu pętli jej wartość jest zwiększana o jeden, aż do osiągnięcia górnego limitu. Często pętla taka może odliczać w dół lub zmienna może być modyfikowana o wartość inną niż 1. Przykładami są tutaj pętle for
z takich języków jak Pascal[1][2], Ada[3] (ale nie C[4][5] i C-podobne[6]).
Remove ads
Pętle warunkowe
Ogólniejszą konstrukcją jest pętla warunkowa, nazywana również repetycyjną, która jest wykonywana, aż do odpowiedniej zmiany warunków. Przeważnie wyrażenie testujące sprawdzane jest na początku lub na końcu pętli. W niektórych językach (C-podobne) pętla jest wykonywana dopóki warunek jest spełniony[4][5][6], w innych, np. w Pascalu pętla repeat...until
, dopóki warunek nie jest spełniony[1][2]. Przykładami są instrukcje while, do...while, repeat...until
[1][2][4][5][6].
Istnieją języki w których warunek (lub warunki) zakończenia mogą być umieszczone wewnątrz pętli na przykład w Adzie pętla loop
z konstrukcją exit when
[3].
Remove ads
Pętla ogólna
To pętla stosowana w językach rodziny C[4][5] i C-podobnych, jak np. C++[6]. Umożliwia definiowanie zarówno pętli repetycyjnej (ze sprawdzeniem warunku na początku pętli), jak i pętli iteracyjnej, jednak w porównaniu do niej pętla ta definiowana jest na niższym poziomie abstrakcji, co oznacza, że programista musi sam definiować warunek jej zakończenia i operację zmiany wartości zmiennej sterującej przy kolejnym przebiegu pętli.
Pętle „po kolekcji”
Często pożądane jest, aby instrukcje pętli zostały wykonane dla każdego elementu tablicy, kolekcji itp. Można to zrobić za pomocą powyższych pętli, ale często szybszym i bardziej przejrzystym sposobem jest użycie pętli typu foreach
, która zwalnia programistę z obowiązku ręcznego iterowania po kolekcji.
Pętla o określonej liczbie powtórzeń
W pewnych językach programowania zdefiniowano w ich składni konstrukcję pętli, w której programista podaje ilość powtórzeń iteracji. Nie specyfikuje się przy tym ani zmiennej sterującej, ani wartości początkowej i końcowej licznika, co stanowi zasadniczą różnicę w stosunku do pętli iteracyjnej (licznikowej).
Remove ads
Pętla nieskończona
W niektórych zastosowaniach, np. systemy operacyjne, serwery, środowiska sterowane zdarzeniami pożądane jest, aby główna pętla wykonywała się praktycznie w nieskończoność. Można to uzyskać wstawiając do pętli warunkowej odpowiedni niezmienny warunek, ale niektóre języki dostarczają środków, którymi można wyrazić to bezpośrednio np. w języku Ada[3], Forth[12][13], Icon[14].
Remove ads
Inne konstrukcje
Istnieją także języki programowania zawierające w swojej składni instrukcje pętli zrywające z podanym wyżej podziałem. Przykładem takiego języka jest PL/1 i zdefiniowana w nim instrukcja DO
. Instrukcja ta może (ale nie musi) zostać użyta z odpowiednimi frazami, definiującymi szczegółowo sposób iteracji, przy czym poszczególne frazy mogą być ze sobą zestawiane łącznie, co umożliwia bardziej złożone sterowanie w programie. I tak[15][16]:
- instrukcja blokowa (grupująca):
DO;
...
END;
- pętla iteracyjna
DO I=''w_p'' TO ''w_k'' BY ''step'', ''w_p1'' TO ''w_p2'' BY ''step2'', ...;
...
END;
przy czym frazy TO
oraz BY
są opcjonalne, można więc podać listę wartości, którą ma przyjmować zmienna sterująca, a przecinek umożliwia definicję kontynuacji iteracji dla kolejnego zestawu wartości.
- pętla repetycyjna
DO WHILE ''warunek'';
...
END;
DO UNTIL ''warunek'';
...
END;
DO REPEAT ''wyrażenie'';
...
END;
- pętla złożona – możliwość składania poszczególnych fraz iteracyjnych i repetycyjnych, np.
DO WHILE C>A, I=1 TO 20 BY 3 UNTIL A<B, 31, 32, 36, 39 TO 41, REPEAT A/2 WHILE A>3;
...
END;
Remove ads
Modyfikowanie przebiegu pętli
Podsumowanie
Perspektywa
Z pętlami w językach programowania związane są konstrukcje programistyczne umożliwiające modyfikowanie standardowego przebiegu realizacji pętli. Modyfikacja ta dotyczy takich elementów jak zmiana wartości zmiennej sterującej, wyjście z pętli, przejście do kolejnej iteracji itp. Do modyfikowania przebiegu realizacji pętli służą:
- albo istniejące danym języku konstrukcje, tj. instrukcje, które są stosowane także poza pętlą, np.:
- przypisanie: zmiana wartości zmiennej sterującej,
- instrukcja skoku: wyjście z pętli,
- albo specjalne konstrukcje dedykowane tylko do modyfikacji działania pętli, tj. takie które mogą być stosowane tylko w obrębie pętli, np.
- instrukcja opuszczenia,
- instrukcja kontynuacji,
- instrukcja powtórzenia bieżącej iteracji,
- instrukcja pomijania określonych iteracji.
Instrukcje modyfikujące działanie pętli wymienione w drugiej grupie, zostały opracowane i uwzględnione w definicjach języków programowania, jako substytut instrukcji skoku, której użycie jest krytykowane w literaturze przedmiotu. Każda z operacji realizowanych przez tę grupę instrukcji może bowiem zostać zrealizowana za pomocą instrukcji skoku i etykiety umieszczonej w określonym miejscu. Instrukcja skoku pozwala w przeciwieństwie do tych instrukcji na przejście do dowolnego miejsca, natomiast instrukcje modyfikujące pętle z góry narzucają miejsce, do którego nastąpi przekazanie sterowania, co w pewnym stopniu zwiększa czytelność programu (kodu źródłowego) w porównaniu do instrukcji skoku[17].
Remove ads
Przykład – pętla iteracyjna
Poniżej przykład pętli w języku Pascal:
var licznik : integer;
begin
for licznik := 1 to 10 do
WriteLn('Wiersz numer ', licznik);
end.
Przykład w C++ jako wariant pętli ogólnej:
for (int i = 0; i < 10; ++i)
std::cout << i << "-ta iteracja." << std::endl;
Przykład w C jako wariant pętli ogólnej:
int i;
for (i = 0; i < 10; ++i)
printf("%d-ta iteracja.\n", i);
Przykład w PHP:
for ($i = 0; $i < 10; ++$i)
echo $i . "-ta iteracja.<br />\n";
Przykład w JavaScripcie:
var i;
for (i = 0; i < 10; ++i)
document.write(i + "-ta iteracja.<br />");
Przykład w VB6 z Textboxem
Dim i As Integer
Text1.Text = ""
For i = 0 To 10
Text1.Text = Text1.Text & i
Next i
Przykład w VB6 z Debugwindow
Dim i As Integer
For i = 0 To 10
Debug.Print i
Next i
Przykład w Pythonie:
for i in range(1, 10):
print(i, '. iteracja', sep = '')
Pętle w językach programowania
Remove ads
Uwagi
- W językach niskiego poziomu oraz asemblerowych językach wysokiego poziomu, oraz innych nielicznych językach, przy braku odpowiednich konstrukcji specjalnych (np. braku instrukcji pętli), programowanie odpowiedniego sterowania realizuje się w kodzie źródłowym za pomocą innych konstrukcji sterujących, np. instrukcji warunkowych i skoku; jest to także możliwe w pozostałych językach programowania (także w tych, w których dostępne są odrębne konstrukcje, takie jak instrukcje pętli), lecz przez literaturę przedmiotu zdecydowanie niezalecane.
- Od momentu opracowania języka Basic powstało wiele jego implementacji i wersji różniących się między sobą. Duża część tych implementacji, szczególnie wczesnych, nie zawierała w swoim repertuarze konstrukcji pętli repetycyjnej. Dopiero kolejne wersje języka zawierały pętle warunkowe np.
while warunek ... wend
, która jako zaszłość w Visual Basic-u została zastąpiona konstrukcjądo ... loop
. - Dana konstrukcja modyfikująca działanie pętli w określonym języku jest dostępna wyłącznie dla wybranego rodzaju pętli, a nie dostępna dla pozostałych rodzajów.
- W językach C, C++ i pochodnych, istnieje pętla for(;;), za pomocą której można realizować pętle iteracyjne w zbliżony sposób jak w pętli iteracyjnej, lecz jest to pętla bardziej ogólna, na niższym poziomie abstrakcji, w którym implementacja działań wymaganych dla pętli iteracyjnej należy do programisty, jawnie w kodzie źródłowym, w związku z czym literatura przedmiotu nie zalicza tego rodzaju pętli do tej kategorii konstrukcji programistycznych jakim są pętle iteracyjne.
- Jedną z podstawowych idei języka FORTH jest jego rozszerzalność. W języku tym można więc definiować (za pomocą instrukcji niskopoziomowych skoków warunkowych i bezwarunkowych, o adresacji bezwzględnej i względnej) nowe instrukcje sterujące, w tym instrukcje pętli oraz instrukcje modyfikujące działanie pętli. Zdefiniowane instrukcje poddawane są natychmiastowej kompilacji, umieszczane we wskazanym słowniku i dostępne tak samo jak standardowe instrukcje sterujące. Można więc stworzyć nowe instrukcje obejmujące pozostałe przypadki pętli i instrukcji modyfikujących.
- W językach takich jak Snobol czy Prolog realizacja wielokrotnych operacji wykonywana jest automatycznie przez odpowiedni mechanizm: w Snobolu jest to mechanizm uzgadniania z wzorcem oraz skoki warunkowe i bezwarunkowe, w Prologu jest to aparat wnioskowania, którego działanie może być modyfikowane przez specjalne predykaty, ich działanie jest analogiczne do odpowiednich instrukcji dostępnych w imperatywnych językach programowania, a tym samym mają (np. w Turbo Prolog) analogiczne nazwy (identyfikatory).
Remove ads
Przypisy
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads