Procedury i funkcje





Procedury
Procedury służą do grupowania zbioru instrukcji i operacji w ten sposób, że mogą być wielokrotnie wywoływane w (prawie) dowolnym miejscu programu. one umieszczane pomiędzy częścią deklaracyjną, a główną częścią programu:
program prog;
var x:integer;
procedure proc;
begin
kod procedury;
end;
begin
proc; {wywołanie procedury "proc"}
end;

Z powyższego przykładu widać, że procedura (w naszym przypadku jej nazwa to "proc") przypomina trochę oddzielny program. Idąc dalej tym tropem okazuje się, że dla procedury można deklarować jej własne zmienne itp. widoczne tylko wewnątrz niej:
procedure proc;
var ps:integer;
begin
end;

Należy jednak unikać korzystania z takich samych nazw co w głównej części programu (taka deklaracja jest dopuszczalna, ale może powodować nieco zamieszania dla samego programisty).

Możliwości procedury na tym się jednak nie kończą. Procedurę można tak napisać, aby wymagała podania jakiegoś parametru:
procedure proc(x:integer);
Przy wywołaniu takiej procedury należy podać parametr typu integer (parametrem może być zmienna):
proc(2);
Jak wykorzystać taki parametr? Podany parametr będzie widoczny w procedurze jako zmienna "x" (bo tak ją nazwaliśmy w deklaracji procedury), która może zostać wykorzystana do dowolnych wyliczeń.
Jak to zwykle bywa parametrów może być kilka:
procedure proc(x:integer; z,a:string);
wtedy przy wywoływaniu, każdy z nich oddzielamy przecinkiem:
proc(10, 'tekst', 'inny tekst');
Możemy także wymusić, aby parametrem używanym przy wywołaniu procedury była inna zmienna:
procedure proc(var x:integer; z,a:string);
teraz wcześniejszy sposób wywołania będzie niedozwolony i trzeba będzie wpisać:
proc(qwe, 'tekst', 'inny tekst');
Gdzie "qwe" jest zmienną typu integer


Ostatnią ciekawą cechą procedury jest możliwość zadeklarowania wewnątrz niej innej procedury:
procedure jakasprocedura ;
begin
end;
procedure proc;
procedure proc2;
begin
end;
procedure proc3;
begin
end;
begin
end;

Należy jednak pamiętać, że procedurę "proc" można wywołać z głównej części programu oraz z procedury "jakasprocedura", ale w przypadku procedur "proc2" oraz "proc3" nie będzie to już możliwe. Te procedury będą widziane jedynie przez "proc", przez siebie (gdy procedura wywołuje samą siebie to jest to rekurencja, która należy do dość zaawansowanych zagadnień) i inne procedury na swoim poziomie. Możliwe jest natomiast wywołanie procedury jakasprocedura z proc2 lub proc3.

Funkcje
Funkcje działają na podobnych zasadach jak procedury. Różnice wynikają jedynie ze sposobu deklaracji (i właściwości funkcji):
program prog;
var x:integer;
function proc:integer;
begin
kod funkcji;
end;
begin
proc; {wywołanie funkcji "proc"}
end;

Po co w deklaracji, jest ":integer"? A dlatego, że nasza funkcja ma zwracać wartość tego typu (lub dowolnego innego jaki wpiszemy). Sama z siebie jednak funkcja nie zwróci żadnej wartości, musimy więc w jej kodzie wpisać co ma zwracać:
function proc:integer;
begin
proc:=10;
end;
teraz zwróci wartość 10. No dobrze tylko teraz jak pobrać tą wartość? np. tak:
x:=proc; {x typu integer}
takie polecenie spowoduje wykonanie funkcji proc i przypisanie zwróconej wartości do zmiennej x.
Podobnie możemy wpisać tak:
if proc=10 then costam;
Stopień widzialności poszczególnych funkcji jest analogiczny do procedur, podobnie na tej samej zasadzie co procedury, można tworzyć funkcje wymagające parametru.