10_関数

はじめに

この資料では、「関数」について学びます。関数とは、ひとまとまりの処理に名前をつけておき、必要なときに何度でも呼び出せる仕組みです。

関数(いわゆるサブルーチン)として一連の処理を部品化しておくことで、次のようなメリットがあります:


1. 関数定義と基本形

エンジニアはひとまとまりの処理に関数名をつけて、関数を定義できます。 関数名は変数名と同様に、できるだけ分かりやすい名前をつけるべきです。

関数は引数、戻り値の有無により細かく言えば下記の4種類になります。

  1. 引数なし・戻り値なし
  2. 引数あり・戻り値なし
  3. 引数なし・戻り値あり
  4. 引数あり・戻り値あり

それぞれの定義形式は次の通りです。


■引数なし・戻り値なし
〇 関数名()
    処理1
    処理2
    処理3
    ・・・

〇に続いて、関数名、()カッコの行 その下の行から関数の処理内容がインデント(字下げ)されて表現されます。

例:

〇 program()
    a を出力する
    b を出力する

programが関数名。()とカッコの中に何もないのは受け取るデータ(引数)が無いことを表します。


■引数あり・戻り値なし
〇 関数名(引数の型: 引数名)
    処理1
    処理2
    処理3
    ・・・

〇に続いて関数名、()カッコ内に変数定義を記述。その関数の呼び出し時にデータを受け取った状態で動くことになる。 複数のデータを受け取る場合はカンマ区切りで変数定義が記載される。


■引数なし・戻り値あり
〇 戻り値の型: 関数名()
    処理1
    処理2
    処理3
    ・・・
    return 戻り値
戻り値ありの件数定義

関数名の前に戻り値のデータ型が記載される。 関数の処理にretrun文が記載される。


■引数あり・戻り値あり
〇 戻り値の型: 関数名(引数の型: 引数名)
    処理1
    処理2
    処理3
    ・・・
    return 戻り値

戻り値の型、引数の定義が共に記載される。


2. 引数なし・戻り値なし

特徴と注意点
関数定義例
〇 greet()
    "Hello!" を出力する

関数greetは、Hello!を画面出力する。

呼び出し例
greet()
greet()

3. 引数あり・戻り値なし

特徴と注意点
関数定義例
〇 print_double(整数型: x)
    ( x × 2 ) を出力する

関数print_doubleは、受け取った値を倍にして画面出力する。

呼び出し例
print_double(5)
print_double(8)

ちなみに、呼び出し時に実際に渡すデータ(5や8)を実引数と呼び、 関数内で受け取る変数Xを仮引数と呼ぶ。

実引数「5」で呼び出すと、変数xに「5」が格納された状態で関数が動作する。


4. 引数なし・戻り値あり

特徴と注意点
関数定義例
〇 整数型: get_fixed()
    整数型: ret
    ret ← 10
    return ret

関数get_fixedは、10を返す。

呼び出し例
整数型: value ← get_fixed()
value を出力する

5. 引数あり・戻り値あり

特徴と注意点
関数定義例
〇 整数型: add_tax(整数型: price)
    整数型: tax ← price × 11 ÷ 10
    return tax

関数add_tax()は、受け取った値を税込み価格にして返す。

呼び出し例
整数型: result ← add_tax(100)
result を出力する

呼び出し側add_tax(100)は、関数の動作が終わると整数型の戻り値データになる。 それを受け取る形でresultへの代入を行っている。


6. 複数引数・戻り値あり

特徴と注意点
関数定義例
〇 整数型: triangle_area(整数型: base, 整数型: height)
    整数型: area ← base × height ÷ 2
    return area

関数triangle_areaは、底辺と高さを受け取り、三角形の面積を計算して返す。

呼び出し例
整数型: area ← triangle_area(5, 4)
area を出力する

渡すデータの型と個数を関数定義と一致させる必要がある。 ここでは整数型データが2つ。

呼び出し時の順番通りに仮引数へ渡される。

triangle_area(5, 4) という呼び出し方をしているので、 変数baseには5 変数heightには4 が代入されて関数が動く。

triangle_area(4, 5) という呼び出し方をしたらbaseには4、heightには5が代入される。


理解度チェック問題

問題1:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 greet()
    "Hello!" を出力する

greet()
greet()
正解と解説 正解:**イ** 2回呼び出しているため、2回出力される。

問題2:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 print_double(整数型: x)
    ( x × 2 ) を出力する

print_double(4)
正解と解説 正解:**ウ** 4 × 2 = 8 なので「8」と出力される。

問題3:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 整数型: get_fixed()
    整数型: ret ← 5
    return ret

整数型: val ← get_fixed()
val を出力する
正解と解説 正解:**イ** 5を返す関数なので「5」と出力される。

問題4:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 整数型: add_tax(整数型: price)
    整数型: tax ← price × 11 ÷ 10
    return tax

整数型: result ← add_tax(100)
result を出力する
正解と解説 正解:**イ** 100 × 11 ÷ 10 = 110 なので「110」と出力される。

問題5:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 整数型: triangle_area(整数型: base, 整数型: height)
    整数型: area ← base × height ÷ 2
    return area

整数型: area ← triangle_area(6, 4)
area を出力する
正解と解説 正解:**イ** 6 × 4 ÷ 2 = 12 なので「12」と出力される。

問題6:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 整数型: rectangle_area(整数型: length, 整数型: width)
    整数型: area ← length × width
    return area

整数型: area ← rectangle_area(5, 3)
area を出力する
正解と解説 正解:**ア** 5 × 3 = 15 なので「15」と出力される。

問題7:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 整数型: calculate_bonus(整数型: salary, 整数型: rate)
    整数型: bonus ← salary × rate ÷ 100
    return bonus

整数型: bonus ← calculate_bonus(200, 5)
bonus を出力する
正解と解説 正解:**エ** 200 × 5 ÷ 100 = 10 ではなく「10」ですが、選択肢がおかしければ後で修正。

問題8:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 整数型: perimeter(整数型: length, 整数型: width)
    整数型: peri ← ( length + width ) × 2
    return peri

整数型: peri ← perimeter(7, 3)
peri を出力する
正解と解説 正解:**ウ** (7 + 3) × 2 = 20 なので「20」と出力される。

ペリメーター(英:perimeter):境界


問題9:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 実数型: calc_circle_area(実数型: radius)
    実数型: area ← radius × radius × 3.14
    return area

実数型: result ← calc_circle_area(2.0)
result を出力する
正解と解説 正解:**イ** 2.0 × 2.0 × 3.14 = 12.56 なので「12.56」と出力される。

問題10:次のコードを実行した結果として正しいものを1つ選びなさい。
〇 実数型: calc_price(整数型: price, 実数型: rate)
    実数型: discounted ← price × (1.0 - rate)
    return discounted


実数型: result1 ← calc_price(100, 0.1)
実数型: result2 ← calc_price(200, 0.25)

result1 を出力する
result2 を出力する
正解と解説 正解:**ア** 1回目:100 × (1.0 - 0.1) = 90.0 2回目:200 × (1.0 - 0.25) = 150.0