プログラム内の自作関数の使われ方が難しいと思ったら、自作関数を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関数内に戻して考えてみたら
ああっ こんなに簡単なプログラムだったんだっ😝
おおうぅぅ
ておもうときがあります。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます