Podprogramy w Turbo Pascalu.doc

(62 KB) Pobierz
Struktura programu

 

 

 

Struktura programu

 

Program składa się z nagłówka programu, bloku oraz kropki ".", co przedstawia następujący schemat

 

program nazwa;

blok.

 

Nagłówek programu składa się ze słowa kluczowego program i identyfikatora nazwa, który nie ma nic wspólnego z nazwą pliku. Nagłówek jest zakończony średnikiem ";". Poniżej przedstawiono przykład programu minimum. Jest to program, który nic nie robi i posiada puste wszystkie części bloku, ale jest poprawny z punktu widzenia składni języka

 

Program _zrob_cos_;

{... miejsce na deklaracje ...}

Begin

{... miejsce na instrucje ...}

End.

 

 

Podprogramy – funkcje lub procedury

 

Podprogram jest wydzieloną (wyizolowaną) częścią programu, realizującą własny zestaw instrukcji, dla którego zdefiniowano sposób wymiany danych z resztą programu. Podprogram wykorzystuje zarówno własny zestaw obiektów (zmienne, stałe, podprogramy itp.), który jest niedostępny na zewnątrz, jak i obiekty zdefiniowane poza jego definicją. Użycie podprogramu nazywane jest wywołaniem i pociąga za sobą wykonanie jego instrukcji na przekazanych mu danych i ewentualnie transfer danych (wyników) do miejsca wywołania wg zdefiniowanego mechanizmu.

 

W Pascalu istnieją dwa rodzaje podprogramów: funkcje oraz procedury. Definicja procedury składa się z nagłówka oraz bloku zakończonego średnikiem.

 

procedure nazwa(lista_param_f);

blok;

 

Nagłówek procedury tworzy słowo kluczowe procedure, identyfikator nazwa oraz ujęta w nawiasy okrągłe lista parametrów formalnych lista_param_f. Nagłówek zakończony jest średnikiem ";". Analogicznie definicja funkcji składa się z nagłówka oraz bloku zakończonego średnikiem.

 

function nazwa(lista_param_f) : typ_wyniku;

blok;

 

Nagłówek funkcji tworzą: słowo kluczowe function, identyfikator nazwa, ujęta w nawiasy okrągłe lista parametrów formalnych lista_param_f oraz dwukropek ":", po którym występuje identyfikator typu wyniku typ_wyniku. Całość kończy średnik ";".

 

W obu przypadkach jeśli podprogram nie wymaga parametrów to lista lista_param_f i obejmujące ją nawiasy są pomijane. Dodatkowo, w przypadku funkcji, conajmniej raz, w części operacyjnej jej bloku, musi pojawić się instrukcja podstawienia w postaci.

 

nazwa := wyrażenie

 

Tu nazwa jest identyfikatorem funkcji zdefiniowanym w jej nagłówku. Celem tej instrukcji jest ustalenie wyniku zwracanego przez funkcję. Wyrażenie jest wyrażeniem o typie zgodnym z typem -typ_wyniku.

 

Parametr formalny jest zmienną lokalną podprogramu tyle tylko, że zadeklarowaną w nagłówku, w liście parametrów formalnych, a nie w bloku podprogramu. Lista parametrów formalnych jest ciągiem deklaracji zmiennych oddzielonych od siebie średnikami ";". Deklaracje te są podobne do deklaracji zmiennych umieszczanych w sekcji var bloku i mają jedną z trzech postaci.

1. p1, p2, ... pn : typ_par

2. var p1, p2, ... pn : typ_par

3. var p1, p2, ... pn

 

Pi jest identyfikatorem i-tego parametru (zmiennej), natomiast typ_par jest identyfikatorem typu lub schematem tablicy otwartej w postaci

 

array of typ_skladowy

 

Co to jest równoważne deklaracji array [0 .. n-1] of typ_skladowy. Tutaj typ_skladowy jest typem składowym elementu tablicy, gdzie n jest hipotetyczną liczbą elementów tablicy przekazywanej jako parametr aktualny. Deklaracja zmiennych w postaci (1) definiuje mechanizm przekazywania parametrów przez wartość natomiast (2,3) przez zmienną.

Deklaracja (nie definicja) podprogramu składa się z samego nagłówka funkcji lub procedury, po którym umieszczono zakończone średnikiem słowo kluczowe forward. Ogólny schemat ma więc jedną z postaci:

 

procedure nazwa(lista_param_f); forward;

function nazwa(lista_param_f) : typ_wyniku; forward;

 

Jak widać deklaracja podprogramu wygląda jak jego definicja, w której blok zastąpiono słowem kluczowym forward. Jeśli w programie użyto deklaracji podprogramu, to nagłówek w jego definicji, która musi się pojawić gdziekolwiek dalej, może przyjąć uproszczoną postać

 

procedure nazwa;

function nazwa;

 

Deklaracje stosuje się w przypadku wywołań rekurencyjnych, kiedy np. procedura A wywołuje procedurę B a ta z kolei wywołuje procedurę A. W tej sytuacji procedura A musiała by być jednocześnie zdefiniowana przed i po procedurze B, co prowadziło by do nonsensu. Niektórzy programiści celowo umieszczają w jednym miejscu deklaracje wszystkich używanych podprogramów, aby uwolnić się od pilnowania właściwej kolejności definicji podprogramów oraz uczynić program bardziej czytelnym. Oto kilka przykładów

 

