Pętla iteracyjna

Pętla iteracyjna (pętla licznikowa) w programowaniu, to rodzaj pętli, w ramach której następuje wykonanie określonej liczby iteracji. Do kontroli przebiegu wykonania pętli iteracyjnej stosuje się specjalną zmienną, w odniesieniu do której używa się określeń: zmienna sterująca, a także zmienna kontrolna, czy też zmienna licznikowa. W ramach pętli przejście do kolejnej iteracji wiąże się ze zmianą wartości zmiennej sterującej o określoną wielkość i sprawdzenie warunku, czy nowa wartość zmiennej sterującej znajduje się nadal w dopuszczalnym zakresie wartości, określonym dla tej zmiennej w ramach definicji pętli – co jest równoznaczne z powtórzeniem pętli (wykonaniem kolejnej iteracji), czy też wartość ta znajduje się już poza zakresem – co jest równoznaczne z zakończeniem wykonywania pętli i przejściem do wykonania kolejnej – następnej – instrukcji w programie.

Działanie pętli iteracyjnejEdytuj

W pewnym uogólnieniu działanie pętli iteracyjnej polega na powtarzaniu kolejnych iteracji dla kolejnych wartości przyjmowanych przez zmienną sterującą, aż do osiągnięcia przez tą zmienną wartości spoza dopuszczalnego zakresu. Kolejność wykonywania działań będzie więc następująca:

  1. przypisz wartość początkową zmiennej sterującej,
  2. sprawdź, czy wartość zmiennej sterującej mieści się w dopuszczalnym zakresie wartości, tzn. jej wartość albo jest mniejsza lub równa od wartości granicznej, albo jest większa lub równa od wartości granicznej, w zależności od rodzaju pętli iteracyjnej,
    • jeżeli wartość zmiennej sterującej mieści się w dopuszczalnym zakresie wartości to przejdź do wykonywania iteracji
    • jeżeli wartość zmiennej sterującej nie mieści się w dopuszczalnym zakresie wartości to zakończ wykonywanie pętli
  3. wykonaj iterację
  4. zmień wartość zmiennej sterującej o zadany krok, wartość ta może być zwiększana lub zmieszana.
Porównanie pętli iteracyjnej z innymi rozwiązaniami (przykład w Turbo Pascalu[1])
rodzaj pętli pętla iteracyjna pętla repetycyjna instrukcja warunkowa i skoku
pętla zwiększająca o 1
wartość zmiennej sterującej
for i=wSTART to wSTOP do
 begin
   { treść pętli}
 end;
i:=wSTART;
while i<=wSTOP do
 begin
   { treść pętli}
   Inc(i); { zwiększ i o 1 }
 end;
i:=wSTART;
prolog: if i<=wSTOP then
 begin
   { treść pętli}
 end
else
  goto koniec;
Inc(i); { zwiększ i o 1 }
goto prolog;
koniec: { wyjście z pętli }
pętla zmniejszająca o 1
wartość zmiennej sterującej
for i=wSTART downto wSTOP do
 begin
   { treść pętli}
 end;
i:=wSTART;
while i>=wSTOP do
 begin
   { treść pętli}
   Dec(i); { zmniejsz i o 1 }
 end;
i:=wSTART;
prolog: if i>=wSTOP then
 begin
   { treść pętli}
 end
else
  goto koniec;
Dec(i); { zmniejsz i o 1 }
goto prolog;
koniec: { wyjście z pętli }

W językach programowania zwykle pętla iteracyjna jest wykonywana także dla wartości zmiennej sterującej równej wartości granicznej, np. dla pętli w Pascalu for i:=1 to 10 do instrukcja, instrukcja zostanie wykonana także dla wartości i=10, jak w powyższych przykładach, gdzie użyto do sprawdzania warunków w programach równoważnych operatorów porównań <= i >=. Tylko wybrane, specyficzne języki są tak zdefiniowane, że dla wartości końcowej nie zostanie wykonana iteracja, co odpowiadałoby użyciu operatorów porównań odpowiednio < i >. Tak jest np. w języku Forth[2][3].

Porównanie sposobów sprawdzania warunku
Pascal[1][4] Forth[2][3]
for i:=1 to 3 do
 begin
   write(i);
 end;
3 1 DO I . LOOP ;
wypisanie: 1, 2, 3 wypisanie: 1, 2

