★分岐構造3★


前回に引き続き、問題を出しましょう。

しつこいようですが、日本語で考えた「やりたいこと」をいかにC言語にするかということが、プログラムを始める方には必要なのです。

今、出題している「分岐構造」は仕組みは単純ですが、「応用」の幅は広いですから、たくさんプログラムを作ってみましょう。

もちろん、自分で問題を考えたり、サンプルに追加したり、変更したりすることも重要です。

どんなプログラムを組んでも、今の状況で、パソコンが壊れたりすることはありませんから、色々と試して見ましょう。


では、入力した数値が「負の数値」であれば、「マイナス」と表示するプログラムを作ってみましょう。

人間にとって、正の数値、負の数値、ゼロの区別はすぐに分かります。

でも、コンピュータは分かっていないのです。

負の数値とは、どのような数値か皆さんが分かった上で、コンピュータに教えてあげないといけません。

では、実行結果が以下のようになるよう、作ってみてください。

<実行結果1>

整数を入力してください:-1
マイナス
続行するには何かキーを押してください・・・

<実行結果2>

整数を入力してください:15
続行するには何かキーを押してください・・・









































解答例です。


<sample program 009-01>

#include <stdio.h>

int main(void)
{
    int input;

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

    scanf("%d", &input);

    if (input < 0) {
        printf("マイナス\n");
    }

    return 0;
}

<実行結果1>

整数を入力してください:-1
マイナス
続行するには何かキーを押してください・・・

<実行結果2>

整数を入力してください:15
続行するには何かキーを押してください・・・

0(ゼロ)と比較すれば、「負の数値」「正の数値」「ゼロ」は判別可能です。

「負の数値」はゼロより小さい数値ということが分かっていれば簡単です。


では、次に入力した数値の「絶対値」を求めるプログラムを作ってみてください。

「絶対値」とは、その数値が0(ゼロ)からどれだけ離れているかという数値です。









































解答例です。


<sample program 009-02>

#include <stdio.h>

int main(void)
{
    int input;

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

    scanf("%d", &input);

    if (input < 0) {
        input = input * -1;
    }

    printf("入力したデータの絶対値は%dです。\n", input);

    return 0;
}

<実行結果>

整数を入力してください:-5
入力したデータの絶対値は5です。
続行するには何かキーを押してください・・・

要は、「負の数値」であれば、「符号」を反転されれば良いのです。

符号を反転するには、−1を乗算することで出来ます。

また、書き方として次のプログラムでも出来ます。


<sample program 009-03>

#include <stdio.h>

int main(void)
{
    int input;

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

    scanf("%d", &input);

    if (input < 0) {
        input = -input;
    }

    printf("入力したデータの絶対値は%dです。\n", input);

    return 0;
}

<実行結果>

整数を入力してください:-5
入力したデータの絶対値は5です。
続行するには何かキーを押してください・・・

マイナス符号を付けることで、「負の数値」が「正の数値」に変わります。


次は、数学のテストが行われたとします。

得点が100点であれば、「満点」と表示するプログラムを作ってください。

「いきなり、簡単になったな」と思う方もいらっしゃるかも知れませんが、重要なことを説明します。









































解答例です。


<sample program 009-04>

#include <stdio.h>

int main(void)
{
    int suugaku;

    printf("得点を入力してください:");

    scanf("%d", &suugaku);

    if (suugaku == 100) {
        printf("満点\n");
    }

    return 0;
}

<実行結果>

得点を入力してください:100
満点
続行するには何かキーを押してください・・・

変数名は「suugaku」としています。特に「mathematics」でなくてもかまいません。

とは言え、なるべく英語の方が良いかも知れません。

「重要なことを説明します」と書きましたが、変数名のことではありません。

もしかしたら、次のようなプログラムを書いていませんか?


<sample program 009-05>

#include <stdio.h>

int main(void)
{
    int suugaku;

    printf("得点を入力してください:");

    scanf("%d", &suugaku);

    if (suugaku = 100) {
        printf("満点\n");
    }

    return 0;
}

<実行結果1>

得点を入力してください:100
満点
続行するには何かキーを押してください・・・

「どこが違うの?」と思われそうですが、if文の条件に「=」が使われています。

