★分岐構造:switch文3★


前回、breakを書かないとどうなるか、ということを検証してみましたが、breakをあえて書かないというプログラムもあります。

問題にしてみましょうか。

2から10までの整数を1つ入力し、

  「2」「3」「5」「7」の場合は「素数」
  「4」「6」「8」「9」「10」の場合は「合成数」

と表示するプログラムを作ってみてください。

switch文でなくても出来ますので、思いつかなければif文で作ってみても良いです。

「素数」「合成数」って?という方もいらっしゃるかも知れません。

ネットで検索すればいくらでも出てくるので、本来は皆さんで調べていただきたいのですが、このサイトの主旨として「細かいことでもなるべく説明する」ことにしていますので、説明を書きます。

  「素数」とは、1とその数値以外では割り切れない数値


  「合成数」とは、1とその数値以外にも割り切れる数値が存在する数値

です。

上に書いてある「2」「3」「5」「7」は、1とその数値(例えば2であれば2)以外に割り切れる数値がありません。

「4」や「6」といった数値は、その数値以外にも「2」や「3」でも割り切れますから「合成数」となります。

この「素数」は普段の皆さんの生活で体感することは無いかもしれませんが、コンピュータの世界では使うことがあるのです。

とりあえず、今は「素数」の使い道より、上のプログラムを完成させてみてください。









































解答例です。


<sample program 020-01>

#include <stdio.h>

int main(void)
{
    int input;

    printf("2から10までの整数を入力してください:");

    scanf("%d", &input);

    switch (input) {
        case 2:
        case 3:
        case 5:
        case 7:
            printf("素数\n");
            break;
        case 4:
        case 6:
        case 8:
        case 9:
        case 10:
            printf("合成数\n");
            break;
    }

    return 0;
}

<実行結果1>

2から10までの整数を入力してください:2
素数
続行するには何かキーを押してください・・・

<実行結果2>

2から10までの整数を入力してください:4
合成数
続行するには何かキーを押してください・・・

<実行結果3>

2から10までの整数を入力してください:7
素数
続行するには何かキーを押してください・・・

<実行結果4>

2から10までの整数を入力してください:-1
続行するには何かキーを押してください・・・

全てのケースを実行結果として載せると長くなりますので、省略させていただきました。

最初に書いたとおり、break文をあえて書かないことで、プログラムを作成しています。

caseラベル2,3,5の場合、breakが無いため(中身も無いですが・・・)すべてcaseラベル7へ流れていきます。

caseラベル4,6,8,9の場合も、breakが無いためすべてcaseラベル10に流れます。

このようなプログラムも書けます。(ただし、実際に素数を求めるプログラムは後々別の作り方を紹介します)


では、ここでswitch文に関係する新しいキーワードについて紹介しましょう。


<sample program 020-02>

#include <stdio.h>

int main(void)
{
    int menu;

    printf("メニューを選択してください\n");

    printf("0:開始\n1:終了\n");

    scanf("%d", &menu);

    switch (menu) {
        case 0:
            printf("開始!\n");
            break;
        case 1:
            printf("終了!\n");
            break;
        default:
            printf("入力エラー!\n");
            break;
    }

    return 0;
}

<実行結果1>

メニューを選択してください:0
開始!
続行するには何かキーを押してください・・・

<実行結果2>

メニューを選択してください:1
終了!
続行するには何かキーを押してください・・・

<実行結果3>

メニューを選択してください:2
入力エラー!
続行するには何かキーを押してください・・・

<実行結果4>

0から4までの整数を入力してください:-1
入力エラー!
続行するには何かキーを押してください・・・

default(デフォルト)というラベルです。

デフォルトという言葉を聞いたことがある方も多いと思います。

例えば、ゲーム等でのオプション設定画面で、「デフォルトに戻す」というのを見たことがありませんか?

デフォルトとは、あらかじめ設定されている値とか動作のことだと思ってください。

上のプログラムの意味は、

「デフォルト」は「入力エラー!」と表示することですが、

変数menuに0が入っていたら「開始!」と表示し、

変数menuに1が入っていたら「終了!」と表示する

プログラムになります。

結果的には、「0」か「1」以外の数値が入力された場合は、「入力エラー!」と表示されます。


このdefaultは注意しなければならない点が1つあります。

次のプログラムを見てください。


<sample program 020-03>

#include <stdio.h>

int main(void)
{
    int menu;

    printf("メニューを選択してください\n");

    printf("0:開始\n1:終了\n");

    scanf("%d", &menu);

    switch (menu) {
        case 0:
            printf("開始!\n");
            break;
        case 1:
            printf("終了!\n");
            break;
        defaul:
            printf("入力エラー!\n");
            break;
    }

    return 0;
}

defaultの綴りが間違っています。

良く見てみると、コンパイル時にwarning(警告)が表示されています。

<コンパイル結果>

warning C4102: 'defaul' : ラベルは 1 度も参照されません。

警告については「警告とエラーの違い」を見てください。

この警告に気づかず、実行してしまうと、「入力エラー!」という表示が出てきません。

default(デフォルト)とdefaul(スペルミス)はまったく違うものです。

defaul(スペルミス)では、本来のデフォルトの動作はしません。

では、なぜエラーにならないのでしょうか?

これは、ラベルには(変数名と同様の規則がありますが)自分で名前をつけても良いからです。

こう書くと誤解を招くかも知れません。

caseラベルやdefaultラベルの名前を勝手に変えることは出来ません。

本来のラベルの意味については、大分後で説明することになりますので、switch文の中では、caseラベルかdefaultラベルを使うと覚えておきましょう。

※Visual Studioでは、重要な語句(キーワード)は青文字で表示されますので、間違えば気づけるはずです。

※キーワードについては、「C言語キーワード一覧」を見てください。


次へ

戻る

目次へ