今回のタイトルは初心者がよく間違えやすいif文の使い方とも言い換えることができます。(わたしも一番最初にやった間違いです)
例として次のような成績判定を考えます。
点数 | 判定 |
---|---|
80点以上 | 優 |
60点以上 | 良 |
40点以上 | 可 |
この表の判定をしようとして作ったプログラムの悪い例が以下です。
seiseki_hantei_ng.c
/* 条件判断の悪い例 */
#include <stdio.h>
int main(void)
{
int tokuten;
printf("得点を入力してください: ");
scanf("%d", &tokuten);
if(tokuten >= 80){
printf("優\n");
}
if(tokuten >= 60){
printf("良\n");
}
if(tokuten >= 40){
printf("可\n");
}
return 0;
}
実行結果(80を入力した場合)
得点を入力してください: 80 [Enter]
優
良
可
気持ちとしては「優」だけを表示して欲しかったのですが、なんと「優」「良」「可」全て表示されています。
理由は3つあるif文が全て独立して動作しているからです。
if文に記述した条件は全て一度は判定されるからです。
変数tokutenの値が80であれば、if(tokuten >= 80) も if(tokuten >= 60) も if(tokuten >= 40) もすべて《成り立つ》わけです。
考え方としては、
もし80点以上なら「優」、そうでなくて60点以上なら「良」、あるいはまたそうではなくて40点以上なら「可」とする
といった日本語で考える必要があります。
これは、if~else if文で置き換えることができます。
正しいプログラムは以下です。
seiseki_hantei_ok.c
#include <stdio.h>
int main(void)
{
int tokuten;
printf("得点を入力してください: ");
scanf("%d", &tokuten);
if(tokuten >= 80){
printf("優\n");
}
else if(tokuten >= 60){
printf("良\n");
}
else if(tokuten >= 40){
printf("可\n");
}
return 0;
}
実行結果
得点を入力してください: 80 [Enter]
優
プログラムは上から実行するので、上記の最初のif文で条件が成り立てば、以下に続くelse if文は無視されます。要するにif~else if文は一つのまとまりとなるわけです。同じ条件でもif文だけで構成した最初のプログラムとの違いです。if文が複数あると必ず一つ一つのif文の条件判定を行うため、else ifで構成した時と意味合いが変わってくるのです。
上記のプログラムだと40点未満は判定してくれないので、表に「不可」も追加して、最終的にこんな感じにするといいのではないでしょうか。
点数 | 判定 |
---|---|
80点以上 | 優 |
60点以上 | 良 |
40点以上 | 可 |
それ以外 | 不可 |
seiseki_hantei.c
#include <stdio.h>
int main(void)
{
int tokuten;
printf("得点を入力してください: ");
scanf("%d", &tokuten);
if(tokuten >= 80){
printf("優\n");
}
else if(tokuten >= 60){
printf("良\n");
}
else if(tokuten >= 40){
printf("可\n");
}
else{
printf("不可\n");
}
return 0;
}
実行結果
得点を入力してください: 39 [Enter]
不可
以上、if文だけ複数使って判定とif~else ifで判定するの違いでした。
コメント