Podprogramy
Podprogramy Potrzeba istnienia podprogramów Podprogramy w Pascalu Ograniczenia percepcji człowieka (5-9 obiektów, średnio 7) Programowanie zstępujące Programowanie wstępujące Podprogramy w Pascalu Procedury Funkcje
Procedury procedure nazwa(lista_parametrów); deklaracje_etykiet; deklaracje_stałych; deklaracje_typów; deklaracje_zmiennych; deklaracje_podprogramów; begin instrukcja_1; instrukcja_2; ... instrukcja_ostatnia end;
Procedury Zmienne lokalne Lista argumentów (może być pusta) Parametry formalne Parametry aktualne Zakres widoczności identyfikatorów Zmienne globalne Zmienne nielokalne
program przyk_proc; var i: integer; { zmienne globalne } s: string; procedure pisz; { pisze 40 gwiazdek } var i: integer; { zmienna lokalna procedury } begin write(s); { dotyczy globalnej zmiennej s } for i:=1 to 40 do { dotyczy lokalnej zmiennej i } write(’*’); writeln end; s:=’Gwiazdki: ’; for i:=1 to 10 do { dotyczy globalnej zmiennej i } pisz; end.
Procedury Jak to działa? Co znajduje się na stosie?
Przekazywanie argumentów Przez wartość program przyk5; var i: integer; procedure test5(k:integer); begin k:=k+1; writeln(k) end; i:=10; test5(i); { 11 } writeln(’Po teście: ’,i); { 11 } end. Przez zmienną ( var ) program przyk6; var i: integer; procedure test6(var k:integer); begin k:=k+1; writeln(k) end; i:=10; test6(i); { 11 } writeln(’Po teście: ’,i); { 10 } end.
function nazwa(argumenty): typ_wyniku; Funkcje Podprogramy zwracające wartość (w Pascalu następujących typów): typów porządkowych, typu rzeczywistego, łańcuchów, wskaźników. function nazwa(argumenty): typ_wyniku;
Funkcje Jak zwrócić wynik? program przyk7; function razy3(k:integer):integer; begin razy3:=3*k end; writeln(razy3(5)); end.
Przykład Dana jest funkcja f1(x):real. Napisać (zaimplementować) funkcję calk1(x0,x1:real):real, która wyznacza przybliżoną wartość całki oznaczonej fukcji f1(x) w przedziale od x0 do x1 metodą prostokątów.
Przykład Napisać funkcję, której argumentem jest łańcuch, zwracającą oryginalny łańcuch uzupełniony o spacje wstawione między każdą parę sąsiadujących znaków (’Ala ma kota’ -> ’A l a m a k o t a’).
Przykład Napisać funkcję, która sprawdza, czy podana jako argument liczba całkowita jest liczbą pierwszą, czy nie (wynik powinien być typu boolean).
Przekazywanie argumentów do programu var i: Word; begin for i := 1 to ParamCount do WriteLn( ParamStr(i) ); end.
Rekurencja Silnia: n! = n * (n-1) * (n-2) * … * 2 * 1 function silnia(n : integer) : integer; begin if n=0 then silnia := 1 else silnia := n * silnia(n-1); end;
Rekurencja Ciąg Fibonacciego: function fib(n : integer) : integer; Fib(n) = Fib(n-1) * Fib(n-2) function fib(n : integer) : integer; begin if n=1 or n=2 then fib := 1 else fib := fib(n-1) * fib(n-2); end;
Rekurencja Warunek końca rekurencji słowo kluczowe forward rozmiar stosu kiedy nie stosować rekurencji?
Przykład Napisać funkcję, która wygeneruje wszystkie permutacje przekazanej tablicy znaków.