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.
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
|
|
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.
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].
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- ↑ a b c Podręcznik Visual Basic na Wikibooks
- ↑ a b c John Walkenbach: Excel 2003 PL. Programowanie w VBA.. HELION, 2004. ISBN 837361-504-0. (pol.).
- ↑ 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.).
- ↑ 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.).
- ↑ 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.).
- ↑ 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.).
- ↑ 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.).
- ↑ a b Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.).
- ↑ 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.).
- ↑ a b Podręcznik języka C na Wikibooks
- ↑ 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.).
- ↑ 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.).