Cによるプログラミング入門4
条件分岐
プログラムの実行を条件によって変えるようにしたいことがあります。たとえば、
あなたは男性ですか?女性ですか?
1 男性 2 女性
と表示してから、ユーザの入力を待ち、その入力の値(1か2のはず)によって、以後の動作を変えるようなプログラム(さらに質問を続けるとか、デートに誘うとか)を書きたいと思うこともあるでしょう。
このように、条件によって、動作の流れを変えることを、条件分岐などといいます。難しく考えるより、例を見て理解しましょう。
たとえば、int型変数xがあったときに、
if(x == 1){
処理1
}
else if(x == 2){
処理2
}
else{
処理3
}
のようなコードを書くと、「xが1のときは処理1を実行し、xが2のときは処理2を実行し、xがそれ以外のときは処理3を実行する」という意味になります。ここで「==」は「等しい」という意味です。(「=」だと代入の意味になるので、=を2つつなげているわけです。)
ここで、
else if(...){
...
}
は、elseの前にいくつあっても、また、1つもなくてもかまいません。また、
else{
...
}
も必要がなければ、書かなくてかまいません。たとえば、次のプログラムを見てください。
/* which.c */
#include <stdio.h>
int main(void)
{
int ans;
printf("あなたは男性ですか?女性ですか?\n1
男性 2 女性\n");
scanf("%d", &ans);
if(ans == 1){
printf("あなたは男性なんですね。\n");
}
else if(ans == 2){
printf("あなたは女性なんですね。\n");
}
return 0;
}
このプログラムでは、まず、int型変数ansを定義し、次に、「あなたは男性ですか?女性ですか? 1 男性 2 女性」という質問を表示し、scanfでユーザの入力をansに格納します。それから、ansの値を調べ、それが1に等しいなら「あなたは男性なんですね。」と表示し、2に等しいなら「あなたは女性なんですね。」と表示するようにしてあるのです。「else{...}」は付けなかったので、ユーザが1と2以外の整数を入力した場合は、何も起こりません。
Fig.1 which.exeの実行例1(1と入力)
Fig.2 which.exeの実行例2(100と入力)
このようなものをif文と言います。構文としてまとめると次のようになりますが、いろいろ自分でためしてみる方がわかりやすいはずです。それは課題4で見てみることにしましょう。
xが変数のとき
if(x == a){ とすると、xがaのとき処理Aが実行され、xがbのとき処理Bが実行され、...となり、xがどれにも等しくないとき、処理Zが実行されます。ここで、「else if(...){...}」はいくつあっても(なくても)かまいません。また、「else{...}」の部分は、なくてもかまいません。 |
ここで、「if(a == b)」は「aとbが等しいとき」などという意味になるわけですが、「aとbが等しくないとき」とするには「if(a != b)」のように書きます。このような、条件の書き方もまとめておきます。
条件の書き方
a == b aとbが等しい(とき) |
同様のことを、switch文というもので行うこともできます。これは次のように使います。
xが変数のとき
switch(x){ とすると、xがaのとき処理Aが実行され、xがbのとき処理Bが実行され、...となり、xがどれにも等しくないとき、処理Zが実行されます。ここで、「case ... break;」はいくつあっても(なくても)かまいません。また、「default: 処理Z」の部分はなくてもかまいません。 |
switch文を使ってwhich.cを書き換えると、次のようになります。
/* which2.c */
#include <stdio.h>
int main(void)
{
int ans;
printf("あなたは男性ですか?女性ですか?\n1
男性 2 女性\n");
scanf("%d", &ans);
switch(ans){
case 1:
printf("あなたは男性なんですね。\n");
break;
case 2:
printf("あなたは女性なんですね。\n");
break;
}
return 0;
}
which2.exeの動作はwhich.exeと同じです。
ここで、「if文とswitch文のどちらを使えばよいのか」と悩むかもしれません。まずは、自然と思われる方を使うことにしましょう。
なお、switch文の「break;」は、「そのcaseでの処理はそこで終わり」ということを示します。which2.cの「case 2:」では、その後に何もない(そのままswitch文が終了する)ので、ここに「break;」はなくてもかまいません。
それでは、「問題 世界一長い川は? 1 信濃川 2 アマゾン川 3 ナイル川」と表示してユーザに1、2、3を入力させ、それぞれについて正解・不正解を表示するプログラムは書けるでしょうか?ちょっと考えてみてください。
答は、次のようになりますね。
/* mondai.c */
#include <stdio.h>
int main(void)
{
int x;
printf("問題 世界一長い川は? \n");
printf("1 信濃川 2 アマゾン川 3 ナイル川\n");
scanf("%d", &x);
switch(x){
case 1:
printf("日本一ですが、違います。\n");
break;
case 2:
printf("そんな気もしますが、違います。\n");
break;
case 3:
printf("おめでとう。正解です!\n");
break;
default:
printf("誤入力。入力は1か2か3です。\n");
}
return 0;
}
Fig.3 mondai.exeの実行例1(2と入力)
Fig.4 mondai.exeの実行例2(100と入力)
もしユーザが1、2、3以外の整数を入力したときは、「誤入力。入力は1か2か3です。」と表示するようにしてみました。それがdefaultでの処理です。
ただし、「scanf("%d", &x);」で整数以外のものを入力しようとすると、文法的な(実行時の)エラーになります。入力は必ず半角数字で行うようにユーザに言っておきましょう。
今回はこの辺にします。条件分岐を使うとユーザの入力に反応するプログラムが書けるようになるので、おもしろいと思います。いろいろ考えてみてください。
ユーザが「女性(もしくは男性)」と入力したらデートに誘うプログラム?昔そういうのを書いて学生にとても受けましたが、ある年齢を過ぎてから痛いほどしらけるようになりました。それは、若い諸君にお任せします。
ただし、文字列の扱いは少々難しく、ユーザに文字列を入力させるプログラムの書き方はあとで説明することにします。今は、「男性」や「女性」と入力させるのではなく、「1
男性 2
女性」などとして、半角整数で入力を受け取るように書きましょう。