<sample program 009-04>では、「==」を使っています。

「でも、結果は一緒でしょ?」と思うかも知れません。

では、入力データを変えて見ましょう。


<実行結果2>

得点を入力してください:53
満点
続行するには何かキーを押してください・・・

「満点」と出ます。

では、他の数値も入れて見ましょう。


<実行結果3>

得点を入力してください:0
満点
続行するには何かキーを押してください・・・

<実行結果4>

得点を入力してください:-2
満点
続行するには何かキーを押してください・・・

う〜ん、理解に苦しみますね。

どんな数値を入力しても「満点」と表示されます。

なぜでしょう?

コンピュータは「あいまい」な結果を出しません。

これらの現象も「ちゃんとした理由」があるのです。


「=(イコール)」演算子には「代入」の意味しかない、ということは以前書きました。

本来であれば「条件」を書くところに「=」演算子を書いているということがポイントなのです。

C言語(他のプログラム言語でも同じことが言えますが)での、「条件」とはどのような意味を持っているのでしょう。

検証してみます。


<sample program 009-06>

#include <stdio.h>

int main(void)
{
    printf("%d\n", 13 > 5);

    return 0;
}

<実行結果>

1
続行するには何かキーを押してください・・・

「条件」を表示してみました。

こういうことも出来るのです。

「結果」は「1」となっています。(実際に試してくださいね)

もう1つ、


<sample program 009-07>

#include <stdio.h>

int main(void)
{
    printf("%d\n", 13 < 5);

    return 0;
}

<実行結果>

0
続行するには何かキーを押してください・・・

「結果」は「0」です。

何を見てほしいかというと、

「条件」が成立している時には、「1」

「条件」が成立していない時には、「0」

になるという点です。

コンピュータは、人間の言葉を理解できない」ということはコラムにも書きました。

当然、「成立している」とか「成立していない」という言葉も理解できません。

では、どうやって「判断」をしているのでしょうか?

プログラムの世界では、

「0」は「不成立」を表し、

「0以外」は「成立」を表します。

コンピュータでの、「条件が成り立つ(成立)」、「条件が成り立たない(不成立)」の判断は、「条件」の結果が「0」か「0以外」かということです。

<sample program 009-05>で書いたプログラムは、変数「suugaku」に100を代入しています。

「条件」としては、「100」という数値を判断することになりますので、「0以外」の数値ですから「常に成立」となるのです。

このプログラムを実行してみてください。


<sample program 009-08>

#include <stdio.h>

int main(void)
{
    if (100) {
        printf("成り立っています。\n");
    }

    return 0;
}

<実行結果>

成り立っています。
続行するには何かキーを押してください・・・

「条件」は「成立」しています。

では、これはどうでしょう。


<sample program 009-08>

#include <stdio.h>

int main(void)
{
    if (0) {
        printf("成り立っています。\n");
    }

    return 0;
}

<実行結果>

続行するには何かキーを押してください・・・

何も表示されません。

ということは、「不成立」なのです。

このように書くこともできます。


<sample program 009-09>

#include <stdio.h>

int main(void)
{
    int data = 5;

    if (data) {
        printf("成り立っています。\n");
    }

    return 0;
}

<実行結果>

成り立っています。
続行するには何かキーを押してください・・・

変数名を「条件」に書いただけでも、中身の数値によって「成立」「不成立」が変わります。

これを利用してプログラムを書くことは、良くあることです。

例えば、前回の「奇数を求める」プログラムを例にしてみましょう。


<sample program 009-09>

#include <stdio.h>

int main(void)
{
    int input;

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

    scanf("%d", &input);

    if (input % 2) {
        printf("入力データは奇数です。\n");
    }

    return 0;
}

<実行結果>

整数を入力してください:15
入力データは奇数です。
続行するには何かキーを押してください・・・

入力データ「15」を「2で割った余り」は「1」です。

「1」ということは「0以外」ですから、「成立」します。

もしも、「偶数」を入力した場合、「2で割った余り」は「0」になりますので、「不成立」になります。

このように、「0(不成立)」か「0以外(成立)」を利用することで、プログラムの幅が広がります。


次へ

戻る

目次へ