Jak wyżej podano warunek kontrolujący, czy należy przejść do kolejnej iteracji, w większości języków programowania sprawdzany jest na początku. Oznacza to możliwość wystąpienia sytuacji, w której pętla nie zostanie wykonana ani razu. Istnieją jednak języki programowania, w których warunek pętli iteracyjnej sprawdzany jest na końcu pętli, a pętla dla warunków początkowych zostanie wykonana przynajmniej jeden raz (np. Forth[2][3], Fortran IV[5], 1900[6]). Różnice w obu podejściach można prześledzić na przykładzie języka Fortan: w Fortranie IV[5], 1900[6] sprawdzaniu warunku kontrolnego jest na końcu pętli; od wersji Fortran 77[7] sprawdzanie to dokonywane jest na początku pętli.

Porównanie miejsca sprawdzania warunku
Fortran IV[5], 1900[6] Fortran 77[7]
DO 100 I=10,A
DO 100 I=10,A
wykonanie pętli dla A=1: 1 raz dla I=10 brak wykonania pętli dla A=1

Zmienna sterującaEdytuj

Osobny artykuł: Zmienna sterująca.

Jak wyżej zaznaczono, zmienna sterująca służy do kontroli przebiegu realizacji pętli iteracyjnej. Przyjmuje ona kolejne wartości z zadanego zakresu zmieniane o określoną wartość kroku. W różnych językach programowania mogą być stawiane określone wymagania i ograniczenia dotyczące zmiennych sterujących. Ograniczenia te mogą dotyczyć takich między innymi atrybutów tej zmiennej jak np. dozwolony typ danych (np. w Pascalu[1][4] musi to być jeden z typów porządkowych, podczas gdy np. Basic[8][9], Jean[10][11], czy Fortran 77[7] dopuszczają także typy rzeczywiste, co w przypadku Fortranu stanowi rozszerzenie w stosunku do wcześniejszych standardów tego języka takich jak Fortran IV[5], 1900[6], w których istniało ograniczenie do wartości całkowitych i tylko dodatnich, w PL/I[12][13] mogą to być nawet dane napisowe), zasięgu danej (np. w Pascalu[1][4] musi to być zmienna lokalna bloku, a w języku Ada[14] jest to zmienna lokalna dla bloku iteracji i nie jest dostępna na zewnątrz, tzn. nie jest dostępna po zakończeniu pętli), lub inne.

Zmiana wartości zmiennej sterującejEdytuj

Zmiana wartości zmiennej sterującej może nastąpić:

  • automatycznie, w sposób ukryty, oraz
  • jawnie, w kodzie bloku pętli, o ile dany język programowania dopuszcza taką konstrukcję.

Charakterystyczną cechę pętli iteracyjnych jest automatyczna i ukryta (nie zapisana jawnie w kodzie źródłowym) zmiana wartości zmiennej sterującej przy każdym przejściu po zakończeniu kolejnej iteracji. Zmiana ta następuje więc po zakończeniu bloku kodu zawartego w pętli, a przed sprawdzeniem warunku kontrolnego wykonywanego przed kolejną iteracją.

Możliwość zmiany wartości zmiennej sterującej jawnie przez programistę w bloku pętli jest dostępna jedynie w niektórych językach programowania (np. Pascal[1][4], Visual Basic[15] i VBA[16]). W pozostałych brak takiej możliwości oznacza, iż mamy do czynienia ze zmienną tylko do odczytu (np. Ada[14], Forth[2][3]).

Porównanie wykonania pętli bez zmiany wartości zmiennej sterującej i ze zmianą tej wartości wewnątrz pętli (przykład w Turbo Pascalu[1])
bez zmiany wartości ze zmianą wartości uzyskanie efektu kroku równego 2 dowolny krok
var i : integer;
begin
 for i:=1 to 5 do
  begin
    write(i)
  end
end.
var i : integer;
begin
 for i:=1 to 5 do
  begin
    write(i);
    if i=2 then i:=4
  end
end.
var i : integer;
begin
 for i:=1 to 5 do
  begin
    write(i);
    Inc(i)
  end
end.
const step=4;
var i : integer;
begin
 for i:=1 to 10 do
  begin
    write(i);
    i:=i+step-1
  end
