Kurs Pascala

download report

Transcript Kurs Pascala

Materiały do zajęć z przedmiotu:
Narzędzia i języki programowania
Programowanie
w języku PASCAL
Część 8: Wykorzystanie procedur i funkcji
© Jan Kaczmarek
Wykorzystanie procedur i funkcji
Definicja procedury lub funkcji zamieszona w części {definicje i deklaracje}
naszego programu może być przez nas wykorzystana wielokrotnie w
części {instrukcje} naszego programu.
Aby wykonać czynności opisane przez procedurę, należy użyć instrukcji
wywołania procedury, która ma postać:
nazwa-procedury (lista-parametrów-aktualnych);
nazwa-procedury to identyfikator, który pozwala zidentyfikować daną
procedurę
lista-parametrów-aktualnych to zestaw aktualnych danych dla procedury i
obiektów, za pomocą których zwrócone będą wyniki jej działania (może jej
nie być, gdy procedura nie ma parametrów !)
Parametry aktualne muszą wystąpić w tej samej ilości i kolejności, a także
muszą być tych samych typów, co parametry formalne podane w definicji
procedury.
Przykład 1:
program pr1;
{$APPTYPE CONSOLE}
uses SysUtils;
var
x, y, z : integer;
procedure wieksza (a, b : integer; var max : integer);
{deklaracja procedury znajdowania większej z dwóch podanych liczb}
begin
if a>b then max := a
else max := b;
end;
begin
readln (x);
readln (y);
wieksza (x, y, z); {wywołanie procedury wieksza}
writeln (‘wieksza liczba to: ‘, z);
readln;
end.
Przykład 2:
program pr2;
{$APPTYPE CONSOLE}
uses SysUtils;
var
n, silnia : integer;
procedure iloczyn (n : integer; var il : integer);
{procedura znajdowania iloczynu il = 1*2*3*…*n dla danego n}
var
i : integer;
begin
il := 1;
for i:=1 to n do
il := il*i;
end;
begin
readln (n);
iloczyn (n, silnia); {wywołanie procedury iloczyn}
writeln (‘iloczyn liczb to: ‘, silnia);
readln;
end.
Aby wykonać czynności prowadzące do uzyskania jednego, konkretnego
wyniku, opisane przez funkcję, należy wywołać tę funkcję. Wywołanie
funkcji ma postać:
nazwa-funkcji (lista-parametrów-aktualnych);
nazwa-funkcji to identyfikator, który pozwala zidentyfikować daną funkcję,
ten identyfikator zwraca wynik działania funkcji, który jest takiego typu, jak
określono to w definicji funkcji podając typ-wyniku, jest to wynik z ostatniego
wykonania instrukcji nazwa-funkcji := wyrażenie w części {treść funkcji}
lista-parametrów-aktualnych to zestaw aktualnych danych dla funkcji (może
jej nie być, gdy funkcja nie ma parametrów !)
Wywołanie funkcji zwykle ma miejsce w wyrażeniu po prawej stronie
symbolu := w instrukcji przypisania postaci:
zmienna := nazwa-funkcji (lista-parametrów-aktualnych);
Parametry aktualne muszą wystąpić w tej samej ilości i kolejności, a także
muszą być tych samych typów, co parametry formalne podane w definicji
funkcji.
Zgodnie z tymi zasadami wywołujemy także funkcje standardowe.
Przykład 1:
program pr3;
{$APPTYPE CONSOLE}
uses SysUtils;
var
x, y, z : integer;
function max (a, b : integer) : integer;
{funkcja zwracająca jako wynik większą z dwóch podanych liczb}
begin
if a>b then max := a
else max := b;
end;
begin
readln (x);
readln (y);
z := max (x, y); {wywołanie funkcji max}
writeln (‘wieksza liczba to: ‘, z);
readln;
end.
Przykład 2:
program pr4;
{$APPTYPE CONSOLE}
uses SysUtils;
var
n, wynik : integer;
function silnia (n : integer) : integer;
{funkcja zwracająca jako wynik iloczyn 1*2*3*…*n dla danego n}
var
i, il : integer;
begin
il := 1;
for i:=1 to n do
il := il*i;
silnia := il
end;
begin
readln (n);
wynik := silnia (n); {wywołanie funkcji silnia}
writeln (‘iloczyn liczb to: ‘, wynik);
readln;
end.
Przekazywanie parametrów i wyników
W momencie zakończenia swego działania procedura przekazuje (zwraca)
wyniki do programu przez parametry aktualne, natomiast funkcja przekazuje
(zwraca) wynik przez nazwę funkcji.
Program przekazuje dane do procedury lub funkcji przez parametry.
W zależności od sposobu, w jaki przekazywane są dane i wyniki, parametry
dzielimy na parametry przekazywane przez:
- wartość
- zmienną określonego typu
Możliwe są jeszcze inne sposoby przekazywania parametrów.
Parametry przekazywane przez wartość
Parametr jest przekazywany przez wartość, gdy na liście parametrów
formalnych w definicji procedury lub funkcji nie jest poprzedzony słowem
kluczowym var.
Parametrem aktualnym może być wówczas dowolne wyrażenie, typ tego
wyrażenia musi być zgodny z typem odpowiadającego mu parametru
formalnego.
Parametr formalny traktowany jest w części {treść procedury} lub {treść
funkcji} jak lokalny obiekt (nie istnieje poza procedurą lub funkcją), a wartość
parametru aktualnego jest wyłącznie początkową wartością tego obiektu,
przypisywaną mu w momencie wywołania procedury lub funkcji. Zatem
parametr przekazywany przez wartość nie może być nośnikiem wyniku.
Parametry przekazywane przez zmienną określonego typu
Parametr jest przekazywany przez zmienną określonego typu, gdy na liście
parametrów formalnych w definicji procedury lub funkcji jest poprzedzony
słowem kluczowym var.
Parametr aktualny musi być zmienną takiego samego typu, jaki posiada
odpowiadający mu parametr formalny.
Parametr formalny jest zastępowany w części {treść procedury} lub {treść
funkcji} przez parametr aktualny (odwołanie do niego) i na nim, wykonywane
są wszelkie działania w procedurze lub funkcji. Zatem jedynie parametr
przekazywany przez zmienną określonego typu może być nośnikiem
wyniku.
Rekurencja
Jedną z bardziej użytecznych własności wybranych algorytmów jest
rekurencja, czyli zdolność do wywoływania samego siebie (ze zmienionymi
parametrami).
Algorytmy rekurencyjne zapisujemy w postaci rekurencyjnych procedur lub
funkcji. W części {treść procedury} lub {treść funkcji} występuje wywołanie
tejże procedury lub funkcji z odpowiednimi parametrami aktualnymi.
Algorytm rekurencyjny można w wielu przypadkach zastąpić, równoważnym
mu, algorytmem iteracyjnym, w którym występują pętle.
Rekurencja jest narzędziem silnym i użytecznym, ale należy ją stosować z
rozwagą.
Przykłady algorytmów rekurencyjnych:
- obliczanie n! = 1*2*…*n, (0!=1) wg wzorów:
silnia(0)=1
silnia(n)=n*silnia(n-1)
- obliczanie n-tej potęgi liczby x wg wzorów:
potęga(x,0)=1 potęga(x,n)=x*potęga(x,n-1)
- obliczanie n-tego wyrazu ciągu Fibonacciego:
F(0)=0 F(1)=1 F(n)=F(n-1)+F(n-2)
- przenoszenie krążków dla wież Hanoi
Algorytm obliczania n! = 1*2*…*n
function silnia (n: integer) : integer;
begin
if n=0 then silnia := 1
else silnia := n*silnia(n-1);
end;
Algorytm obliczania n-tego wyrazu ciągu Fibonacciego
function Fib(n: integer) : integer;
begin
if n=0 then Fib := 0
else if n=1 then Fib := 1
else Fib := Fib(n-1) + Fib(n-2);
end;