パスカル-手順

Procedures は、単一の値を返す代わりに、結果のグループを取得できるようにするサブプログラムです。

手順の定義

Pascalでは、プロシージャは procedureキーワード。プロシージャ定義の一般的な形式は次のとおりです。

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

手順 definition パスカルでは、 header、 地元 declarationsbody手順の。プロシージャヘッダーはキーワードで構成されますprocedureプロシージャに付けられた名前。手順のすべての部分は次のとおりです-

  • Arguments−引数は、呼び出し側プログラムとプロシージャーIDの間のリンクを確立し、仮パラメーターとも呼ばれます。プロシージャ内の引数のルールは、関数のルールと同じです。

  • Local declarations −ローカル宣言は、ラベル、定数、変数、関数、およびプロシージャの宣言を指します。これらは、プロシージャの本体にのみ適用されます。

  • Procedure Body−プロシージャ本体には、プロシージャの機能を定義するステートメントのコレクションが含まれています。予約語のbeginとendで常に囲む必要があります。これは、すべての計算が行われる手順の一部です。

以下は、findMin()と呼ばれるプロシージャのソースコードです。この手順では、4つのパラメーターx、y、z、およびmを取り、最初の3つの変数の最小値をmという名前の変数に格納します。変数mは渡されますreference (参照による引数の受け渡しについては、少し後で説明します)−

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 }

手順の宣言

手順 declarationプロシージャ名とプロシージャの呼び出し方法についてコンパイラに通知します。手順の実際の本体は個別に定義できます。

プロシージャ宣言の構文は次のとおりです。

procedure name(argument(s): type1, argument(s): type 2, ... );

注意してください name of the procedure is not associated with any type。上記で定義されたプロシージャfindMin()の場合、以下は宣言です。

procedure findMin(x, y, z: integer; var m: integer);

プロシージャの呼び出し

プロシージャを作成するときに、プロシージャが実行する必要があることを定義します。プロシージャを使用するには、そのプロシージャを呼び出して、定義されたタスクを実行する必要があります。プログラムがプロシージャを呼び出すと、プログラム制御は呼び出されたプロシージャに移されます。呼び出されたプロシージャは、定義されたタスクを実行し、最後の終了ステートメントに達すると、制御を呼び出し側プログラムに戻します。

プロシージャを呼び出すには、以下に示すように、プロシージャ名とともに必要なパラメータを渡すだけです。

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.

上記のコードをコンパイルして実行すると、次の結果が得られます。

Enter three numbers:
89 45 67
Minimum: 45

再帰的サブプログラム

プログラムまたはサブプログラムが別のサブプログラムを呼び出す可能性があることを確認しました。サブプログラムがそれ自体を呼び出すとき、それは再帰呼び出しと呼ばれ、プロセスは再帰と呼ばれます。

概念を説明するために、数値の階乗を計算してみましょう。数nの階乗は次のように定義されます-

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

次のプログラムは、それ自体を再帰的に呼び出すことにより、指定された数値の階乗を計算します。

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.

上記のコードをコンパイルして実行すると、次の結果が得られます。

Enter a number:
5
Factorial 5 is: 120

以下は、を生成する別の例です。 Fibonacci Series を使用して指定された番号に対して recursive 関数-

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.

上記のコードをコンパイルして実行すると、次の結果が得られます。

0 1 1 2	3 5 8 13 21 34

サブプログラムの引数

サブプログラムの場合(function or procedure)は引数を使用することであり、引数の値を受け入れる変数を宣言する必要があります。これらの変数は、formal parameters サブプログラムの。

仮パラメータは、サブプログラム内の他のローカル変数と同様に動作し、サブプログラムへの入力時に作成され、終了時に破棄されます。

サブプログラムの呼び出し中に、引数をサブプログラムに渡す方法は2つあります。

シニア番号 通話の種類と説明
1 値で呼び出す

このメソッドは、引数の実際の値をサブプログラムの仮パラメーターにコピーします。この場合、サブプログラム内のパラメーターに加えられた変更は、引数に影響を与えません。

2 参照による呼び出し

このメソッドは、引数のアドレスを仮パラメーターにコピーします。サブプログラム内では、アドレスは呼び出しで使用される実際の引数にアクセスするために使用されます。これは、パラメータに加えられた変更が引数に影響を与えることを意味します。

デフォルトでは、Pascalは call by value引数を渡す。一般に、これは、サブプログラム内のコードが、サブプログラムの呼び出しに使用される引数を変更できないことを意味します。「Pascal-関数」の章で使用したサンプルプログラムは、max()という名前の関数を使用して呼び出しました。call by value

一方、ここで提供されているサンプルプログラム(exProcedure)は、を使用してプロシージャfindMin()を呼び出します。call by reference