Instrukcja zagnieżdżona

Instrukcja zagnieżdżona w programowaniu, to instrukcja zawarta w innej, zewnętrznej instrukcji strukturalnej. Obowiązuje tu bezwzględnie zasada, że cała instrukcja zagnieżdżona musi znajdować się w obrębie instrukcji zewnętrznej, tzn. oba nawiasy syntaktyczne wyróżniające instrukcję zagnieżdżoną, muszą znajdować się pomiędzy nawiasami syntaktycznymi instrukcji zewnętrznej. O ile taka zasada jest oczywista w przypadku, gdy instrukcją zagnieżdżoną jest instrukcja prosta, o tyle programista może popełnić błąd podczas kodowania określonego algorytmu, przy zagnieżdżaniu instrukcji strukturalnej. Tego typu błędy mogą być wyłapywane przez translator przed wykonywaniem programu.

Przykłady zagnieżdżenia instrukcji warunkowych i wyboru
język programowania przykład opis
Visual Basic[1], VBA[2]
If warunek-1 Then    ' (1)
  If warunek-2 Then  ' (2)
    ' instrukcje
  End If
Else
  Do While warunek-3 ' (3)
    ' instrukcje
  Loop
End If

Zarówno instrukcja warunkowa (2), jak i pętli repetycyjnej (3) są instrukcjami zagnieżdżonymi w instrukcji warunkowej (1).

Pascal[3][4]
case a of { 1 }
  1 :
    case b of { 2 }
      1..5 :
         { instrukcje }
      6..10 :
         { instrukcje }
      else
         if c=1 then { instrukcja } else { instrukcja } { 3 }
    end
  2 :
    { instrukcje }
  3 :
    { instrukcje }
  else
    { instrukcje }
end
  • instrukcja warunkowa { 3 } jest zagnieżdżona w instrukcji wyboru { 2 } oraz { 1 }, zagnieżdżenie wielopoziomowe
  • instrukcja wyboru { 2 } jest zagnieżdżona w instrukcji wyboru { 1 }

Jak z powyższego wynika, pojęcie instrukcji zagnieżdżonej nie dotyczy jakiejś konkretnej instrukcji realizującej określoną czynność, jednoznacznie zdefiniowanej w składni konkretnego języka programowania, lecz odnosi się do każdej instrukcji zawartej w innej instrukcji strukturalnej, a więc odnosi się do miejsca położenia danej instrukcji w kodzie źródłowym. Poziom takiego zagnieżdżenia jest praktycznie nieograniczony i zależy wyłącznie od możliwości systemu komputerowego. Przy zagłębieniu instrukcji w innej, która sama jest instrukcją zagnieżdżoną literatura przedmiotu używa pojęcia zagnieżdżenia wielopoziomowego, bądź wielokrotnego. Często spotykanym przypadkiem jest tworzenie pętli zagnieżdżonych dla operacji dotyczących tablic wielowymiarowych.

Przykłady wielopoziomowego zagnieżdżenia pętli
Ada[5][6] Visual Basic[1], VBA[2] C[7][8][9][10]
pętla iteracyjna pętla iteracyjna pętla ogólna
-- wyzerowanie elementów tablicy
for i in Tablica'Range(1) loop
  for j in Tablica'Range(2) loop
    for k in Tablica'Range(3) loop
      Tablica(i, j, k):=0;
    end loop;
  end loop;
end loop;
' wyzerowanie elementów tablicy
For I=0 To Max_I
  For J=0 To Max_J
    For K=0 To Max_K
      Let Tablica(I,J,K)=0
    Next K
  Next J
Next I
/* wyzerowanie elementów tablicy */
for(i=0;i<maxI;i++)
  for(j=0;i<maxJ;j++)
    for(k=0;i<maxK;k++)
      Tablica[i][j][k]=0;

Z konstrukcją pętli zagnieżdżonych wiąże się zagadnienie używania dodatkowych instrukcji sterujących realizacją pętli, takich jak instrukcja opuszczenia, czy instrukcja kontynuacji. W wielu językach programowania instrukcje te odnoszą się zawsze do najbardziej zagłębionej pętli w strukturze kodu (a więc do pętli w której bezpośrednio zagnieżdżona jest dana instrukcja sterująca). Tak jest np. w języku C[7][8][9][10], C++[9], i pochodnych, Turbo Pascal[4], Visual Basic[1], VBA[2] i wielu innych. Nie ma więc możliwości realizacji wyjścia z określonej pętli w całej hierarchii wielokrotnego zagnieżdżenia. Można ewentualnie korzystać w takim przypadku z instrukcji skoku, która jednak przez literaturę przedmiotu nie jest zalecana. Istnieją też języki programowania, w których składni zdefiniowano mechanizmy pozwalające na wskazanie, z której pętli ma nastąpić wyjście. Takie możliwości posiada np. język Ada[5][6], czy PL/I[11][12].

Przykłady wyjścia z określonej pętli zagnieżdżonej
Ada[5][6] PL/I[11][12]
-- wyjście z pętli 2-go poziomu
loop1: for i in Tablica'Range(1) loop
  loop2: for j in Tablica'Range(2) loop
    loop3: for k in Tablica'Range(3) loop
      -- instrukcje
      exit loop2 when warunek-wyjścia;
      -- instrukcje
    end loop;
  end loop;
end loop;
-- wyjście z pętli 2-go poziomu
loop1: DO WHILE warunek-1;
  loop2: DO WHILE warunek-2;
    loop3: DO WHILE warunek-3;
      /* instrukcje */
      IF warunek-wyjścia THEN LEAVE loop2;
      /* instrukcje */
    END;
  END;
END;

Przypisy

edytuj
  1. a b c Podręcznik Visual Basic na Wikibooks
  2. a b c John Walkenbach: Excel 2003 PL. Programowanie w VBA.. HELION, 2004. ISBN 837361-504-0. (pol.).
  3. Michał Iglewski, Jan Madey, Stanisław Matwin: Pascal. Język wzorcowy – Pascal 360. Wyd. trzecie – zmienione. Warszawa: Wydawnictwa Naukowo-Techniczne, 1984, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
  4. a b Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
  5. a b c 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.).
  6. a b c Michał Morawski, Antoni M. Zajączkowski: Wstęp do programowania w języku Ada’95. Wyd. drugie. Łódź: 2004. [dostęp 2011-01-29]. (pol.).
  7. a b 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.).
  8. a b Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.).
  9. a b c Jan Bielecki: Od C do C++, programowanie obiektowe w języku C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990. ISBN 83-204-1332-X. (pol.).
  10. a b Podręcznik języka C na Wikibooks
  11. a b 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.).
  12. a b 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.).

Bibliografia

edytuj
  • 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.).
  • John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Informatyka. ISBN 83-204-0246-8. (pol.).