RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

(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