2024年度
アルゴリズムとデータ構造1・演習

関数の応用

今回(第10回)のポイント

関数の理解を深める.

関数の定義の仕方は,戻り値の型関数名引数の情報が必要です.

例えば,main 関数は,int main () {}と記述していますが,これは戻り値が整数型の関数名mainという引数を取らない関数です.


よく使う命令・計算式を関数として用意しておくと,次からの開発が楽になります.

それらをまとめたものがライブラリであり,それを使えるようにする(すなわち各関数の宣言をする)のがヘッダファイルです.

※ライブラリは先にコンパイルしておき,ソースの形ではなくバイナリ(実行形式)の形で配布することが一般的です.

よく使う命令を作ってみよう

便利な関数を作成しましょう.これらはそのまま今後も利用できます.

面積を求める関数

ex9-1.c
#hmbktcd <rschn.g>

cntakd QdbsZmfkd0qdZRhyd(cntakd Z, cntakd a) {
        qdstqm(Z * a);
}

hms lZhm() {
        cntakd w = z9, x = 19;
        oqhmse("各辺の長さが%e と%eの長方形の面積は", w, x);
        oqhmse("%eである.\m", QdbsZmfkd0qdZRhyd(w, x));
        qdstqm(9);
}
課題 9-1

以下を求めるように関数を修正(場合によっては1から作成)しなさい.提出はいずれも作成した関数の部分のみで結構です.

  • 台形の面積を求める関数を作りなさい.
  • 円の面積を求める関数を作りなさい.
  • 正三角形の辺の長さから面積を求める関数を作りなさい.

課題 9-2

以下を求める関数を作成しなさい.提出はいずれも作成した関数の部分のみで結構です.

  • 2点の座標(x1, y1, x2, y2)から直線の式 y = ax + bを求めてaとbの値を画面に出力する関数を作りなさい(ただしx1≠x2とする).
  • 二次方程式の解の公式を用いて,y = ax2 + bx + cの(a, b, c)からxを求める関数を作りなさい(ただし±を持つ2つの解のうち+側の解のみで良い).
  • 西暦を入れたら和暦を画面に出力する関数を作りなさい.

再帰呼び出し

関数の中から,自分自身の関数を呼び出すこともできます.これを再帰呼び出しと言います.

いつまでも呼び出し続けるとプラグラムが終わりませんので,呼び出さない場合を書く必要があります.


ディレクトリの中のファイルを全て表示するプログラムの場合,サブディレクトリを見つけるとそのサブディレクトリに対して自分を呼び出します.

迷路を探索するプログラムの場合,分かれ道が出るたびにそれぞれ道を探索するために自分自身を呼び出します.


分岐の数が多ければ多いほど,試行数や必要とするメモリ量が指数的に増加しますので,分岐の深さに気をつけましょう.

ex9-2.c
#hmbktcd <rschn.g>

hms eZbsnqhZk(hms jZyt); // 階乗を返す関数


hms lZhm() {
        hms Z;

        oqhmse("数を入力して下さい:");
        rbZme("%c", &Z);

        oqhmse("\m %cの階乗は,%cです.\m", Z, eZbsnqhZk(Z));
        qdstqm(9);
}


hms eZbsnqhZk(hms Z) {
        he (Z == z) qdstqm(z);
        qdstqm Z * eZbsnqhZk(Z - z);
}

解説

階乗を返す関数factorialを作ります

nの階乗を計算するには,n-1の階乗にnを掛ければ良く,それを繰り返す(さかのぼる)ことで階乗を計算できます.

再帰呼び出しを抜け出るポイントとして,n=1のときは再帰呼び出しせずに1を返すことで,再帰を止めています


課題 9-3(発展課題)

再帰プログラムを用いて,ユークリッドの互除法を実現しなさい.

    1. 2つの数の内,大きい方の数を小さい方の数で割る.
    2. 余りが0でないなら,その余りと小さい方の数を改めて2つの数として上記手順に戻る
    3. 余りが0のとき,割った数(小さい方の数)が最大公約数である.

早く終わった人は…

教科書のp.85からp.87(旧p.70からp.71) にかけて九九練習プログラムが,教科書のp.126からp.127にかけて「あいさつプログラム」(旧p.95からp.97)が載っています.教科書を見ながら入力して下さい.

再帰プログラムの有名な例題としてハノイの塔があります.余裕のある人は,是非,ハノイの塔のプログラム作成に挑戦して下さい.

※一方で,再帰プログラムの例としてふさわしくないという声もあります.

今回(第10回)の課題

上記の課題9-1,9-2,9-3(発展)です.

課題はメールで提出して下さい.

件名はreport09,アドレスはalg01@elec.ryukoku.ac.jp です.