関数定義とは(全体像)
関数定義は、よく使う処理にひとつ名前をつけて、部品としてまとめておくこと。同じ処理を何度も書かずに、名前を呼ぶだけで使い回せるようになる。
擬似言語では、定義の先頭に○記号をつける。これは「ここから関数(または手続)が始まる」という目印だ。コメントではないので注意。
押さえるのは、手続と関数の2種類があること。
- 手続 … 結果を返さない。画面に表示する・データを更新するなどの「作業」が役目。
- 関数 … 計算した結果を`return`で返す。「入力を受け取って答えを返す」のが役目。
身近に置きかえると、手続はレジ係(お会計を処理するが、何かを返すわけではない)、関数は計算機(数を入れると答えが返ってくる)というイメージだ。
詳しく:書き方と引数の渡し方だけ覚えれば戦える
ここが記事の心臓部。関数定義の中身は、次の表に全部つまっている。
手続と関数の書き方
| 種類 | 書き方 | 役目 |
|---|---|---|
| 手続(戻り値なし) | `○手続名(型: 引数名, …)` | 表示・更新などの作業 |
| 関数(戻り値あり) | `○戻り値の型: 関数名(型: 引数名, …)` … `return 値` | 計算結果を返す |
| 呼び出し | `result ← 関数名(引数1, 引数2)` | 部品を使う |
引数(関数に渡す値)の渡し方には2種類あり、ここが試験でよく問われる。
引数の渡し方2種
| 渡し方 | 対象 | 呼び出した側への影響 |
|---|---|---|
| 値渡し(デフォルト) | 整数などの基本型 | コピーが渡るので影響しない |
| 参照渡し | 配列・構造体 | 中身を書き換えると呼び出し側にも反映される |
つまりポイントは、基本型は値渡し(コピー)、配列や構造体は参照渡しになること。値渡しは「写しを渡す」ので関数の中で変えても元はそのまま。参照渡しは「現物の置き場所を渡す」ので、関数の中で書き換えると呼び出した側のデータも変わる、というわけだね。
なお、関数は自分自身を呼び出す(再帰)こともできる。また、関数の中で宣言した変数(ローカル変数)は、その関数の中だけで使える。
わかりやすく言い換えると
要するに、関数は「名前をつけた処理の部品」だ。
①手続 … 答えを返さない作業役(レジ係のイメージ)
②関数 … 答えを`return`で返す計算役(計算機のイメージ)
③渡し方 … 基本型は写し(値渡し)、配列・構造体は現物の場所(参照渡し)
参照渡しのときだけ、関数の中の変更が呼び出した側に伝わる。ここが取り違えやすいので、「配列を渡したら向こうも変わる」と覚えておくとよい。
試験のツボ
🔴 一番出る:○記号と手続・関数の違い
①定義は`○`で始まる(コメントではない)
②手続は戻り値なし、関数は`return`で値を返す
🔴 次に出る:値渡しと参照渡し
①基本型は値渡し(コピー・呼び出し側に影響しない)
②配列・構造体は参照渡し(呼び出し側にも反映される)
🟡 押さえると安定:再帰とローカル変数
①関数は自分自身を呼び出せる(再帰)
②関数内で宣言した変数はその関数の中だけで使える
よくある間違い
①「○記号はコメントを表す」→ ✗ ○は手続・関数の始まりの目印。コメントは`//`。
②「引数はつねに値渡しで、呼び出し側は変わらない」→ ✗ 配列・構造体は参照渡し。書き換えると呼び出し側にも反映される。
③「関数は必ず戻り値を返す」→ ✗ 戻り値を返さない手続もある。返すのは関数のほう。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(手続と関数の違い)
擬似言語の手続と関数に関する次の記述のうち、正しいものはどれか。
- 手続も関数も先頭に//記号を置いて定義し、どちらも必ずreturnで値を返すものである
- 手続も関数もまったく同じもので、戻り値があるかないかという区別は存在していない
- 手続は戻り値を返さない作業役、関数はreturnで計算結果を返す役で、定義は○で始まる
- 手続は○で定義し関数は//で定義するという、記号のうえでの違いだけが両者にはある
解答は 3 だよ。
手続は戻り値を返さない作業役、関数は`return`で結果を返す計算役。どちらも定義は`○`で始まるんだ。
選択肢1の「//で定義・必ずreturn」、選択肢2の「区別がない」、選択肢4の「記号の違いだけ」はどれも誤りだよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 定義は○で始まり、手続はreturnしない |
| 2 | ✗ | 戻り値の有無で区別される |
| 3 | ✓ | 手続=作業役・関数=計算役、定義は○ |
| 4 | ✗ | どちらも○で定義する |
オリジナル問題2(値渡しと参照渡し)
擬似言語の引数の渡し方に関する次の記述のうち、正しいものはどれか。
- 配列や構造体は参照渡しになり、関数内で書き換えると呼び出した側にも反映される
- 整数などの基本型は参照渡しになり、関数内で変えると呼び出した側もすべて変わる
- すべての引数はつねに参照渡しで、関数内での変更は呼び出した側に影響を与えない
- すべての引数はつねに値渡しで、配列を関数内で書き換えても呼び出した側は変わらない
解答は 1 だよ。
配列や構造体は参照渡しなので、関数の中で書き換えると呼び出した側にも反映されるんだ。整数などの基本型は値渡し(コピー)で、関数の中で変えても元はそのままだよ。
選択肢2は基本型と参照渡しの組合せが逆。選択肢3・4は「すべて同じ渡し方」が誤りだよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 配列・構造体は参照渡しで反映される |
| 2 | ✗ | 基本型は値渡し |
| 3 | ✗ | すべて参照渡しではない |
| 4 | ✗ | 配列は参照渡しで反映される |
オリジナル問題3(呼び出しとローカル変数)
擬似言語の関数の呼び出しとローカル変数に関する次の記述のうち、正しいものはどれか。
- 関数の呼び出しはできず、定義した処理は一度きりしか実行されない決まりになっている
- 関数は「関数名(引数)」で呼び出し、関数内で宣言した変数はその関数の中だけで使える
- 関数内で宣言した変数はプログラム全体のどこからでも自由に読み書きできるものである
- 関数は自分自身を呼び出すことが禁じられており、再帰という書き方はいっさい使えないとされる
解答は 2 だよ。
関数は`関数名(引数)`で呼び出すんだ。関数の中で宣言した変数(ローカル変数)は、その関数の中だけで使えて、外からは見えないよ。
選択肢1の「一度きり」、選択肢3の「全体から読み書き」、選択肢4の「再帰は使えない」はどれも誤りだよ(関数は自分自身も呼び出せる)。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 何度でも呼び出せる |
| 2 | ✓ | 関数名(引数)で呼ぶ・変数は関数内のみ |
| 3 | ✗ | ローカル変数は関数の中だけ |
| 4 | ✗ | 再帰(自己呼び出し)は使える |
まとめ
押さえどころ
- 🔴 ○記号と2種類 = 定義は`○`で始まる。手続は戻り値なし、関数は`return`で値を返す。
- 🔴 値渡しと参照渡し = 基本型は値渡し(影響なし)、配列・構造体は参照渡し(呼び出し側にも反映)。
- 🟡 再帰とスコープ = 関数は自分自身を呼び出せる。ローカル変数はその関数の中だけ。
次に学ぶ
- 擬似言語の再帰 ── 関数が自分自身を呼び出すしくみ。関数定義に続けて押さえると、複雑な処理の書き方がつかめる。
- 擬似言語の変数宣言 ── 引数や戻り値で扱う「型」の基礎。関数の型宣言と合わせて押さえると混ざらない。
執筆: SikakuQuest編集部