end.
wypisanie: 1, 2, 3, 4, 5 wypisanie: 1, 2, 5 wypisanie: 1, 3, 5 wypisanie: 1, 5, 9

Pętle iteracyjne w językach programowaniaEdytuj

Pętle iteracyjne w językach programowania
język programowania pętla iteracyjna miejsce sprawdzania warunku zmienna sterująca
domyślne zwiększenie o +1 zmniejszenie o -1 bez określania kroku możliwość kroku o innej, dodatniej wartości możliwość kroku o innej, ujemnej wartości możliwość zmiany wartości wewnątrz pętli konieczność deklaracji wartość ustalona po zakończeniu
Algol 60[5][6]  T początek  T  N  T  T  T  T  T
Basic[8][9]  T początek  T  N  T  T  T  N  T
C[17][18][19][20]
C++[19][21]
 N[a] n.d. n.d. n.d. n.d. n.d. n.d. n.d. n.d.
Clipper[22]  T początek  T  N  T  T b.d.  T b.d.
Cobol[5][23]  T początek  T  N  T  T b.d.  T b.d.
Forth[2][3]  T koniec  T  N  T  T  N[b]  N  N
Fortran IV[5], 1900[6]  T koniec  T  N  T  N  N  N  T
Fortran 77[7]  T początek  T  N  T  T  N  N  T
Jean[10][11]  T początek  T  N  T  T  N  N  T
Modula-2[24]  T początek  T  N  T  T  N  T b.d.
Pascal[1][4]  T początek  T  T  N  N  T  T  N[c]
PL/I[12][13]  T początek  T  N  T  T  N  N  T
PL/M[25][26]  T początek  T  N  T  T  N  T  T
Simula 67[5][27]  T początek  T  N  T  T  T  T  T
Visual Basic[15], VBA[16]  T początek  T  N  T  T  T  N  T

(1) n.d. – nie dotyczy; (2) b.d. – brak danych;

Złożone konstrukcjeEdytuj

Istnieje grupa języków programowania, w których instrukcja pętli może zostać zdefiniowana równocześnie z warunków iteracyjnych jak i repetycyjnych. Do takich języków należą między innymi Algol 60[5][6] i PL/I[12][13]. Przyjęte w tych językach programowania rozwiązania pozwalają na definiowanie w pętli konstrukcji iteracyjnych, na które zostaną nałożone dodatkowe warunki repetycyjne. Ponadto można po znaku przecinek (”,”) kontynuować wykonywanie pętli dla nowych warunków bądź o charakterze iteracyjnym, bądź o charakterze repetycyjnym, bądź mieszanym.

Przykłady konstrukcji złożonych
Algol 60[5][6] PL/I[12][13]
for i:=1, 2, 3, x*2 while T, 10 step 3 until 33 do
 begin
   comment instrukcje pętli;
 end;
DO SUBSTR(S,J,1)='A','B','F', I=1,2,4, 7 TO 20 BY 3 WHILE A<B, UNTIL C>Q;
  /* instrukcje pętli */
END;

UwagiEdytuj

  1. 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.
  2. Choć w języku Forth nie ma możliwości zmiany wartości zmiennej sterującej, to istnieje możliwość odczytania jedynie za pomocą zdefiniowanego w słowniku standardowym słowa I.
  3. Z wyjątkiem sytuacji wyjścia z pętli za pomocą instrukcji skoku goto.

