動機
学校のプログラミング演習の授業で出された課題で、「ifのところをすべてswitchで書け」というのが、意外と考え方として応用ができそうだなと思ったのでメモ。
やりたいこと
次のようなCのコードをswitchだけで書いてみたい:
only_if.c
#include <stdio.h>
int main(void)
{
int score;
//演習の点数が80点以上なら優、60点以上なら可、60点未満なら不可を出力する。
printf("あなたの演習の点数を入力してください--->");
scanf("%d", &score);
if(score >= 80){
printf("優");
}else if(score >= 60){
printf("可");
}else{
printf("不可");
}
return 0;
}
アイデア
例えば、score >= 60 のような条件式は、成立なら1、不成立なら0を返すのだった。このことを思い出せば、範囲を扱う不等式でも、ピンポイントの値で処理を振り分けるswitchがうまく使える。
実装
こんな感じ:
only_switch.c
#include <stdio.h>
int main(void)
{
int score;
//演習の点数が80点以上なら優、60点以上なら可、60点未満なら不可を出力する。
printf("あなたの演習の点数を入力してください--->");
scanf("%d", &score);
switch(score >= 80){
case 1:
printf("優");
break;
default:
switch(score >= 60){
case 1:
printf("可");
break;
default:
printf("不可");
break;
}
break;
}
/*
if(score >= 80){
printf("優");
}else if(score >= 60){
printf("可");
}else{
printf("不可");
}
*/
return 0;
}
まとめ
同じ範囲に属する値たちをすべてある値にマッピングするというのがここでの考え方のポイントでした。C言語以外でもこの考え方は活かせそうですね。
追記
caseの中でbreakを実行しなければ、後ろのcase文も実行されるという性質も使うと、次のように書くこともできます:
#include <stdio.h>
int main(void)
{
int score;
switch(score / 10 * 10)
{
case 100:
case 90:
case 80:
printf("優\n");
break;
case 70:
case 60:
printf("可\n");
break;
default:
printf("不可\n");
break;
}
return 0;
}