前回、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言語キーワード一覧」を見てください。