(C#)数値で場合分けするときは、配列を使うことができる
解説
1月は31日まであり、2月は28,29日あり、3月は31日まであります。これは、
- 1 → 31
- 2 → 28か29
- 3 → 31
- 4 → 30
のような数字と数字のマッピングだという事ができます。
今回は、年と月→その月が何日まであるか、という関数を2つの方法で実装します。
① 月によって条件分岐して場合分けをする。
② 配列のアクセスで場合分けをする。
コード①
static int DaysOfMonth1(int year, int month) { if (month == 2) { if(year % 100 == 0) { return 28; // 2月、XX00年 } if(year % 4 == 0) { return 29; // 2月、4年に一度 } return 28; // 2月、うるう年ではない } if (month == 4 || month == 6 || month == 9 || month == 11) { return 30; // 小の月は2,4,6,9,11月 } return 31; // 大の月は1,3,5,7,8,10,12月 }
これでも悪くはないのですが、配列を使うとさらに美しく実装できます。
コード②
static int[] ARY = {0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; static int DaysOfMonth2(int year, int month) { if(month != 2) { return ARY[month]; } if(year % 100 == 0) { return 28; } if(year % 4 == 0) { return 29; } return 28; }
速度
120000ループして時間を計測しました。
コード① 10ms~13ms
コード② 8ms~11ms
配列で場合分けしたほうが、やや速いです。なお、ARYを関数内で定義すると、遅くなります。
補足
地球の公転周期が何かしらの事故で変化した場合、このコードは書き替える必要があるため、普段プログラムを書くときは、以下の方法をお勧めします。ただし、120000ループの速度は 74ms~94ms と低速です。
rcie.hatenablog.com