switch文
値そのもので分けるとき
前回の else if は「90以上」「80以上」のような範囲の判定に向いています。一方で、前回付けたランクごとにコメントを出し分けたいときは、範囲ではなく「A のとき」「B のとき」という値そのものの一致です。こういうときは switch 文が読みやすくなります。
switch (rank) {
case 'A':
printf("素晴らしい成績です\n");
break;
case 'B':
printf("よくできています\n");
break;
default:
printf("不明なランクです\n");
break;
}switch の丸かっこの値と、各 case のうしろの値を上から順に照合し、一致したところへ飛びます。どれにも一致しなければ default へ行きます。default は省略できますが、else if の最後の else と同じで、想定外の値を受け止める場所として必ず書いてください。
case に書けるのは定数だけ
switch に渡せるのは整数として扱える値です。int と char が代表です。double は使えません。また case のうしろに書けるのは、コンパイルの時点で値が決まっている定数だけで、case score: のように変数を書くことも、case > 80: のように範囲を書くこともできません。範囲で分けたいときは else if の出番です。
文字は 'A' のようにシングルクォートで囲みます。ダブルクォートの "A" は文字列で別物なので、ここでは使えません。
break を忘れると下へ落ちる
switch の最大の落とし穴がこれです。case は「そこへ飛び込む入口」でしかなく、区切りではありません。break に出会うまで、下の case のラベルを無視してそのまま実行を続けます。これをフォールスルーと呼びます。
char rank = 'B';
switch (rank) {
case 'A':
printf("1");
case 'B':
printf("2");
case 'C':
printf("3");
break;
case 'D':
printf("4");
}出力は 23 です。'B' の入口から入り、break が無いのでそのまま case 'C' の中身まで実行し、そこの break でようやく抜けます。コンパイルエラーにはならないので、テストするまで気づけません。各 case の最後に break を書く、を体で覚えてください。
要件
- scanf の書式は " %c" にして、char 型の変数へ読み込む
- まず「ランクはAです」の形で表示する
- A は「素晴らしい成績です」、B は「よくできています」、C は「合格ラインです」、D は「もう一息です」、F は「再履修が必要です」
- どれにも当てはまらない文字のときは「不明なランクです」と表示する
- if ではなく switch と case で書き、各 case に break を付ける
入出力例
main("A") → "ランクはAです
素晴らしい成績です"
main("B") → "ランクはBです
よくできています"
main("D") → "ランクはDです
もう一息です"
main("F") → "ランクはFです
再履修が必要です"
main("X") → "ランクはXです
不明なランクです"