PrzypisyEdytuj

  1. a b c d e f g Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.)
  2. a b c d e Jan Bielecki: Język FORTH. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988, seria: Mikrokomputery. ISBN 83-204-0930-6. (pol.)
  3. a b c d e Jan Ruszczyc: Poznajemy FORTH. Warszawa: SOETO, 1987, seria: Informatyka mikrokomputerowa. (pol.)
  4. a b c d e Michał Iglewski, Jan Madey, Stanisław Matwin: Pascal. Język wzorcowy – Pascal 360. Wyd. wydanie trzecie – zmienione. Warszawa: Wydawnictwa Naukowo-Techniczne, 1984, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.)
  5. a b c d e f g h i j John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Informatyka. ISBN 83-204-0246-8. (pol.)
  6. a b c d e f g h Joanna Jonkisz, Jan Makuch, Stanisław Starzak: Programowanie w językach Algol 60 i Fortran 1900. Łódź: Wydawnictwo Politechniki Łódzkiej, Politechnika Łódzka, Ośrodek Elektronicznej Techniki Obliczeniowej, 1982, seria: Skrypty dla szkół wyższych. (pol.)
  7. a b c d Ryszard K. Kott, Krzysztof Walczak: Programowanie w języku Fortran 77. Warszawa: Wydawnictwa Naukowo-Techniczne, 1991. ISBN 83-204-1362-1. (pol.)
  8. a b Zbigniew Czech, Krzysztof Nałęcki, Stanisław Wołek: Programowanie w języku BASIC. Wyd. drugie uzupełnione. Warszawa: Wydawnictwa Naukowo-Techniczne, 1985. ISBN 83-204-0776-1. (pol.)
  9. a b Wacław Iszkowski: Nauka programowania w języku BASIC dla początkujących. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Mikrokomputery. ISBN 83-204-0834-2. (pol.)
  10. a b Jerzy Bettek, Bronisław Rudak, Barbara Rudakowa: Język konwersacyjny JEAN. Wrocław: Wydawnictwo Politechniki Wrocławskiej, 1975, seria: Skrypt wydany w serii Biblioteka WASC. (pol.)
  11. a b Kazimierz Orlicz: Język konwersacyjny JEAN z elementami programowania w Fortranie. Wrocław: Wydawnictwo Politechniki Wrocławskiej, 1977, seria: Skrypt wydany w serii Biblioteka WASC. (pol.)
  12. a b c d Jan Bielecki: Rozszerzony PL/I i JCL w systemie OS/RIAD. Warszawa: Państwowe Wydawnictwo Naukowe, 1986, seria: Biblioteka Informatyki. ISBN 83-01-06146-4. (pol.)
  13. a b c d M. I. Auguston i inni: Programowanie w języku PL/1 OS JS. Warszawa: Państwowe Wydawnictwo Naukowe, 1988. ISBN 83-01-07463-9. (pol.)
  14. a b A. Nico Habermann, Dewayne E. Perry: Ada dla zaawansowanych. Warszawa: Wydawnictwa Naukowo-Techniczne, 1989, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1058-4. (pol.)
  15. a b Podręcznik Visual Basic na Wikibooks
  16. a b John Walkenbach: Excel 2003 PL. Programowanie w VBA.. HELION, 2004. ISBN 837361-504-0. (pol.)
  17. Brian W. Kernighan, Dennis M. Ritche: Język C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1067-3. (pol.)
  18. Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.)
  19. a b Jan Bielecki: Od C do C++, programowanie obiektowe w języku C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990. ISBN 83-204-1332-X. (pol.)
  20. Podręcznik języka C na Wikibooks
  21. Podręcznik języka C++ na Wikibooks
  22. Wojciech Rogowski, Arkadiusz Serodziński: Clipper 5.0. Warszawa: Wydawnictwo PLJ, 1991. ISBN 83-85190-20-1. (pol.)
  23. Eugeniusz Kurzydrem, Andrzej Macieliński, Urszula Szmidt, Eugeniusz Więcek: COBOL. Język programowania.. Wyd. drugie. Warszawa: Państwowe Wydawnictwo Ekonomiczne, 1978. (pol.)
  24. Niklaus Wirth: Modula 2. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0828-8. ISSN 0867-6011. (pol.)
  25. Jan Bielecki: PL/M język programowania mikroprocesorów. Wyd. wydanie drugie uzupełnione. Warszawa: Wydawnictwa Komunikacji i Łączności, 1987, seria: Elektronizacja. zeszyt 25. (pol.)
  26. Jan Bielecki: System operacyjny ISIS-II. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Mikrokomputery. ISBN 83-204-0893-8. (pol.)
  27. Hanna Oktaba, Wiesław Ratajczak: Simula 67. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0128-3. (pol.)

BibliografiaEdytuj

  1. Michael Marcotty, Henry Ledgord, tłumaczenie: Krystyna Jerzykiewicz: W kręgu języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1342-7. (pol.)
  2. John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Informatyka. ISBN 83-204-0246-8. (pol.)
  3. Mike Ducka, tłumaczenie: Marcin Turski: Języki mikrokomputerów. Przewodnik dla początkująych. Basic, Pascal, Logo, Prolog, Comal, Forth. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988. ISBN 83-204-0966-7. (pol.)