Podprogramy: procedury i funkcje
Podział programu na podprogramy umożliwia między innymi:
- Zwiększenie czytelności redagowanego tekstu programu źródłowego.
- Skrócenie implementacji programu.
- Łatwiejszą modyfikację implementacji programu.
- Mniejsze ryzyko „wprowadzania” błędów do programu.
Dostępne są dwa rodzaje podprogramów: procedura i funkcja.
Definiowanie procedury:
D
efiniowanie funkcj i :
Procedure identyfikator ( lista_p_f ) ;
Function identyfikator ( lista_p_f ) : typ_wartości_funkcji ;
{- definicje i deklaracje -}
{- definicje i deklaracje -}
Begin
Begin
. . .
. . .
End
identyfikator := wyrażenie
End
gdzie:
identyfikator - nazwa definiowanego podprogramu,
lista_p_f (lista parametrów formalnych) - oddzielone średnikami deklaracje parametrów podprogramu.
Parametrem formalnym nazywa się parametr wpisany w nagłówku definicji podprogramu.
Przykład:
procedure Nazwa_PROCEDURY ( p1: byte ; var p2 : word ) ;
function Nazwa_FUNKCJI ( p1, p2 : byte ; p3 : word ) : word ;
Parametrem aktualnym nazywa się parametr wpisany jako argument w wywołaniu podprogramu.
Parametrem aktualnym może być: stała, zmienna, funkcja, wyrażenie.
Przykład:
Nazwa_PROCEDURY ( liczba , kwadrat_liczby ) ;
x := Nazwa_FUNKCJI ( 12, ZM, X+Y+1 ) ;
Przekazywanie parametrów przez :
-
w
artość - jeżeli parametrem aktualnym jest zmienna, któremu w treści podprogramu zostanie przypisana nowa wartość, to po wyjściu z podprogramu wartość zmiennej nie ulegnie zmianie (będzie taka sama jak przed wywołaniem podprogramu).
-
z mienną - jeśli parametr formalny jest poprzedzony słowem VAR, to parametrem aktualnym musi być zmienna. W tym przypadku po wykonaniu podprogramu parametr aktualny będzie miał taką wartość jak odpowiadający mu parametr formalny w momencie zakończenia podprogramu.
-
p
odprogram (procedurę, funkcję) - inna bajka.
W poniższych przykładach definicji podprogramów parametr p_w jest przekazywany przez wartość a parametr p_zm przez zmienną.
procedure PROC ( p_w : integer ; var p_zm : integer ) ;
begin { treść procedury } end;
function FUN ( p_w : integer ; var p_zm : integer ) : integer ;
begin { treść funkcji } end;
Identyfikatory globalne - zdefiniowane (zadeklarowane) w bloku definicji i deklaracji programu.
Można je wykorzystywać w całym tekście programu (z wyjątkami wynikającymi z „lokalności”).
PAU - Pascal cz. 6
1 / 2
Identyfikatory lokalne - zdefiniowane (zadeklarowane) w blokach stanowiących część podprogramów oraz parametry formalne. Wykorzystanie ich ograniczone jest do podprogramu, w którym zostały zdefiniowane (zadeklarowane).
Obszar działania (zasięg widoczności) identyfikatora - jest to blok programu, w którym identyfikator jest zdefiniowany (zadeklarowany) oraz wszystkie bloki wewnętrzne z wyjątkiem tych bloków wewnętrznych, w których ta sama nazwa została powtórnie zdefiniowana (zadeklarowana).
Rekurencja
Podprogram rekurencyjny to taki, w którego treści następuje wywołanie tego samego podprogramu.
Procedure PROC ( . . . ) ;
Function FUN ( . . . ) : . . . ;
begin
. . .
. . .
begin
PROC ( . . . );
. . .
. . .
x := FUN ( . . . );
end;
. . .
end;
Bardzo ważne jest określenie warunku zakończenia wywołania rekurencyjnego.
Przykład:
Funkcja obliczająca N !
a) Iteracyjnie
b) Rekurencyjne
Function Silnia ( n : integer ) : longint ;
Function SilniaR ( n : integer ) : longint ;
var zp : longint;
begin
i : byte;
if n = 0
begin
then SilniaR := 1
if n = 0 then Silnia:= 1
else SilniaR := SilniaR(n-1) * n
else begin
end;
zp := 1 ;
for i := 2 to n do zp := zp * i ;
Silnia := zp
end
end;
Przykład:
Procedura wyświetlająca na ekranie monitora wartości tablicy jednowymiarowej.
type tablica = array [ 1 .. 20 ] of integer ;
var x : tablica ;
a) iteracyjna
b) rekurencyjna
Procedure WyswietlT ( t:tablica ; n:byte ) ;
Procedure WyswietlTabliceR ( t : tablica ; n : byte ) ;
var i : byte ;
begin
begin
if n > 1 then WyswietlTabliceR ( t, n-1 ) ;
for i := 1 to n do write ( t[i] : 5 )
write ( t [n] : 5 )
end;
end;
PAU - Pascal cz. 6
2 / 2