Pascal - Procedury
Procedures to podprogramy, które zamiast zwracać pojedynczą wartość, pozwalają uzyskać grupę wyników.
Definiowanie procedury
W Pascalu procedura jest definiowana przy użyciu proceduresłowo kluczowe. Ogólna forma definicji procedury jest następująca -
procedure name(argument(s): type1, argument(s): type 2, ... );
< local declarations >
begin
< procedure body >
end;
Procedura definition w Pascal składa się z header, lokalnie declarations i a bodyprocedury. Nagłówek procedury składa się ze słowa kluczowegoprocedureoraz nazwę nadaną procedurze. Oto wszystkie części procedury -
Arguments- Argument (y) ustanawiają powiązanie między programem wywołującym a identyfikatorami procedur i nazywane są również parametrami formalnymi. Reguły dotyczące argumentów w procedurach są takie same jak dla funkcji.
Local declarations - Deklaracje lokalne odnoszą się do deklaracji etykiet, stałych, zmiennych, funkcji i procedur, które mają zastosowanie tylko do treści procedury.
Procedure Body- Treść procedury zawiera zbiór instrukcji, które definiują, co robi procedura. Powinien być zawsze umieszczony między zarezerwowanymi słowami rozpoczynającymi się i kończącymi. Jest to część procedury, w której wykonywane są wszystkie obliczenia.
Poniżej znajduje się kod źródłowy procedury o nazwie findMin () . Ta procedura przyjmuje 4 parametry x, y, z i m i przechowuje minimum spośród pierwszych trzech zmiennych w zmiennej o nazwie m. Zmienna m jest przekazywanareference (omówimy przekazywanie argumentów przez odniesienie nieco później) -
procedure findMin(x, y, z: integer; var m: integer);
(* Finds the minimum of the 3 values *)
begin
if x < y then
m := x
else
m := y;
if z <m then
m := z;
end; { end of procedure findMin }
Deklaracje procedur
Procedura declarationinformuje kompilator o nazwie procedury i sposobie wywołania procedury. Rzeczywistą treść procedury można zdefiniować oddzielnie.
Deklaracja procedury ma następującą składnię -
procedure name(argument(s): type1, argument(s): type 2, ... );
Należy pamiętać, że name of the procedure is not associated with any type. Dla wyżej zdefiniowanej procedury findMin () , poniżej znajduje się deklaracja -
procedure findMin(x, y, z: integer; var m: integer);
Wywołanie procedury
Tworząc procedurę, podajesz definicję tego, co ma ona zrobić. Aby skorzystać z procedury, będziesz musiał wywołać tę procedurę, aby wykonać określone zadanie. Gdy program wywołuje procedurę, sterowanie programem jest przekazywane do wywoływanej procedury. Wywołana procedura wykonuje zdefiniowane zadanie, a po osiągnięciu ostatniej instrukcji końca zwraca sterowanie z powrotem do programu wywołującego.
Aby wywołać procedurę, wystarczy przekazać wymagane parametry wraz z nazwą procedury, jak pokazano poniżej -
program exProcedure;
var
a, b, c, min: integer;
procedure findMin(x, y, z: integer; var m: integer);
(* Finds the minimum of the 3 values *)
begin
if x < y then
m:= x
else
m:= y;
if z < m then
m:= z;
end; { end of procedure findMin }
begin
writeln(' Enter three numbers: ');
readln( a, b, c);
findMin(a, b, c, min); (* Procedure call *)
writeln(' Minimum: ', min);
end.
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Enter three numbers:
89 45 67
Minimum: 45
Podprogramy rekurencyjne
Widzieliśmy, że program lub podprogram może wywołać inny podprogram. Gdy podprogram wywołuje sam siebie, nazywa się to wywołaniem rekurencyjnym, a proces nazywany jest rekurencją.
Aby zilustrować to pojęcie, obliczyć silnię liczby. Silnia liczby n jest definiowana jako -
n! = n*(n-1)!
= n*(n-1)*(n-2)!
...
= n*(n-1)*(n-2)*(n-3)... 1
Poniższy program oblicza silnię podanej liczby, wywołując siebie rekurencyjnie.
program exRecursion;
var
num, f: integer;
function fact(x: integer): integer; (* calculates factorial of x - x! *)
begin
if x=0 then
fact := 1
else
fact := x * fact(x-1); (* recursive call *)
end; { end of function fact}
begin
writeln(' Enter a number: ');
readln(num);
f := fact(num);
writeln(' Factorial ', num, ' is: ' , f);
end.
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Enter a number:
5
Factorial 5 is: 120
Poniżej znajduje się kolejny przykład, który generuje Fibonacci Series dla danej liczby za pomocą recursive funkcja -
program recursiveFibonacci;
var
i: integer;
function fibonacci(n: integer): integer;
begin
if n=1 then
fibonacci := 0
else if n=2 then
fibonacci := 1
else
fibonacci := fibonacci(n-1) + fibonacci(n-2);
end;
begin
for i:= 1 to 10 do
write(fibonacci (i), ' ');
end.
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
0 1 1 2 3 5 8 13 21 34
Argumenty podprogramu
Jeśli podprogram (function or procedure) ma używać argumentów, musi deklarować zmienne, które akceptują wartości argumentów. Te zmienne nazywane sąformal parameters podprogramu.
Parametry formalne zachowują się jak inne zmienne lokalne wewnątrz podprogramu i są tworzone przy wejściu do podprogramu i niszczone przy wyjściu.
Podczas wywoływania podprogramu argumenty mogą być przekazywane do podprogramu na dwa sposoby -
Sr.No | Typ i opis połączenia |
---|---|
1 | Zadzwoń według wartości Ta metoda kopiuje rzeczywistą wartość argumentu do parametru formalnego podprogramu. W tym przypadku zmiany dokonane w parametrze wewnątrz podprogramu nie mają wpływu na argument. |
2 | Zadzwoń przez odniesienie Ta metoda kopiuje adres argumentu do parametru formalnego. Wewnątrz podprogramu adres jest używany do uzyskania dostępu do faktycznego argumentu używanego w wywołaniu. Oznacza to, że zmiany wprowadzone w parametrze wpływają na argument. |
Domyślnie Pascal używa call by valueprzekazywać argumenty. Ogólnie oznacza to, że kod w podprogramie nie może zmienić argumentów używanych do wywołania podprogramu. Przykładowy program, którego użyliśmy w rozdziale „Pascal - Funkcje”, przy użyciu funkcji o nazwie max () nazwał funkcjęcall by value.
Natomiast podany tutaj przykładowy program ( exProcedure ) wywołuje procedurę findMin () używająccall by reference.