Ver. 1.0 Beta, Nie masz kompilatora? Teraz możesz pisać skrypty ONLINE! Wersja podstawowa -nie zawiera wszystkich poleceń Pascala. Służy do nauki podstaw

Pisanie własnych procedur i funkcji w pascalu


Procedura i funkcja to kilka instrukcji połączonych w grupę, instrukcji -które robią określoną rzecz. Np. wypisują coś na ekranie, zmieniają kolor, rysują tabelki. Procedura może wykorzystywać inne napisane przez Ciebie procedury i funkcje.


Może zastanowisz się po co wogóle pisać procedurę czy funkcję. Przecież można napisać program jednym ciągiem. Faktycznie dla bardzo małych zadań jest to nawet praktyczne. Sprawa utrudnia się gdy chcesz stworzyć rozbudowaną grę lub nawet niewielki program.


Przy dużych ilościach kodu, w którym wszystko jest w każdym miejscu nie jest łatwo zapamiętać pozycji każdej najdrobniejszej instrukcji. Dodatkowo, gdy chcesz żeby program w kilku miejscach robił to samo musisz kopiować kod i go wklejać. Potem gdy będziesz chciał zrobić jakąś poprawkę, będziesz musiał znaleźć każde miejsce z błędem i je udoskonalić.


Procedury rozwiązują ten problem. Jedna procedura może wykonywać jedną konkretną czynność. Małe procedurki mogą być wywoływane przez większe i w rzeczywistości często dobre gry składają tylko z trzech procedur: inicjacji, startu gry i finalizacji czyli czyszenia pamięci. Procedury pozwalają więc zachować porządek


Istnieje możliwość wyjścia z procedury, bez wykonania pełnego kodu. Służy do tego Instrukcja Exit; Wykorzystuje się ją w przypadku, gdy któryś z parametrów podanych do procedury nie spełnia założeń programisty. Gdy wywołasz Exit, wykonywanie kodu wznowi się zaraz przed zakończeniem kodu procedury -w miejscu end; tej instrukcji.



Czym różni się funkcja od procedury

Procedura wykonuje czynność i się zakańcza. Funkcja po wykonaniu się zwraca jakiś wynik operacji, dzięki czemu można ją traktować prawie jak zmienną. Jednak nie zawsze tą wartość zwróconą musisz wykorzystać. Możesz po prostu wykonać funkcję w taki sposób jak uruchamiałbyś procedurę.



przykłady
 procedura:   Czysc_Ekran; WriteLn('tekst');
 funkcja: x:= PozycjaMyszyX; y:= PozycjaMyszyY lub size := FileSize(...)


Schemat budowy procedury

Na początku programu można zdefiniować nagłówek, jeśli ta procedura ma być widoczna w całym pliku (koniecznie gdy piszesz moduł i będziesz jej używał poza modułem). Liczba parametrów procedury może być dowolna. Każdy z parametrów ma określony typ.


Nazwa jaką nadamy parametrowi (np. parametr1) nie ma żadnego znaczenia na zewnątrz tej procedury. Użyjemy jej tylko w kodzie wewnętrznym. Gdy będziemy później odwoływali do tej procedury, będziemy mogli jako parametr używać różnych nazw zmiennych.


program nazwa;
uses Crt; {moduły}

var {deklaracja zmiennych}
  zmienna : Byte;

{nagłówek procedury}
procedure NazwaProcedury(parametr1:typ; parametr2:typ2);

{Inne procedury}

{...}
{ciało procedury}
procedure NazwaProcedury(parametr1:typ; parametr2:typ2);
begin {początek procedury}
 {tu może być kod wykonywalny}
end; {koniec}

begin
  {główna część programu}

 {wywołanie tej procedury}
 NazwaProcedury(parametr1, parametr2);
end.


Inne przykłady procedur:



Czekanie na wciśnięcie klawisza Enter
procedure CzekajNaEnter;
begin
 WriteLn('Prosze wcisnac ENTER');
 ReadLn;
end;

begin
 WriteLn('Witaj w programie');
 CzekajNaEnter;
end.

wynik działania programu:


Witaj w programie
Prosze wcisnac ENTER

w tym wypadku procedura CzekajNaEnter; będzie wyświetlała komunikat i oczekiwała na wciśnięcie klawisza.



Schemat budowy funkcji

Na początku programu można zdefiniować nagłówek, jeśli ta funkcja ma być widoczna w innych plikach (koniecznie gdy piszesz moduł) lub wywołujesz ją gdzieś na początku kodu a jej treść jest za wywołaniem (tak samo jak w przypadku procedury)


Wewnątrz kodu funkcji powinno znaleźć się przypisanie jej jakiejś wartości zwrotnej


{nagłówek}
function NazwaFunkcji(parametr1:typ; parametr2:typ2): typ 3; {funkcja musi zwrocic jakas wartosc, wiec posiada swoj typ}

{...}
{ciało funkcji}
function NazwaFunkcji(parametr1:typ; parametr2:typ2): typ 3;
begin {początek funkcji}
 {tu może być treść}
 NazwaFunkcji:=wartosc;
end; {koniec}

begin
 a:=NazwaFunkcji(zmienna1, zmienna2);
 {dopuszczalne również}
 NazwaFunkcji(zmienna1, zmienna2);
end.


Mnożenie dwóch liczb
function Pomnoz(a, b : integer) : Longint;
begin
  Pomnoz := a*b;
end;

begin
  WriteLn('wynik 2*5 to ', Pomnoz(2, 5));
end.

wynik działania programu:



wynik 2*5 to 10


Obliczanie silni za pomocą rekurencji

W rozdziale dotyczącym pętli została opisana metoda rekurencji (wywołania w procedurze lub funkcji samej siebie).  Poniżej pokazano jak poradzić sobie z obliczeniem silni za pomocą rekurencji.



program obliczanie_silni;

function silnia(l : LongInt) : Longint;
begin
 if l <= 1 then silnia:= 1
 else silnia := silnia(l - 1) * l; {wywołanie samej siebie}
end;

begin
 WriteLn(silnia(5)); {wynik: 120}
end.