閏年の判定式(Objectiv-C if文)
自分が作りたいアプリには直接関係なさそうだけど、閏年判定の話。
「Xcode 4ではじめるObjective-Cプログラミング 改訂第2版」の中に閏年判定について書いてあって、あぁこれの判定式(パターン1)は簡単で良いと思ったので、自分であえて考えてみためんどくさいパターン(パターン2)と比較してメモ。ちょっと考えると単純で簡単そうな閏年の判定が意外と深いことが分かった。
- (void)viewDidLoadの中の[super viewDidLoad]の下に以下を記載し実行。
// 4で割り切れる → 閏年
// 100で割り切れる → 平年
// 400で割り切れる → 閏年
int year;
year = 2013;
//パターン1
if (year % 4 == 0){
if (year % 100 == 0){
if (year % 400 == 0){
NSLog(@"パターン1-1: %d年は閏年", year);
} else {
NSLog(@"パターン1-2: %d年は平年", year);
}
} else {
NSLog(@"パターン1-3: %d年は閏年", year);
}
} else {
NSLog(@"パターン1-4: %d年は平年", year);
}
//パターン2
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
NSLog(@"パターン2-1: %d年は閏年", year);
} else {
NSLog(@"パターン2-2: %d年は平年", year);
}
正しく書かれていれば、エディターエリアの右下に
パターン1-4: 2013年は平年
パターン2-2: 2013年は平年
と出るはず。13行が5行になった。
(メモ)
下の図の緑色の部分が閏年、それ以外が平年。
パターン1の場合、
・最初のifで「4で割り切れる枠」で囲って、
・2番目のifで「100で割り切れる枠」で囲って、
・3番目のifで「400で割り切れる枠」で囲って、
400で割り切れる → 3番目のif枠の内(3) → 閏年(パターン1-1)
400で割り切れない → 2番目のif枠の内で3番目のif枠の外(2) → 平年(パターン1-2)
100で割り切れない → 1番目のif枠の内で2番目のif枠の外(1) → 閏年(パターン1-3)
4で割り切れない → 1番目のif枠の外(4) → 平年(パターン1-4)
とめんどくさいしややこしい。
パターン2の場合、
・最初のifで一度に(1)と(3)を切り取って(*下の2つをORで結んでいるので、その両方が閏年。)
year % 4 == 0 && year % 100 != 0 → (1)の部分 → 閏年
year % 400 == 0 → (3)の部分 → 閏年
切り取った部分以外の部分(2)と(4) → 平年
としてる。簡単。