★分岐構造:ネスト2★


では、少し問題のレベルを上げてみましょう。

3つの整数を入力し、一番大きな数を表示してください。

方法は色々ありますので、試行錯誤しながら作ってみてください。

以前のプログラムより、複雑になりますので、紙などに図を書きながら考えていくと良いかも知れません。









































解答例です。


<sample program 013-01>

#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 (input1 > input3) {
            printf("一番大きい数は%dです。\n", input1);
        }
        else {
            printf("一番大きい数は%dです。\n", input3);
        }
    }
    else{
        if (input2 > input3) {
            printf("一番大きい数は%dです。\n", input2);
        }
        else {
            printf("一番大きい数は%dです。\n", input3);
        }
    }

    return 0;
}

<実行結果1>

整数1を入力してください:15
整数2を入力してください:23
整数3を入力してください:48
一番大きい数は48です。
続行するには何かキーを押してください・・・

<実行結果2>

整数1を入力してください:53
整数2を入力してください:23
整数3を入力してください:48
一番大きい数は53です。
続行するには何かキーを押してください・・・

<実行結果3>

整数1を入力してください:15
整数2を入力してください:68
整数3を入力してください:48
一番大きい数は68です。
続行するには何かキーを押してください・・・

3つの数値の中での最大値を求めるには、(これまでも書いてきましたが)一度に3つの数値を比較することは出来ませんから、2つずつ比較していく必要があります。

上の解答例にもあるように、整数1と整数2を比較し、大きい方と整数3を比較すれば、3つの数値の最大値が求められます。

しつこいようですが、

  if (input1 > input2 > input3 )

のようには書けません。

一度に比較できるのは、2つの値までです。

問題のところで図に書いてみると良いかも知れませんと書きましたが、どのような図を書けばよいのでしょうか。

プログラムを図式化する方法として、フローチャートというものがあります。

※現在ではあまり使われることはありませんが、考える時の参考程度にはなるでしょう。

<図 013-01>

ひし形の部分が比較(if文)になり、不成立の部分がelse文になります。

成立しているか、していないかによって進むべき道が変わっていきます。

ただし、図の書き方によってはプログラムで再現するのが難しくなる場合もあります。

特に、上の図では整数3の表示が2箇所あることに注目してみてください。

これを1つにまとめようとすると、下のような図になります。

<図 013-02>

整数3の表示箇所を1つにまとめてみました。

図としては、すっきりしていますが、問題点があります。

<図 013-01>の比較(ひし形)をif文、不成立をelse文と考えると、次のような図に置き換えることが出来ます。

<図 013-03>

これを元に、<sample program 013-01>のようなプログラムを書くことは簡単?ですが、<図 013-02>をif−else文にしようとすると、整数3の表示部分で、どうやってif−else文に変換するのか?という問題が生じます。

結局は図で考えるにしても、実際にプログラム可能な図を意識して書く必要があるということです。

最初のうちはすっきりした図を書くよりも、余計な手間がかかるかもしれませんが、少々回りくどいと感じてもプログラムに直しやすい図を書くことが必要です。

慣れてくれば、フローチャートを書くよりは、直接プログラム言語で考えた方が楽になるかもしれません。


上のプログラムは次のように書くこともできます。

<sample program 013-02>

#include <stdio.h>

int main(void)
{
    int input1;
    int input2;
    int input3;

    int max;

    printf("整数1を入力してください:");

    scanf("%d", &input1);

    printf("整数2を入力してください:");

    scanf("%d", &input2);

    printf("整数3を入力してください:");

    scanf("%d", &input3);

    if (input1 > input2) {
        if (input1 > input3) {
            max = input1;
        }
        else {
            max = input3;
        }
    }
    else{
        if (input2 > input3) {
            max = input2;
        }
        else {
            max = input3;
        }
    }

    printf("一番大きい数は%dです。\n", max);

    return 0;
}

<実行結果1>

整数1を入力してください:15
整数2を入力してください:23
整数3を入力してください:48
一番大きい数は48です。
続行するには何かキーを押してください・・・

<実行結果2>

整数1を入力してください:53
整数2を入力してください:23
整数3を入力してください:48
一番大きい数は53です。
続行するには何かキーを押してください・・・

<実行結果3>

整数1を入力してください:15
整数2を入力してください:68
整数3を入力してください:48
一番大きい数は68です。
続行するには何かキーを押してください・・・

変わったところは、最大値を入れるための変数「max」を用意し、if文の中で「max」に最大値をセットしています。

動作も同じなのですが、大きな違いは、最大値を保管しておくことができるという点です。

もし、このプログラムが最大値を出すだけで終わり、では無く、最大値を使って別の処理を続けて行う、というプログラムであれば、最大値を保管しておいた方が、何かと都合が良いのです。

<sample program 013-01>では、最大値を保管していませんので、この後にプログラムを追加し、そこで最大値を利用したい場合に困ってしまいます。

このように、変数に値を保管しておくことは、後々プログラムの追加や修正にも役立つことがあります。

とはいえ、最大値を表示した後、まったく使わないのであれば、保管しておく必要はありません。

上手く、使い分けてください。


次へ

戻る

目次へ