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.