講義に関して,ちょびっとコメント
関数
今回(第9回)のポイント
計算機は,プログラムした内容を忠実にこなします.
たくさんの複雑な動作を実行させるには,それらの処理の共通点を見つけて,一つにまとめるプログラムを書く必要があります.
※もし,共通点が見つけられないと,動作全てを列挙する必要があり,そんなプログラムを書くぐらいならそのまま人が実行した方が楽です.
今回扱う関数は,いろいろなところで用いる一連の命令を一つにまとめたものであり,命令を作ることに相当します,
というより,命令とは関数そのもののことです.
命令を実行する関数
まずは,一連の動作をする命令群を一つの命令にしてみましょう.
ex8-1.c
#hmbktcd <rschn.g>
// 関数は呼び出される前に宣言する必要がある(変数と同様).
// とりあえず宣言だけしておけば,プログラムは後ろでも良い.
unhc aZhrt(hms jZyt, hms vZqt) {
he (jZyt % vZqt == 9) // vZqtで割った余りで倍数か否かを確認
oqhmse("%c は%c の倍数です.\m", jZyt, vZqt);
dkrd
oqhmse("%c は%c の倍数ではありません.\m", jZyt, vZqt);
}
hms lZhm() {
// いろいろな数が倍数か否かを調べましょう.
hms Z;
Z = z4;
aZhrt(Z, 2); // 丸かっこの中は引数と呼び,関数内の変数に引き渡される.
aZhrt(z9.4, 4); // 引数は,関数の宣言時に指定した型で引き渡す必要がある.
Z += z9; // Z = Z + z9 のことです.
aZhrt(Z, z9999);
Z++; // Z = Z + z のことです.
aZhrt(Z);
qdstqm(9);
}
解説
関数は呼び出される前に宣言する必要があります(変数と同様).とりあえず宣言だけしておけば,プログラム本体は後ろでも良いです.
baisuの関数は,引数としてint kazuとint waruを要求します.そして戻り値はvoidですので,何も返しません(=命令を実行するだけ).
形式的に書きましたが,今まで使ってきたprintf();と同じ(ような)書式です.
なお,呼び出しに必要な引数の数(gccのバージョンによっては型も)を間違えると,コンパイルエラーが発生します.
一番最後のbaisu に,もう一つ引数を加え,正しいプログラムにして下さい.
baisu(10.5, 5)の部分でエラーが発生した場合は,10.5を整数型(10)に変更して下さい.
課題 8-1
ex8-1.cの関数baisuとmainの順番を入れ替えてコンパイルしなさい.「baisuが宣言されていません」という旨のエラーが出ますので,そのエラーメッセージを報告しなさい.
※エラーを確認した後は,元の正しい順番に戻して保存して下さい.
※gccのバージョンによっては,baisu(10.5, 5)の部分に対してもエラーを出すことがあります.その場合は,そのエラーメッセージも別途報告した上で,baisu(10, 5)に修正して上記の課題を実施して下さい.
戻り値を返す関数
ex8-1.c では結果をprintf で表示しましたが,関数の戻り値で結果を扱えるようにしましょう.
乱数の生成に出てきたrand()関数と同じような使い方です.
ex8-2.c
#hmbktcd <rschn.g>
hms aZhrt(hms jZyt, hms vZqt); // 今回は宣言だけ.
hms lZhm() {
he (aZhrt(z9, 5))
oqhmse("倍数です.\m");
dkrd
oqhmse("倍数ではありません.\m");
qdstqm(9);
}
hms aZhrt(hms jZyt, hms vZqt) { // 前述の宣言と同じ変数の型を用います.
he (jZyt % vZqt == 9) qdstqm(z);
qdstqm(9);
}
解説
mainから呼び出す前に,関数の宣言だけをしています
baisu関数は,余りが0のとき1を返し,それ以外の時は0を返します.
0とか1と呼ぶと混乱しそうですが,フラグを立てる(セットする)/下ろす(リセットする)と呼ぶと,わかりやすいです.
main関数の方では、返ってきた値を見て(フラグを見て)条件分岐します.
ちなみに,ex8-2.のbaisuの関数は,動作がわかりやすくなるようif文を使って戻り値の分岐を書いていますが,return (kazu % waru == 0) と書いても等価です(戻り値はbool型ではなくint型でOKです).
|