手続きと関数

手続きは返り値を持たないもの,関数は返り値を持つものです。

手続き

次のプログラムは,文字 c を n 個出力する手続き nchars を定義したものです。

program sample(output);

{ 文字 c を n 個出力する手続き }
procedure nchars(c : char; n : integer);
var
  i : integer;
begin
  for i := 1 to n do write(c)
end;

begin
  nchars('*', 7);
  writeln
end.
*******

一般に,手続きの定義は次のように書きます。

procedure 手続き名(仮引数の宣言);
ローカルな定義や宣言
begin
  処理
end;

関数

次のプログラムは,整数 m, n の最大公約数を求める関数 gcd を定義したものです。

program sample(output);

{ 整数 m, n の最大公約数を求める関数 }
function gcd(m, n : integer) : integer;
var
  r : integer;
begin
  while n <> 0 do
  begin
    r := m mod n;
    m := n;
    n := r
  end;
  gcd := m
end;

begin
  writeln(gcd(84, 35))  { 出力: 7 }
end.

一般に,関数の定義は次のように書きます。

function 関数名(仮引数の宣言) : 返却型;
ローカルな定義や宣言
begin
  処理
end;

関数の返り値は,関数名 := 返り値 と書いて指定します。

値引数/変数引数

仮引数宣言に var を付けたものは変数引数,付けないものは値引数と呼ばれます。
変数引数は変数の参照渡し,値引数は値渡しが行われます。

次のプログラムは,整数変数 m, n の値を交換する手続き swap を定義したものです。

procedure swap(var m, n : integer);
var
  t : integer;
begin
  t := m; m := n; n := t
end;

整合配列引数

配列型の仮引数は,大きさが可変な整合配列として宣言することができます。
整合配列の型は,array [low..high : integer] of char のように書かれます。

program sample(output);
var
  arr : array [1..3] of char;

{ 文字配列 a の各要素を出力する手続き }
procedure printelem(
  a : array [low..high : integer] of char);  { 整合配列 }
var
  i : integer;
begin
  for i := low to high do writeln(a[i])
end;

begin
  arr[1] := 'a';
  arr[2] := 'b';
  arr[3] := 'c';
  printelem(arr)
end.
a
b
c

なお,整合配列以外では,一般に書き下した型定義を仮引数の宣言に書くことはできません。

type charray = array [1..10] of char;

procedure hoge(a : charray);                { 可 }
procedure piyo(a : array [1..10] of char);  { 不可 }

手続き引数/関数引数

手続きまたは関数を引数に取る手続きや関数を定義することもできます。

次のプログラムは,関数引数を持つ手続き sort を定義したものです。

program sample(output);
var
  arr : array [1..5] of char;

{ x < y であれば true を返す }
function less(x, y : char) : boolean;
begin
  less := x < y
end;

{ 文字変数 a, b の値を交換する }
procedure swap(var a, b : char);
var
  t : char;
begin
  t := a; a := b; b := t
end;

{ 関数 f に基づいてソートを行う }
procedure sort(
  var a : array [low..high : integer] of char;
  function f(x, y : char) : boolean);   { 関数引数 }
var
  i, j : integer;
begin
  for i := high downto low + 1 do
    for j := low to i - 1 do
      if not f(a[j], a[j + 1]) then swap(a[j], a[j + 1])
end;

begin
  arr[1] := 'd';  arr[2] := 'a';  arr[3] := 'e';
  arr[4] := 'b';  arr[5] := 'c';
  sort(arr, less);
  writeln(arr)   { 出力: abcde }
end.