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