★分岐構造:ネスト1★


前に作ったプログラムを「ネスト」を使ったプログラムに書き換えてみましょう。

入力した整数が、

  負の数であれば、「入力データは負の数です。」

  正の数であれば、「入力データは正の数です。」

  ゼロであれば、 「入力データはゼロです。」

と表示するプログラムを書き換えると、下のようになります。


<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文を書かなければなりません。

最後に「インデント」を読んでおいてください。


次へ

戻る

目次へ