{Przykłady równoważnych nagłówków. Wszystkie parametry przekazywane przez wartość. Parametry a i b są typu real natomiast n i m typu byte}

 

procedure rob_cos(a, b : real; n, m : byte);

procedure rob_cos(a : real; b : real; n : byte; m : byte);

 

function licz(a, b : real; n, m : byte) : word;

function licz(a : real; b : real; n : byte; m : byte) : word;

 

 

 

{Przykłady równoważnych nagłówków. Parametry a, b przekazywane przez zmienną a m, n przez wartość}

 

procedure rob_cos(var a, b : real; n, m : byte);

procedure rob_cos(var a:real; var b:real; n:byte; m:byte);

 

 

 

{Przykłady nagłówka, w którym zastosowano tablicę otwartą. a i b są tablicami o składnikach typu byte}

 

procedure rob_cos(a, b : array of byte);

 

 

Wywoływanie podprogramów

 

Użycie podprogramu nazywane jest wywołaniem i pociąga za sobą wykonanie jego instrukcji na przekazanych mu danych. Istotną różnicą pomiędzy wywołaniem funkcji a procedury jest to, że funkcja jest wywoływana z wnętrza wyrażenia, podczas gdy wywołanie procedury stanowi osobną instrukcję. Dodatkowo funkcja zwraca do miejsca wywołana (do wyrażenia w miejsce, gdzie ona wystąpiła) jakąś daną (wynik) typu (typ_wyniku) zdefiniowanego w jej nagłówku

 

Wywołanie procedury przebiega wg następujących kroków:

 

  1. Podstawienie parametrów aktualnych pod odpowiednie parametry formalne
  2. Skok do części operacyjnej bloku procedury i wykonanie znajdujących się tam instrukcji.
  3. Powrót do miejsca wywołania i przystąpienia do wykonania następnej instrukcji

 

Wywołanie funkcji polega na podaniu jej nazwy z, objętą nawiasami okrągłymi, listą parametrów aktualnych, o ile takowe są. wywołanie to musi nastąpić z wnętrza wyrażenia (np. 1+sin(2*Pi)+z). Turbo i Free Pascal oferują opcję tzw. składni rozszerzonej pozwalającej na wywołanie funkcji tak jak procedury. Wywołanie funkcji przebiega wg następujących kroków:

  1. Podstawienie parametrów aktualnych pod odpowiednie parametry formalne
  2. Skok do części operacyjnej bloku funkcji i wykonanie znajdujących się tam instrukcji.
  3. Powrót i podstawienie do wyrażenia, w miejsce wywołania, wyniku zwracanego przez funkcję, który jest potem użyty dalej do obliczeń.

Nowy termin lista parametrów aktualnych oznacza ciąg wyrażeń lub zmiennych oddzielonych przecinkami "," w postaci

 

a1, a2, ... an

 

Gdzie a1 jest albo wyrażeniem albo zmienną. Lista parametrów aktualnych w wywołaniu musi być zgodna z listą parametrów formalnych określoną w definicji podprogramu. Zgodność ta musi dotyczyć liczby parametrów, ich typów oraz rodzaju. W czasie wywoływania pod każdy parametr formalny podstawiany jest odpowiadający mu parametr formalny tzn. łączone są pierwszy formalny z pierwszym aktualnym, drugi z drugim itd. Sposób realizacji tego podstawienia zależy od zdefiniowanego w nagłówku podprogramu mechanizmu przekazywania parametru. Oto przykład wyjaśniący sposób przypisania parametrów

 

{Przykładowy nagłówek procedury. Parametry a, b są przekazywane przez zmienną a m, n przez wartość}

 

procedure ObliczCos(var a, b : real; n, m : byte);

 

{Oraz przykłady wywoływań}

 

ObliczCos(z,x,i+1,3)

{Daje przypisanie: a <-> z, b <-> x, n := i+1, m := - 3)

 

 

 

ObliczCos(u,v,-1,k)

{Daje przypisanie: a <-> u, b <-> v, n := -1, m := k}

 

W przypadku mechanizmu przekazywania przez wartość odpowiadający danemu parametrowi formalnemu parametr aktualny jest traktowany jak wyrażenie i musi być typu zgodnego z typem parametru formalnego. Wynik wyrażenia jest przypisywany (tak jak instrukcją przypisania) do parametru formalnego, który należy traktować jest zwykłą zmienną lokalną podprogramu. Parametr formalny różni się od zmiennej lokalnej, zdefiniowanej w jego bloku, tylko tym, że w momencie wywołania ma on już nadaną jakąś wartość początkową (wynikającą z obliczenia parametru aktualnego), podczas gdy zmienna lokalna ma zawsze wartość losową. Ważne jest zrozumienie następującej kwestii. Za wyrażenie uważa się też proste odwołanie do samej zmiennej...

Zgłoś jeśli naruszono regulamin