プログラム内の自作関数の使われ方が難しいと思ったら、自作関数をmain関数内に戻して考えてみましょう。

ソーラー 「さて 今までのエピソードでは


if()文内の条件式の変数aに


数値0,1を代入することによって 好きな方の文章を表示することができる


自作関数SelectSentense1を作製,使用してきました。


自作関数SelectSentense1の使用例は以下のようになります。


#include <stdio.h>


void SelectSentense1 (int a,int b){

if(a==0)printf("%dは2の倍数です\n",b);

if(a==1)printf("%dは2の倍数ではありません\n",b);

return;

}


int main(void){

SelectSentense1 (1,3);

return 0;

}


コンパイル結果

3は2の倍数ではありません


アレサ「はいっ😊


このSelectSentense1 (1,3);の仕組み が分かりにくいという方は


自作関数SelectSentense1 (int a,int b);


の部分を


自作関数の定義に照らし合わせて

int a;

int b;

if(a==0)printf("%dは2の倍数です\n",b);

if(a==1)printf("%dは2の倍数ではありません\n",b);


としてmain関数内に戻し


int a=1;

int b=3;


と数値を代入すれば理解しやすくなると思われますの。


そのプログラムは次のようになります。。。


#include <stdio.h>


int main(void){

int a=1;

int b=3;

if(a==0)printf("%dは2の倍数です\n",b);

if(a==1)printf("%dは2の倍数ではありません\n",b);

return 0;

}


コンパイル結果

3は2の倍数ではありません






🐦  🐦ちょっと注目


厳密にはこのプログラムと元のプログラムは等しくありません

なぜなら

int a;

int b;

は元のプログラムでは自作関数内で定義されており


今のプログラムでは

int a;

int b;

main関数内で定義されています


このように

int a;

int b;

をmain関数内で定義してしまうと


int a;

int b;


に他のmain関数内で定義された変数cを代入すると


自作関数内で定義された


int a;

int b;


に他のmain関数内で定義された変数cを代入したときのように


値渡しにならず


プログラムによっては


変数cに格納されている値が変更される場合がでてくるのでは


とおもわれるかもしれません


ですが そのようなことはおこりません


変数aや変数bに


1の値をもつ変数cを


a=c;

b=c;


と代入しても


変数cに格納されている値1は変化しません


ですので


このように


自作関数

SelectSentense1 (1,3);


の部分を

int a=1;

int b=3;

if(a==0)printf("%dは2の倍数です\n",b);

if(a==1)printf("%dは2の倍数ではありません\n",b);


変更してかきかえても問題はおこりません。



このプログラムの場合では


main関数内で定義された


int a;

int b;



変数cを代入するのでなく


int a=1;

int b=3;


と数値を代入するだけなので


もともと


変数cに格納されている値が変更されるというような


そのような問題がでてくることはありません。


このように自作関数内で定義された変数a,bを


main関数内で定義された変数a,bとしても


特に問題はおこりません。



ソーラー「えへへ~😊みんな~これだけでは意味が分かりにくいよね


では実際に具体例を示してみますよ~~


自作関数を使ったプログラムが次のように表されているとします」


#include <stdio.h>


void MAPPY (int a){

a=a+5;

printf("%d\n",a);

return;

}


int main(void){

int b=1;

MAPPY (b);

printf("%d\n",b);

return 0;

}


コンパイル結果

6

1


ソーラー「コンパイル結果にご注目下さい


このプログラムでMAPPY (b);



自作関数内で定義された変数aに


main関数内で定義された変数bを代入することにより


数値1のみが変数aに渡されています


値渡しがおこなわれているのですね。


ですので


printf("%d\n",b);


の実行結果は

1となっています


変数bに格納されている値は


1のまま変化していません


ここで

MAPPY (b);

表記されている部分を自作関数の定義と照らし合わせて


int a;

a=b;

a=a+5;

printf("%d\n",a);

とかきかえてみます


すると😊


プログラムは次のようになります


#include <stdio.h>


int main(void){

int b=1;

int a;

a=b;

a=a+5;

printf("%d\n",a);

printf("%d\n",b);

return 0;

}


ソーラー「みんな ここまではいいかな~」


アレサ「ソーラーさん、😊 楽しそうですね。」


では~このプログラムをコンパイルすると


#include <stdio.h>


int main(void){

int b=1;

int a;

a=b;

a=a+5;

printf("%d\n",a);

printf("%d\n",b);

return 0;

}


コンパイル結果

6

1


ソーラー「自作関数内で定義されていた変数aを


main関数内で定義しなおしても


コンパイル結果が


6

1


のまま変化していません


つまり


main関数内でaを定義しなおして


a=b;


と変数aにmain関数内で定義された変数b


を代入しても


変数bに格納されている値は1のまま変化していません


結局は


変数aに変数bの持っている値1だけを値渡している構造に変化はおこらず


元の自作関数を使ったプログラムと


自作関数の部分を書き換えたプログラムは


等しくなるんです


やったね。安心だね。」


アレサ「やったですの😊」


🐦  🐦




さきほどの続き




こうして 自作関数をmain関数内に取り込んだプログラムを観察すると


int a=1;より


if(a==1)の側の命令文


printf("%dは2の倍数ではありません\n",b);


が選択実行されるのがわかります。


int b=3;より


3は2の倍数ではありません


が コンパイル結果に表示されます、ね。


いかがですの?


もともと 自作関数を使用するのは


何回も出てくる関数や表現を簡略化して表現するためにあるのですの。


自作関数SelectSentense1(1,3);


の表現もそうです。


ですから 


絶対に自作関数をつかわなければならないということはないのです。


無理に 自作関数を使用されることはありませんの。


もし、他の方がつくられたプログラムで


自作関数が複雑な使われ方をしていると 思われたなら


自作関数が表記されている部分を


main関数内ににもどして考えれば 大変理解しやすくなります。


ほとんどの場合 自作関数が表記されている部分は


簡単な命令文の集まりに置き換えられることに気付かれるとおもいますの


この方法は実はプログラムの理解に大変有効な方法となっています。


ソーラーさん、どうおもわれますか?」


ソーラー「えっ 僕かい?


いや~ そんなに みつめられると 照れちゃうな


はははははは😊ははは😊


僕もアレサの言う通りだとおもうよ~~~\(^o^)/。


たとえば


見たことのない


自作関数WellDisplay(1,2,300,4,1,11,1)

自作関数SumExell(7,7,1)などを


みるだけで 理解しようとすると 結構難しいんだけど


これを main関数内に戻してみると


実に簡単に理解できるプログラムになる場合がおおいんだな。


アレサも言ってたように


自作関数は プログラムを短く簡単に表記するために使われる


という面があるから、


表記は短く簡単になっても


プログラムを理解するのが難しくなっている場合が


あるよね。


でも、実際は 簡単なプログラムの集まりなので   」


main関数内に戻して考えてみたら


ああっ こんなに簡単なプログラムだったんだっ😝


おおうぅぅ


ておもうときがあります。」





  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます