自作関数がどのように機能するか解りにくいときは自作関数の定義部分をmain関数内に戻して記述して理解してみましょう

ソーラー「アレサ、自作関数が使われている


この

👇

プログラムを みて、みて(´▽`*)


これなんかどうかな? 難しそうにみえない?😊 」


#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;

}


void SelectSentense2 (int b){

if(b%2==0) SelectSentense1 (0, b);

else SelectSentense1 (1, b);

return;

}


int main(void){

int c;

scanf("%d",&c);

SelectSentense2 (c);

return 0;

}


このプログラムが どのような構造になっているか

何がしたいのか(´▽`*)

じっくり ご堪能ください。💖

                  solarplexussより



ソーラー「なにこれ、いいな、なにやってるのか、さっぱりわからないよ


(´▽`*)」



アレサ「ソーラーさん、嬉しそう?・・・ですの・・・


おそらく みなさん 


このプログラムは このままでは 理解しにくいとおもわれますの。」


ソーラー「 ね、そう おもう?おもう? アレサ


そこで


このプログラムの構造がどのようになっているか


一緒に考察してみようじゃないか」


アレサ「それは いいアイデアだとおもいますの(#^.^#)


それでは


実際に 自作関数が使われた


このプログラムの 


自作関数の定義をmain関数内に戻して記述して理解してみます。


まず


自作関数SelectSentense2の定義をmain関数内に戻して記述してみましょう。


つまり

main関数内で記述された


自作関数SelectSentense2 (c);


を自作関数SelectSentense2の定義に沿ってかきかえてみたいと思います。




SelectSentense2 (c);

int b;

b=c;

if(b%2==0) SelectSentense1 (0, b);

else SelectSentense1 (1, b);



main関数内で記述することができます。



SelectSentense2 (c);



自作関数SelectSentense2の引数であるint bに 


main関数内で定義された変数c


が代入されているのですね。


今のプログラムは


自作関数SelectSentense2の定義を消して


次のプログラムのように書き換えることができます。


#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){

int c;

scanf("%d",&c);

int b;

b=c;

if(b%2==0) SelectSentense1 (0, b);

else SelectSentense1 (1, b);

/*変数bを

main関数内で定義して

b=c;

おこなっても

自作関数SelectSentense1内で定義された変数bに変数cが代入

されたときと同じく

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

つまり

変数cから変数bへの値渡しが行われている構造に変化はありません。

*/

return 0;

}


このプログラムの記述はすこし長いとおもわれます。


もうすこし


プログラムが等しくなるのを意識しながら短く変形すると



#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){

int c;

scanf("%d",&c);

if(c%2==0) SelectSentense1 (0, c);

else SelectSentense1 (1, c);


return 0;

}


となります


このプログラムが どのような構造になっているか

じっくり ご堪能ください。💖💖

                  solarplexussより




ソーラー「アレサ、この


SelectSentense1 (0, c);

SelectSentense1 (1, c);


の表現 beautifulだと おもわないかい?


これ 初めて見たら


なんのことか さっぱり理解できないとおもうな。😊」


アレサ 「このSelectSentense1 (0, c);


とは


自作関数SelectSentense1の定義をご覧になれば


お分かりになるのですが


SelectSentense1(int a,int b)の引数である int aに


         🍎最初から0を代入することによって🍎


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

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


の 2つの命令文のうち


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


の命令文が選択されるようになっているのですの。


この場合

SelectSentense1(int a,int b)の引数である変数bには 


変数cが代入されているので


SelectSentense1 (0, c);

が実行されるということは


printf("%dは2の倍数です\n",c);


が実行されることと等しくなりますの


同様に


SelectSentense1 (1, c);


これも 自作関数SelectSentense1の定義をご覧になれば


お分かりになるのですが


SelectSentense1(int a,int b)の引数である int aに


         🍊最初から1を代入することによって🍊


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

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


の 2つの命令文のうち


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


の命令文が選択されるようになっているのですの。


この場合SelectSentense1(int a,int b)の引数である変数bには 


変数cが代入されているので


SelectSentense1 (1, c);


が実行されるということは


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


が実行されることと等しくなりますの


SelectSentense1(int a,int b)の引数である変数int aに


数値を代入して


好きな文章を 表示できるのが


自作関数SelectSentense1

の特徴ですね。」



ソーラー「自作関数SelectSentense2の定義を


main関数内に戻して記述してみたけど・・・


まだまだ


このプログラム 理解しにくいなぁ。」


アレサ「はいっ


そこで


さらに このプログラムの


if(c%2==0) SelectSentense1 (0, c);

else SelectSentense1 (1, c);


の部分を

自作関数SelectSentense1の定義に沿って書き換えてみます


SelectSentense1 (0, c);

printf("%dは2の倍数です\n",c);


SelectSentense1 (1, c);

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


と表すことができましたね。


すると プログラムは次のようにかきかえられます。

#include <stdio.h>


int main(void){

int c;

scanf("%d",&c)


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

else if

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

return 0;

}


このプログラムが どのような構造になっているか

じっくり ご堪能ください。💖💖💖

                  solarplexussより


この1連のプログラムの流れで


自作関数内で定義された変数bを

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


b=c;



main関数内で定義された変数cを

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

代入する箇所がありました。


このとき

当然ながら

変数cに格納されている値に変化はおきません。


つまり


main関数内で定義された変数cを


自作関数内で定義された変数bに値渡しをおこなっているのと


同じ


main関数内で定義された変数cに格納された数値だけを


自作関数内で定義された変数bに代入している


状態になっているのがわかります


つまり


自作関数の定義をmain関数内に戻して記述しても


プログラムに変化はおきないというわけなのです。」



ソーラー「おおっ こ、これは・・・ 


もともとのプログラムが

👇

#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;

}


void SelectSentense2 (int b){

if(b%2==0) SelectSentense1 (0, b);

else SelectSentense1 (1, b);

return;

}


int main(void){

int c;

scanf("%d",&c);

SelectSentense2 (c);

return 0;

}


👇こんなに簡単になっちゃった・・・

#include <stdio.h>


int main(void){

int c;

scanf("%d",&c)


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

else if

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

return 0;

}


ソーラー「c%2は


cを2で割ったときの余りの数をあらわしているから


c%2は


cが2で割りきれたとき0の値を

cが2で割りきれないとき1の値を


もつことになるんだよね(^_^)/


それを利用して


if文の条件式に

if(c%2==0) と

c%2を用いることによって


cが2の倍数のときは


printf("%dは2の倍数です\n",c);


そうでないときは


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


が実行されるようにプログラムがつくられているわけなんだ。



つまり


このプログラムは


ユーザーに数値を代入してもらった数値が


2の倍数かどうかを表示するプログラムだったというわけなんだ。


アレサっ 自作関数の定義を


main関数内に戻して記述して理解しやすくなったね。」


アレサ「はいっ


自作関数の定義を


main関数内に戻して記述してみると理解しやすくなるという


プログラムのよい例だったと思いますの😊」

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

作者を応援しよう!

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

応援したユーザー

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