これまで、「ネスト」について色々と書いてきましたが、もう少し違った考え方を紹介します。
まずは、例題を出しましょう。
以前に出した問題の応用なのですが、
入力した整数が0以上、100以下であれば、「入力したデータは0以上100以下の範囲にあります。」と表示し、それ以外であれば、「範囲外です。」と表示するプログラムを作ってみてください。
以前、作ったプログラムを参考に改良を加えてみてください。
解答例です。
<sample program 015-01>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input >= 0) { if (input <= 100) { printf("入力したデータは0以上100以下の範囲にあります。\n"); } else { printf("範囲外です。\n"); } } else { printf("範囲外です。\n"); } return 0; } |
<実行結果1>
整数を入力してください:0 入力したデータは0以上100以下の範囲にあります。 続行するには何かキーを押してください・・・
<実行結果2>
整数を入力してください:-5 範囲外です。 続行するには何かキーを押してください・・・
<実行結果3>
整数を入力してください:100 入力したデータは0以上100以下の範囲にあります。 続行するには何かキーを押してください・・・
<実行結果4>
整数を入力してください:101 範囲外です。 続行するには何かキーを押してください・・・
else文が2箇所にあります。
最初に、「0以上」かどうか調べます。
ここで、処理が2つに分かれます。
「0以上」であれば、「100以下」かどうか調べ、「0未満」であれば「範囲外」の表示を行います。
「100以下」であれば、「範囲内」のメッセージを表示し、「100より大きい」のであれば「範囲外」の表示を行います。
ですから、「0未満」の場合と、「100より大きい」場合の2箇所にelse文が必要になります。
これを次のように書き換えることが出来ます。
<sample program 015-02>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input >= 0 && input <= 100) { printf("入力したデータは0以上100以下の範囲にあります。\n"); } else { printf("範囲外です。\n"); } return 0; } |
<実行結果1>
整数を入力してください:0 入力したデータは0以上100以下の範囲にあります。 続行するには何かキーを押してください・・・
<実行結果2>
整数を入力してください:-5 範囲外です。 続行するには何かキーを押してください・・・
<実行結果3>
整数を入力してください:100 入力したデータは0以上100以下の範囲にあります。 続行するには何かキーを押してください・・・
<実行結果4>
整数を入力してください:101 範囲外です。 続行するには何かキーを押してください・・・
実行結果は、最初のプログラムと同じになっています。
「ぱっ」と見て、else文が1つ減っていますよね。
そして、if文の中に条件が2つ書いてあります。
よく見ると、条件の間に「&&」という記号が書いてあります。
これが条件をつなぐための記号の1つです。
2つ以上の条件を連結させるための記号(命令)は2種類あります。
「&&」 アンド と読みます。
「||」 オア と読みます。
オアはキーボードで見ると、右上の「BackSpace」キーの左側、「¥」キーのところにあります。
Shiftキーを押しながら、「¥」キーを押すと「|」が入力されます。
意味としては、
「&&」 アンド は、一方の条件が成立し「しかも」もう一方の条件も成立していたら・・・
「||」 オア は、一方の条件が成立しているか「または」もう一方の条件が成立していたら・・・
となります。
要は、
「&&」 アンド は、両方の条件が成立していた場合のみ「if文が成立」したことになります。
「||」 オア は、どちらか一方の条件が成立していた場合に、「if文が成立」したことになります。
似たような感じがしますが、間違うとひどい目にあいます。
例えば、<sample program 015-02>の「&&」を「||」に変えてみましょう。
<sample program 015-03>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input >= 0 || input <= 100) { printf("入力したデータは0以上100以下の範囲にあります。\n"); } else { printf("範囲外です。\n"); } return 0; } |
<実行結果1>
整数を入力してください:0 入力したデータは0以上100以下の範囲にあります。 続行するには何かキーを押してください・・・
<実行結果2>
整数を入力してください:-5 入力したデータは0以上100以下の範囲にあります。 続行するには何かキーを押してください・・・
<実行結果3>
整数を入力してください:100 入力したデータは0以上100以下の範囲にあります。 続行するには何かキーを押してください・・・
<実行結果4>
整数を入力してください:101 入力したデータは0以上100以下の範囲にあります。 続行するには何かキーを押してください・・・
何を入力しても「入力したデータは0以上100以下の範囲にあります。」というメッセージが表示されます。
なぜでしょうか。(ちょっと考えてみてください)
「||」 オア は、どちらか一方の条件が成立していれば、「if文が成立」したことになります。
上のプログラムを見ると、
変数「input」の中身が、0以上「または」100以下であれば、「成立」したことになります。
どちらかが成立していれば良いので、「-1」は100以下ですし、「101」は0以上です。
つまり、どんな数値を入力しても「成立」するのです。
これを頭に置いて、<sample program 015-02>を見てください。
「&&」 アンド は、両方の条件が成立していた場合のみ「if文が成立」したことになります。
変数「input」の中身が、0以上で「しかも」100以下であれば、「成立」したことになります。
両方成立していなければならないので、「-1」は範囲外ですし、「101」も範囲外です。
これを使って、2つのプログラムを考えてみてください。
国語と数学のテストの得点を入力し、
1.両方とも80点以上で「合格」と表示 2.どちらか一方が80点以上で「合格」と表示
するプログラムです。
「&&」と「||」を使って作ってみてください。
1.の解答例です。
<sample program 015-04>
#include <stdio.h> int main(void) { int kokugo; int suugaku; printf("国語の点数を入力してください:"); scanf("%d", &kokugo); printf("数学の点数を入力してください:"); scanf("%d", &suugaku); if (kokugo >= 80 && suugaku >= 80) { printf("合格\n"); } return 0; } |
<実行結果1>
国語の点数を入力してください:80 数学の点数を入力してください:5 続行するには何かキーを押してください・・・
<実行結果2>
国語の点数を入力してください:80 数学の点数を入力してください:90 合格 続行するには何かキーを押してください・・・
<実行結果3>
国語の点数を入力してください:50 数学の点数を入力してください:50 続行するには何かキーを押してください・・・
2.の解答例です。
<sample program 015-05>
#include <stdio.h> int main(void) { int kokugo; int suugaku; printf("国語の点数を入力してください:"); scanf("%d", &kokugo); printf("数学の点数を入力してください:"); scanf("%d", &suugaku); if (kokugo >= 80 || suugaku >= 80) { printf("合格\n"); } return 0; } |
<実行結果1>
国語の点数を入力してください:80 数学の点数を入力してください:5 合格 続行するには何かキーを押してください・・・
<実行結果2>
国語の点数を入力してください:80 数学の点数を入力してください:90 合格 続行するには何かキーを押してください・・・
<実行結果3>
国語の点数を入力してください:50 数学の点数を入力してください:50 続行するには何かキーを押してください・・・
このように、2つ以上の条件をつなぐことができます。
ただし、「&&」と「||」を間違えると、まったく違った結果が出ますので、意味をしっかりと理解してください。
次回は、以前に作ったプログラムを書き換えて見ます。