第21章 関数


今まで、暗黙のうちに自作関数を作っていました。 この章では、この「関数」について少し追加の解説をします。 いきなりですが、下のソース・プログラムを見てください。 金額と、消費税率を入力すると税込みの金額を 表示するプログラムです。ここで、入力する 金額や、消費税率(%)はすべてint型に収まるものとし、 計算結果もint型になるものとします。(要するに、あまり 高いものを買わないということ?)
消費税の計算は、keisan()という関数を作って ここで計算させています。ところがこれではうまくいきません。

main関数内で、自作の関数keisan()を呼んでいます。この時、 keisan関数のカッコの中に、引数が書かれていますが この場合、各引数には実際の値を持っていなくてはいけません。 これを、実引数(argument)と いいます。kingakuやzeiritsuは、すでに値を持っていますが、 nedanは宣言しているだけで、実際の値を持っていません。 (と、いうか何が入っているかわからない)

では、この間違ったプログラムをコンパイルしてみましょう。

わざわざ、間違ったプログラムを作ってどーする!?

はい。何事も経験が大事です。

あー、やっぱり注意されました。 スペースの関係でWINDOWを小さくしていますが、 warning C4700:のあとには、 値が割り当てられていないローカルな変数 'nedan' に 対して参照が行われました。 と、おかしな所を指摘されています。 でも、warningだけで、エラーにはなっていないので EXEファイルは作られています。(オプションでWarnings as Errors をチェックしていない場合。)

あー、やっぱりこのプログラムはおかしいや!

千円のものを買って、消費税3%つけて何で 8731円にもなるのだ!

では、このプログラムを正しく直してみましょう。 やり方は、いろいろあります。 ここでは、せっかく自作関数を作ったので これを生かした方法を考えましょう。

(1)宣言しただけの変数nedanをkeisanに渡したのがいけない。  これを渡さず、関数の戻り値として計算結果をもらう。 (2)nedanのアドレスをkeisanに渡す (3)nedanをどこからでも見えるようにしておく。(グローバル変数)

などの対策が考えられます。ほかにもいろいろ対策はあるでしょう。 まずは、(1)の対策を講じてみましょう。これは簡単ですね。 それと、int型の数値をint型の数値でわり算すると 必ずしもint型にならないですね。

こーいう場合どうすればいいの?

全部floatか、double型にしてしまいましょう。 ただし、Cの場合

(1)A = B; の時Bがどのような型であってもAの型に変換される (2)二項演算子(+−*/など)で2つの型が異なるとき、   より大きな型に合わせられる   char < int < long < float < double

という規則があります。 従って、
c = a * (1 + b / 100);
というものを考えてみると、 右辺が、いかなるものであっても、結果としては、 cの型になってしまいます。また、右辺の中身を見てみると bがint型であればカッコ全体もint型と言えます。 従って、カッコの中はbが100以上でないと常に1になってしまいます。

左のプログラムを実際に動かしてみましょう。 金額に0を入力するまで繰り返します。

「%-6.0f」という書き方を覚えましょう。

今度は、きちんと動作しますね。消費税が5%になると 2000円のものが、2100円になるんですね・・・・・

では、次の方法(nedanのアドレスをkeisanに渡す) で、プログラムを書き直してみましょう。

前のプログラムとの違いがわかりますか? 今度のプログラムでは、keisan()の戻り値は 利用していません。一応、keisan関数は、0を 返していますが、何を返しても関係ありません。 void型にしてしまっても問題ありません。

「&」や「*」の使い方に気をつけてください。

実行結果は、上のものと全く同じです。

では、最後の方法nedanをグローバル変数にしてしまいましょう。 グローバル変数とは、どこからでも見ることのできる 変数です。詳しくは、あとから「変数のスコープ」という章 で説明します。

3つのプログラムを比較してみてください。 同じことをプログラムするにも、いろいろな方法が あるものです。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Nov/11/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。