第5講 関数(1)
第6話 戻り値
今まで扱ってきた関数(社員)は、命じられた仕事をするだけで、
結果を命令者に報告しませんでしたが、
結果を報告する社員もあります。
結果を報告するを正確に表現すると、
値を返す−−−になります。
例えば、1から100までの和を調べて報告しなさいと、
命じられて和5050を報告する社員が考えられます。
くどいようですが、比輸でなく正確に表現すると、
値5050を返す関数です。
この返す値を戻り値といいます。
ここでも事例を示しましょう。
#include<stdio.h> //prinf()を使えるようにするためにインクルード
int f(int x); //結果を報告する社員を採用
int main() {
int x=3; //整数型変数xの宣言と3への初期化
printf("%dの2倍は%dです。\n",x,f(x));
return(0);
}
int f(int x){
return(2*x); //xを2倍にして戻す
}
実行画面
3の2倍は6です。
どうして戻り値といい、そしてどこに返しているかと申しますと、
の図をご覧になればわかります。
戻す値だから戻り値ですし、
戻す場所は図のf(x)です。
さて、なぜ関数というのでしょうか。
コードを次のように書き換えて下さい。
#include<stdio.h> //prinf()を使えるようにするためにインクルード
int f(int x); //結果を報告する社員を採用
int main() {
int x=3,y; //整数型変数xの宣言と3への初期化、整数型変数yの宣言
y=f(x);
printf("%dの2倍は%dです。\n",x,y);
return(0);
}
int f(int x){
return(2*x); //xを2倍にして戻す
}
実行結果はまったく同じです。
コードを書き換えた意図は、
y=f(x);
にあります。
高校の数学で学びましたよね。
これが関数ですね。
関数とは、左の入り口から値を入れると加工されて別の値となり、
出てくるものです。
私の実家は、温泉まんじゅうを製造販売していましたが、
その製造機械は原料を入れると加工して、おまんじゅうを出してくれるものでした。
つまり、入り口から原料を入れると、
出口からはおまんじゅうが出てきました。
関数とはおまんじゅう製造機械のようなものです。
値を加工して別の値を出してくれる機械が関数だとイメージすれば良いのです。
今回のコード
#include<stdio.h> //prinf()を使えるようにするためにインクルード
int f(int x); //結果を報告する社員を採用
int main() {
int x=3,y; //整数型変数xの宣言と3への初期化、整数型変数yの宣言
y=f(x);
printf("%dの2倍は%dです。\n",x,y);
return(0);
}
int f(int x){
return(2*x); //xを2倍にして戻す
}
だと、入り口から3を入れると2倍に加工され、6となって出てきます。
その加工工場こそ
int f(int x){
return(2*x); //xを2倍にして戻す
}
なのです。
尚、
#include<stdio.h> //prinf()を使えるようにするためにインクルード
int f(int x); //結果を報告する社員を採用
int main() {
int x=3; //整数型変数xの宣言と3への初期化
printf("%dの2倍は%dです。\n",x,f(x));
return(0);
}
int f(int x){
return(2*x); //xを2倍にして戻す
}
は、ピンクの部分を削り、青の部分の下のように変更して、
#include<stdio.h> //prinf()を使えるようにするためにインクルード
int f(int x); //結果を報告する社員を採用
int main() {
printf("%dの2倍は%dです。\n",3,f(3));
return(0);
}
int f(int x){
return(2*x); //xを2倍にして戻す
}
としても同じです。
printf("%dの2倍は%dです。\n",x,f(x));
のxは箱そのものではなく箱の中身である値3でしたね。
変数そのものか変数の参照(変数に入っている値)はちゃんと区別して下さい。
後でもう一度詳しく触れますが、引数で渡しているものは、
変数そのもの(箱そのもの)ではなくて、
あくまで、変数に入っている値(箱に入っている値)であることに注意して下さい。
箱そのものは原則として渡せません。
(原則としてという言葉に留意して下さい。
実は、C言語には箱そのものは渡せないのに、
箱を他の社員に使わせるという摩訶不思議な方法が用意されています。)
この世の中は関数で出来ていると言っても過言でないと申し上げたことがあります。
生物もインプットとアウトプットでできています。
単細胞生物も外界から栄養を吸収して、
不要物を排出します。
O157等の細菌の場合、その排出したものが人間にとっては毒物ですから、
問題になるわけですが、
生物の連鎖って結局は、インプットとアウトプットですね。
会社も同じです。
原材料を購入して、加工して製品として売り出す。
入り口と出口です。
資本を投入すると、
より多くの資本となって帰ってくるから営利企業が成立するわけです。
これもインプットとアウトプットです。
数学の関数という考え方は、
分析哲学の物事は関数関係で出来ているというアイデアの先取りだったわけです。
仕事の単位=細胞をC言語では関数といいます。
でも、値を返さないvoid型もどうして関数というのでしょうか。
値を返さないとしても、仕事をするということ自体が、
命令に対する回答ですね。
仕事をすること自体が仕事を命じた人への見返りだと考えれば、
void型の仕事をする塊のことを、
関数と呼んで良いことになります。
それで、プログラムを構成する単位=細胞=部品(パーツ)のことをC言語では、
関数と呼ぶのです。
では、問題を出して第6話を終了します。
第5話の解答例
B引数を初項・交差・末項にして等差数列の和を計算。ただし、引数の各値はmain()においてキーボード上から取得。
#include<stdio.h> //prinf()を使えるようにするためにインクルード
void f(int s,int k,int m); //s:初項 k:交差 m:末項
int main() {
int s,k,m;
printf("キーボーから初項、交差、末項を順に入力して下さい。\n");
printf("初項=");
scanf("%d",&s);
printf("交差=");
scanf("%d",&k);
printf("末項=");
scanf("%d",&m);
f(s,k,m); //社員f()に仕事を命じている
}
void f(int s,int k,int m){
int i,w=0;
for(i=s;i<=m;i+=k)w+=i;
printf("初項%d,交差%d,末項%dの等差数列の和=%d\n",s,k,m,w);
}
の関数f()を戻り値を持つタイプに変更して、同じ実行結果になるプログラムを考えて下さい。
ただし、コンソール画面への表示の仕事はmain()が担当するものとします。