そういえばこのエド君のカットインが近いうちに実装されるらしい。本家KRでは実装された。
エド君「今回はif文というのをやる。今までのプログラムは一本の線で繋がってるようなないようだったが今回のは分岐要素を入れてより複雑にしていくぞ。」
全部1つで済ませれたら楽なのにな。
エド君「人生も選択の連続だろうが。」
まあ確かにそうだ。エド君の2次職の分岐もあるもんな。
あ、そうかそういう分岐をプログラムに起こすときに使うって事か。
エド君「まあたとえ方が極端だが…そんなもんだ。」
エド君「まずは簡単な分岐からだ。入力された数字が奇数か偶数かを判定するプログラムを作るぞ。if文の作り方だが例えば…」
if(x>2)
エド君「こんな風にifの後の括弧に条件を入れてその条件に合う場合の行動を下に書いていく。違う条件の時にはelse ifやelseで分岐させる。大体はこんな感じだ。例とし…」
#include<stdio.h>
int main(void) {
int x;
printf("エド君「数字を入力しろ。」");
scanf("%d", &x);
if (x % 2)
printf("エド君「その数は奇数だ。」");
else
printf("エド君「その数は偶数だ。」");
return 0;
}
エド君「ここに書いてたはずのやつがなんか変な感じにされてるな…」
やっぱエド君にしゃべらせるのが一番かなと思いまして。
エド君とのやりとりって感じにしたくて。
エド君「まあいいが…今回の場合だと奇数の判定のためにxを2で割った余りが1になるなら奇数、そうでないなら偶数という分岐をさせている。」
このx%2ってどういう判定してるんだ?
エド君「簡単に言えば余りが0じゃないとき…まあ余りが出るときという判定だな。」
エド君「次は演算子の話をするか。」
演算子?
エド君「大なり小なりとかの話だ。さっきの例でつかったやつだがちょっと複雑なやつもあるからな。とりあえず一覧として載せておく。」
エド君「まあ大体はこんな感じだ。a?b:cがちょっとややこしいかもしれねぇな。」
なるほど。
エド君「極論言っちまうとifで分岐させちまえばできるんだが…まあ覚えといて損はねぇ。ANDやORを使えば何月かを入れて季節を表示するようなプログラムも作れるぞ。」
if(month>=3&&month<=5)
printf("春です");
エド君「こんな感じのを季節分作っていけばまあできる。」
3~5月の判定になるのか。
エド君「この場合冬だけがちょっと厄介だけどな。」
else if(month==1||month==2||month==12)
エド君「こんな感じでORを2回使う感じになる。」
数字が飛ぶからか…
エド君「さてもう一つ分岐系の文を紹介しておくか。次はswitch文だ。if文に比べて多くの分岐がしやすいのが特徴だな。例えばだが任意の数で割った余りを出すプログラムを作ろうとする。まあ3あたりで良いか。if文だとどう作る?」
そうだな…
#include<stdio.h>
int main(void) {
int x;
printf("エド君「数字を入力しろ。」");
scanf("%d", &x);
if (x % 3==0)
printf("エド君「その数は3で割りきれる数だ。」");
else if(x%3==1)
printf("エド君「その数は3で割ると1余りが出る数だ。」");
else
printf("エド君「その数は3で割ると2余りが出る数だ。」");
return 0;
}
こんな感じか?
エド君「これを見てなにか思ったことはないか?」
いや別に…
エド君「そうか…実はこの内容だと無駄なところが出てくるんだが…同じ演算を2回してるだろ?」
あー…でも他に方法なくね?
エド君「そのためにswitch文があるんだよ。今のやつを書き換えると…」
#include<stdio.h>
int main(void) {
int x;
printf("エド君「数字を入力しろ。」");
scanf("%d", &x);
switch (x%3)
{
case 0: printf("エド君「その数は3で割りきれる数だ。」"); break;
case 1: printf("エド君「その数は3で割ると1余りが出る数だ。」"); break;
case 2: printf("エド君「その数は3で割ると2余りが出る数だ。」"); break;
}
return 0;
}
エド君「こんな感じになる。簡単に言えば余りの数字をcaseとして分岐させてるといったとこだ。注意点としてはcaseと数字の間に空白を入れること。入れないとcase0みたいな識別子だと認識されるからな。ちなみにこのbreakはswitch文を抜け出すためのコマンドだ。これをつけなかった場合はbreakのあるところまで反映されるようになる。あとはどのcaseにも当てはまらないとき用に使えるdefaultというものもある。」
結局どっちがいいんだ?
エド君「分岐数が多いならswitchの方がいいが2分岐くらいならifの方が良いとも聞くな。」
まあ分岐の種類次第か。
エド君「あとはswitchだとさっき言ったa?b:cの三項演算子が使えないらしいが正直なところ複雑な書き方すると一気にわかりにくくなるのが三項演算子だからな…あ
とCならまだしもC#とかになると似た記号表現が出てきてややこしいって問題もある。ただ学生ならこの三項演算子という概念をテストで問われる可能性もあるしやっぱり記憶の片隅にでもいれとくのは悪くねぇぞ。」
エド君「というわけで今回は終わりだ。ちなみにこの二つの文を合わせて選択文と言ったりもする。次はループ系の関数だ。これも種類がいくつかあるから混乱しねぇようにな。」