Pascal-procedures
パスカル-手順
- プロシージャ*は、単一の値を返す代わりに、結果のグループを取得できるサブプログラムです。
プロシージャの定義
Pascalでは、プロシージャは procedure キーワードを使用して定義されます。 プロシージャ定義の一般的な形式は次のとおりです-
procedure name(argument(s): type1, argument(s): type 2, ... );
< local declarations >
begin
< procedure body >
end;
Pascalのプロシージャ definition は、プロシージャの header 、ローカル declarations 、および body で構成されます。 プロシージャヘッダーは、キーワード procedure とプロシージャに付けられた名前で構成されます。 ここに手順のすべての部分があります-
- 引数-引数は、呼び出し側プログラムとプロシージャ識別子との間のリンクを確立し、仮パラメータとも呼ばれます。 手続きの引数の規則は、関数の規則と同じです。
- ローカル宣言-ローカル宣言は、ラベル、定数、変数、関数、およびプロシージャの宣言を参照します。これらは、プロシージャの本体のみに適用されます。
- プロシージャ本体-プロシージャ本体には、プロシージャの動作を定義するステートメントのコレクションが含まれます。 予約語beginとendで常に囲まれている必要があります。 これは、すべての計算が行われる手順の一部です。
以下は、_findMin()_と呼ばれるプロシージャのソースコードです。 このプロシージャは、4つのパラメータx、y、z、およびmを受け取り、mという名前の変数に最初の3つの変数の最小値を格納します。 変数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 }
手続き宣言
プロシージャ*宣言*は、プロシージャ名とプロシージャの呼び出し方法をコンパイラに伝えます。 プロシージャの実際の本体は個別に定義できます。
プロシージャ宣言には次の構文があります-
procedure name(argument(s): type1, argument(s): type 2, ... );
プロシージャの名前はどのタイプにも関連付けられていないことに注意してください。 上記の定義されたプロシージャ_findMin()_の場合、以下は宣言です-
procedure findMin(x, y, z: integer; var m: integer);
プロシージャの呼び出し
プロシージャの作成中に、プロシージャの実行内容の定義を指定します。 プロシージャを使用するには、そのプロシージャを呼び出して定義済みのタスクを実行する必要があります。 プログラムがプロシージャを呼び出すと、プログラム制御は呼び出されたプロシージャに転送されます。 呼び出されたプロシージャは定義されたタスクを実行し、最後のendステートメントに到達すると、呼び出し元プログラムに制御を返します。
プロシージャを呼び出すには、以下に示すように、プロシージャ名とともに必要なパラメータを渡す必要があります-
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
以下は、*再帰*関数を使用して指定された数の*フィボナッチ数列*を生成する別の例です-
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
サブプログラムの引数
サブプログラム(関数またはプロシージャ)が引数を使用する場合、引数の値を受け入れる変数を宣言する必要があります。 これらの変数は、サブプログラムの*仮パラメータ*と呼ばれます。
仮パラメータは、サブプログラム内の他のローカル変数と同様に動作し、サブプログラムへのエントリ時に作成され、終了時に破棄されます。
サブプログラムを呼び出している間、引数をサブプログラムに渡すことができる2つの方法があります-
Sr.No | Call Type & Description |
---|---|
1 |
このメソッドは、引数の実際の値をサブプログラムの仮パラメータにコピーします。 この場合、サブプログラム内のパラメーターに変更を加えても、引数には影響しません。 |
2 |
このメソッドは、引数のアドレスを仮パラメーターにコピーします。 サブプログラム内では、アドレスは呼び出しで使用される実際の引数にアクセスするために使用されます。 これは、パラメーターに加えられた変更が引数に影響することを意味します。 |
デフォルトでは、Pascalは*値による呼び出し*を使用して引数を渡します。 一般に、これは、サブプログラム内のコードがサブプログラムの呼び出しに使用される引数を変更できないことを意味します。 「パスカル-関数」の章で使用したサンプルプログラムは、 call by value を使用してmax()という名前の関数を呼び出しました。
一方、ここで提供されるサンプルプログラム(exProcedure)は、 call by reference を使用してプロシージャfindMin()を呼び出します。