Najlepsze pytania
Chronologia
Czat
Perspektywa

Pętla (informatyka)

konstrukcja oprogramowania komputerowego Z Wikipedii, wolnej encyklopedii

Pętla (informatyka)
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ść.

Thumb
Diagram pętli for typu C

Pętle licznikowe

Osobny artykuł: Pętla iteracyjna.

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

Osobny artykuł: Pętla repetycyjna.

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

Osobny artykuł: 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”

Osobny artykuł: Pętla foreach.

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).

Więcej informacji Logo ...
Remove ads

Pętla nieskończona

Osobny artykuł: 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]:

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.:
  • 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.

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads