基本情報技術者試験対策(45)「擬似言語(06)関数」

スポンサーリンク
IT系
Telecommuting or remote work concept with a girl working on a laptop while sitting at home. Flat cartoon vector illustration

前回はfor文による繰り返し処理を扱った。今回は、処理をひとまとまりの部品として扱う 関数(手続き) を扱う。これまでの記事でも当たり前のように「手続き」という形式でコードを書いてきたが、今回はその考え方を改めて整理しよう。

関数(手続き)とは何か

関数とは、特定の処理をひとまとまりにして、名前を付けたものである。一度定義しておけば、その名前を呼び出すだけで、何度でも同じ処理を実行できる。プログラムを「小さな部品の組み合わせ」として整理できるようになるため、複雑な処理を見通しよく書くことができる。

擬似言語における関数の宣言は、これまでの記事でも使ってきた次の形式である。

○戻り値の型: 関数名(引数の型: 引数名, ...)
 処理
 return 戻り値

引数と戻り値

関数は、外部から値を受け取る「引数(ひきすう)」と、処理結果を返す「戻り値(もどりち)」を持つことができる。

○整数型: kasan(整数型: a, 整数型: b)
 return a + b

この関数は、ab という2つの整数型の引数を受け取り、その合計を整数型で返す。呼び出す側では、次のように使う。

整数型: kekka
kekka を kasan(3, 5) とする
/* kekka には 8 が代入される */

呼び出し側で渡した 35 が、関数の中でそれぞれ ab として扱われる。この対応関係(何番目の値が、どの引数名に入るか)を正確に追うことが、関数のトレース問題の基本になる。

戻り値のない手続き

戻り値を必要としない処理(何かを出力するだけ、など)は、戻り値の型を書かずに宣言される。

○手続き: aisatsu(文字列型: namae)
 出力する(namae と "さん、こんにちは" を連結した文字列)

このような手続きは return を使わず、呼び出した時点でその処理(この例では出力)を行うだけで終わる。

変数のスコープ(有効範囲)

関数の中で宣言した変数は、その関数の中でしか使うことができない。これを「スコープ(有効範囲)」と呼ぶ。

○整数型: func_a()
 整数型: x
 x を 10 とする
 return x
○整数型: func_b()
 整数型: x
 x を 20 とする
 return x

func_a の中の xfunc_b の中の x は、名前が同じであってもまったく別の変数として扱われる。一方の関数内での代入が、もう一方の関数の変数に影響を与えることはない。試験問題では、同じ変数名が複数の関数にまたがって登場する場合、それぞれが独立したものであることを見落とさないようにする必要がある。

引数の受け渡し

引数を受け取ると、呼び出された関数・手続きの中では、その引数名を使って値を扱う。関数内で引数の値を変更した場合に呼び出し元へどのような影響があるかは、問題文の記述や条件を確認して判断することが重要である。

以下の例では、zouka の中で n を変更しても、呼び出し元の x は変化しない。

○手続き: zouka(整数型: n)
 n を n + 1 とする
○手続き: zouka(整数型: n)
    n を n + 1 とする

整数型: x
x を 5 とする
zouka(x)
/* この時点でも x は 5 のまま */

zouka の中で n に1を加えても、それはあくまで n というコピーされた変数への操作であり、呼び出し元の x は変化しない。これは初学者が誤解しやすいポイントであり、試験でも「呼び出し後の変数の値」を問う形でよく出題される。

なお、配列を引数として渡す場合は扱いが異なり、関数内での要素の書き換えが呼び出し元の配列にも反映される場合がある。配列を引数として扱う問題では、配列の要素を書き換えた場合に呼び出し元の配列へどのような影響があるかを、問題文やプログラムの記述に従って確認しよう。

関数を組み合わせる

一度定義した関数は、他の関数の中から呼び出すことができる。前回・前々回で扱った合計や最大値を求める関数を組み合わせて、平均値を求める関数を作る例を見てみる。

○整数型: goukei(整数型の配列: data)
 整数型: i, sum
 sum を 0 とする
 for (i を 0 から data の要素数 - 1 まで 1 ずつ増やす)
  sum を sum + data[i] とする
 endfor
 return sum
○実数型: heikin(整数型の配列: data)
 return goukei(data) / data の要素数

heikin の中で goukei を呼び出し、その戻り値を配列の要素数で割ることで、平均値を求めている。このように、既に定義された関数を部品として組み合わせていくことが、関数を使う最大のメリットである。以前の記事で扱った再帰(自分自身を呼び出す関数)も、この「関数が別の関数を呼び出す」という仕組みの延長線上にある考え方である。

学習のポイント

  1. 関数は「引数として何を受け取り、何を戻り値として返すか」をセットで理解する
  2. 同じ変数名でも、関数が違えば別の変数として扱われる(スコープ)
  3. 引数を使った処理では、呼び出し元の変数や配列がどう変化するかを、問題文・プログラムの記述に従ってトレースする
  4. 複数の関数を組み合わせて処理を構成する問題では、どの関数がどの関数を呼び出しているかの対応関係を整理する

まとめ

関数(手続き)は、処理をひとまとまりの部品として扱うための仕組みであり、擬似言語のプログラム全体の基本単位でもある。引数と戻り値の対応関係、変数のスコープ、値渡しの性質を正しく理解しておくことが、複雑な問題を読み解く土台になる。これで擬似言語の基本文法(文法概説・if文・elseif・while文・for文・関数)を一通り整理したことになる。

コメント

タイトルとURLをコピーしました