前に作ったプログラムを「ネスト」を使ったプログラムに書き換えてみましょう。
入力した整数が、
負の数であれば、「入力データは負の数です。」 正の数であれば、「入力データは正の数です。」 ゼロであれば、 「入力データはゼロです。」
と表示するプログラムを書き換えると、下のようになります。
<sample program 012-01>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input < 0) { printf("入力データは負の数です。\n"); } else { if (input > 0) { printf("入力データは正の数です。\n"); } else { printf("入力データはゼロです。\n"); } } return 0; } |
<実行結果1>
整数を入力してください:-1 入力データは負の数です。 続行するには何かキーを押してください・・・
<実行結果2>
整数を入力してください:1 入力データは正の数です。 続行するには何かキーを押してください・・・
<実行結果3>
整数を入力してください:0 入力データはゼロです。 続行するには何かキーを押してください・・・
前回と変わった箇所は、「負の数でない場合」に「正の数かどうか」を調べています。
「負の数でもなく」「正の数でもない」数値は「ゼロ」になります。
結果は前回と同じですが、考え方が少し違います。
上のプログラムの手順を書くと、
1.「負の数かどうか」調べます。
2.「負の数であれば」結果を表示してプログラムを終わります。(else文は実行されません。)
3.「負の数で無ければ」「正の数かどうか」調べます。
4.「正の数であれば」結果を表示してプログラムを終わります。(else文は実行されません。)
5.「正の数で無ければ」ゼロという結果を表示してプログラムを終わります。
となります。
前回のプログラムと比較します。
<sample program 011-02>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input < 0) { printf("入力データは負の数です。\n"); } if (input > 0) { printf("入力データは正の数です。\n"); } if (input == 0) { printf("入力データはゼロです。\n"); } return 0; } |
前回のプログラムです。
これは、
1.「負の数かどうか」調べます。
2.「負の数であれば」結果を表示します。
3.「負の数であろうと無かろうと」「正の数かどうか」調べます。
4.「正の数であれば」結果を表示します。
5.「負の数であろうと無かろうと」「正の数であろうと無かろうと」「ゼロかどうか」調べます。
6.「ゼロであれば」結果を表示します。
7.プログラムを終了します。
となります。
言いたいことは、前回のプログラムは無駄が多いのです。
入力した数値が「負の数」であれば、「正の数かゼロか」は調べる必要がありません。
「負の数で無ければ」残りは「正の数かゼロか」しかありませんので、「正の数かどうか」のみ調べればすむことです。
「負の数でもなく正の数でも無ければ」、結果はゼロしかありえません。
では、もう1つ。
2つの整数「整数1」「整数2」を入力し、
「整数1」の方が小さければ、「整数1の方が小さいです。」 「整数1」の方が大きければ、「整数1の方が大きいです。」 2つの数が等しければ、「整数1と整数2は等しいです。」
と表示するプログラムをネストに書き換えましょう。
考えてみてください。
解答例です。
<sample program 012-02>
#include <stdio.h> int main(void) { int input1; int input2; printf("整数1を入力してください:"); scanf("%d", &input1); printf("整数2を入力してください:"); scanf("%d", &input2); if (input1 < input2) { printf("整数1の方が小さいです。\n"); } else { if (input1 > input2) { printf("整数1の方が大きいです。\n"); } else { printf("整数1と整数2は等しいです。\n"); } } return 0; } |
<実行結果1>
整数1を入力してください:15 整数2を入力してください:23 整数1の方が小さいです。 続行するには何かキーを押してください・・・
<実行結果2>
整数1を入力してください:35 整数2を入力してください:23 整数1の方が大きいです。 続行するには何かキーを押してください・・・
<実行結果3>
整数1を入力してください:18 整数2を入力してください:18 整数1と整数2は等しいです。 続行するには何かキーを押してください・・・
これも、整数1と2を比較した場合、
「整数1<整数2」が成立していれば、他の条件は比較しなくても良いです。
「整数1<整数2」が成立していなければ、「整数1>=整数2」のはずですから、「整数1>整数2」が成り立つかどうかさえ調べれば、結果がわかります。
実際には、調べる順番は変わってもかまいません。
まず、等しいかどうか調べ、等しく無ければ、大きいか小さいかを調べてもOKです。
上の2つの例は、「ネスト」を使わなくても組めるプログラムを、「ネスト」を使って無駄なく書き換えることを行いました。
今度は、新しい問題を出しましょう。
国語と数学の得点を入力し、どちらか一方が80点以上あれば「合格」と表示するプログラムを作ってみてください。
解答例です。
<sample program 012-03>
#include <stdio.h> int main(void) { int kokugo; int suugaku; printf("国語の点数を入力してください:"); scanf("%d", &kokugo); printf("数学の点数を入力してください:"); scanf("%d", &suugaku); if (kokugo >= 80) { printf("合格\n"); } else { if (suugaku >= 80) { printf("合格\n"); } } return 0; } |
<実行結果1>
国語の点数を入力してください:80 数学の点数を入力してください:50 合格 続行するには何かキーを押してください・・・
<実行結果2>
国語の点数を入力してください:50 数学の点数を入力してください:80 合格 続行するには何かキーを押してください・・・
<実行結果3>
国語の点数を入力してください:80 数学の点数を入力してください:90 合格 続行するには何かキーを押してください・・・
<実行結果4>
国語の点数を入力してください:50 数学の点数を入力してください:50 続行するには何かキーを押してください・・・
実行結果を見ると、「どちらか一方の点数が80以上の時だけ」合格と表示されています。
この条件を作るには「ネスト」が楽です。
国語の点数が80以上であれば、すぐに合格と表示する。
80以上でなければ、数学の得点を調べ、数学の点数が80以上であれば、合格と表示する。
どちらも成り立たなければ、何も表示しない。
「ネスト」を使わずに作ると、下のようになるでしょうか。
<sample program 012-04>
#include <stdio.h> int main(void) { int kokugo; int suugaku; printf("国語の点数を入力してください:"); scanf("%d", &kokugo); printf("数学の点数を入力してください:"); scanf("%d", &suugaku); if (kokugo >= 80) { printf("合格\n"); } if (suugaku >= 80) { printf("合格\n"); } return 0; } |
<実行結果1>
国語の点数を入力してください:80 数学の点数を入力してください:50 合格 続行するには何かキーを押してください・・・
<実行結果2>
国語の点数を入力してください:50 数学の点数を入力してください:80 合格 続行するには何かキーを押してください・・・
<実行結果3>
国語の点数を入力してください:80 数学の点数を入力してください:90 合格 合格 続行するには何かキーを押してください・・・
<実行結果4>
国語の点数を入力してください:50 数学の点数を入力してください:50 続行するには何かキーを押してください・・・
どちらか一方だけ80以上であれば、正しく表示されますが、両方とも80以上の時に、合格が2回表示されています。
このように「ネスト」を使わなければ出来ないことがあるのです。
次は、3つの整数を入力し、3つとも同じ数であれば「3つの数は等しいです。」と表示するプログラムを作ってみましょう。
ただし、次のような書き方はできませんので、あらかじめ書いておきます。
<sample program 012-05>
#include <stdio.h> int main(void) { int input1; int input2; int input3; printf("整数1を入力してください:"); scanf("%d", &input1); printf("整数2を入力してください:"); scanf("%d", &input2); printf("整数3を入力してください:"); scanf("%d", &input3); if (input1 == input2 == input3) { printf("3つの数は等しいです。\n"); } return 0; } |
条件式のところに、「==」が2つ使われています。
やりたい事の意図は分かりますが、コンピュータには伝わらず正しく動作しません。
しかし、エラーにはなっていませんから、とりあえず実行は出来ます。
実行結果は、
整数1と2が等しく、整数3が1の場合 整数1と2が異なり、整数3が0の場合 のみ、「3つの数は等しいです。」
という結果が出ます。
その他の数値は、どんな数値を入れてもメッセージは表示されません。
前回も説明しましたが、念のためもう一度書いておきます。
「==」演算子の実行順は左から右へです。
まず整数1と整数2が比較されます。
同じであれば、成り立ちますから「1」が結果となりますし、同じでなければ、成り立ちませんから「0」が結果となります。
次に、この結果「1か0」と整数3が比較されます。
整数1や整数2に何を入れても、「1か0」の結果になりますから、整数3は「1か0」としか比較されません。
ですから、正しく結果がでないのです。
整数1と整数2が等しく、整数3が1の場合と書きましたが、整数1と整数2が同じ数であれば成り立ちます。
成り立つということは、「1」ということです。
整数3に1が入っていれば、同じ数ですから、メッセージが表示されます。
C言語では出来ないことを正しく理解することは、非常に大切なことです。
解答例です。
<sample program 012-06>
#include <stdio.h> int main(void) { int input1; int input2; int input3; printf("整数1を入力してください:"); scanf("%d", &input1); printf("整数2を入力してください:"); scanf("%d", &input2); printf("整数3を入力してください:"); scanf("%d", &input3); if (input1 == input2) { if (input2 == input3) { printf("3つの数は等しいです。\n"); } } return 0; } |
<実行結果1>
整数1を入力してください:10 整数2を入力してください:10 整数3を入力してください:10 3つの数は等しいです。 続行するには何かキーを押してください・・・
<実行結果2>
整数1を入力してください:10 整数2を入力してください:5 整数3を入力してください:10 続行するには何かキーを押してください・・・
<実行結果3>
整数1を入力してください:10 整数2を入力してください:10 整数3を入力してください:5 続行するには何かキーを押してください・・・
<実行結果4>
整数1を入力してください:5 整数2を入力してください:10 整数3を入力してください:10 続行するには何かキーを押してください・・・
これも「ネスト」を使えばできます。
2つの数値の比較(大小や等しい)は1つずつしか出来ないということを頭に入れておきましょう。
最後に、上のプログラムを少し改良します。
3つ数値が同じ時に「3つの数は等しいです。」と表示し、1つでも違えば「3つの数は異なります。」とい表示するよう変更してみてください。
解答例です。
<sample program 012-07>
#include <stdio.h> int main(void) { int input1; int input2; int input3; printf("整数1を入力してください:"); scanf("%d", &input1); printf("整数2を入力してください:"); scanf("%d", &input2); printf("整数3を入力してください:"); scanf("%d", &input3); if (input1 == input2) { if (input2 == input3) { printf("3つの数は等しいです。\n"); } else{ printf("3つの数は異なります。\n"); } } else{ printf("3つの数は異なります。\n"); } return 0; } |
<実行結果1>
整数1を入力してください:10 整数2を入力してください:10 整数3を入力してください:10 3つの数は等しいです。 続行するには何かキーを押してください・・・
<実行結果2>
整数1を入力してください:10 整数2を入力してください:5 整数3を入力してください:10 3つの数は異なります。 続行するには何かキーを押してください・・・
<実行結果3>
整数1を入力してください:10 整数2を入力してください:10 整数3を入力してください:5 3つの数は異なります。 続行するには何かキーを押してください・・・
<実行結果4>
整数1を入力してください:5 整数2を入力してください:10 整数3を入力してください:10 3つの数は異なります。 続行するには何かキーを押してください・・・
else文を書く場所を考えて書かないと、正しい結果が表示されません。
整数1と整数2が異なる場合、「3つの数は異なります。」と表示しなければなりません。
さらに、整数1と整数2が同じ場合でも、整数2と整数3が異なれば「3つの数は異なります。」と表示する必要があります。
つまり、2箇所にelse文を書かなければなりません。
最後に「インデント」を読んでおいてください。