質問: 0)))){ 閏年の個数を数える } } for文変数の初期でfirst_yearを与えていますが、first_yearが開始年でend_yearが終了年です。 if文がむかつくほど長くなってしまいました。やっていることはyearが4で割り切れかつ100と400で割ったときに両方共に余りが出る、またはyearが4で割り切れかつ100と400で割ったときに両方共に余りが出ない場合に 閏年の個数を数える ようにしています。 かなり強引な質問ではありますが、みなさんならどのように組むでしょうか? 別に自分の考える”美しい”プログラムでなくてもかまいません。色々な考えを聞かせてもらえないでしょうか?
回答: プログラムを簡素で美しく記述する王道は、 ・何をするのかを日本語で簡潔にまとめる(整理する) → うるう年判定であれば、判定方法を整理します。 (1)4で割れる年をうるう年とする (2)100で割れる年は平年にする (3)400で割れる年はうるう年とする ・凝ったことをしようとしない。 → ビット操作とかポインタ操作とかできるのがcの醍醐味ですが、いわゆる「テクニック」を使わないほうが実は簡素で美しくなる傾向にあります。 これを心がけてうるう年判定関数を作ってみました。 bool is_leap(int year){ if(year % 400 == 0) return true; if(year % 100 == 0) return false; if(year % 4 == 0) return true; return false; } 書き方によっては実行速度がはやい方法もあるでしょうけど、うるう年関数なんかチューニングするより、他のアーキテクチャを見直したほうがよっぽど効果的です。 また、この関数であれば、3200年に一度うるう年でないことに対応 させたい(いわゆる仕様追加みたいな場面)ときに if(year % 3200 == 0) return false; を追加すればよいことが一目瞭然です。 複雑な条件式を書かずに素直に書くと、メンテが楽になりますね。