★分岐構造: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 VC++ Express Edition>
2から10までの整数を入力してください:2
素数
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
2から10までの整数を入力してください:4
合成数
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
2から10までの整数を入力してください:7
素数
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
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 VC++ Express Edition>
メニューを選択してください:0
開始!
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
メニューを選択してください:1
終了!
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
メニューを選択してください:2
入力エラー!
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
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(警告)が表示されています。
<コンパイル結果 VC++ Express Edition>
warning C4102: 'defaul' : ラベルは 1 度も参照されません。
警告については「警告とエラーの違い」を見てください。
この警告に気づかず、実行してしまうと、「入力エラー!」という表示が出てきません。
default(デフォルト)とdefaul(入力ミス)はまったく違うものです。
defaul(入力ミス)では、本来のデフォルトの動作はしません。
では、なぜエラーにならないのでしょうか?
これは、ラベルには(変数名と同様の規則がありますが)自分で名前をつけても良いからです。
こう書くと誤解を招くかも知れません。
caseラベルやdefaultラベルの名前を勝手に変えることは出来ません。
本来のラベルの意味については、大分後で説明することになりますので、switch文の中では、caseラベルかdefaultラベルを使うと覚えておきましょう。
※VC++ Express Edition では、重要な語句(キーワード)は青文字で表示されますので、間違えば気づけるはずです。
※キーワードについては、「C言語キーワード一覧」を見てください。