26.1.6.3 規則性を

このプログラムの頭のところだけ見てみましょう.

if (n <= p+31) {m=1; d=n-p;} else {p=p+31;
if (n <= p+28) {m=2; d=n-p;} else {p=p+28;
if (n <= p+31) {m=3; d=n-p;} else {p=p+31;
 ... ...

月の値(m)は規則正しく1ずつ増加していますが,月の日数はそうではありません.

いま仮に,12個の変数,あるいは定数c1, c2, c3, ..., c12があって,c1には1月の日数(31)が,c2には2月の日数(28)が,c3には3月の日数(31)が,というぐあいに,ckにはk月の日数が入っているものとしましょう.そうすれば上に示した部分は

if (n <= p+c1) {m=1; d=n-p;} else {p=p+c1;
if (n <= p+c2) {m=2; d=n-p;} else {p=p+c2;
if (n <= p+c3) {m=3; d=n-p;} else {p=p+c3;
  ... ...

となり,大分スマートになってきました.しかしまた,12行書く必要があり,forやwhileによる繰返しの格好には書けません.どうしてそうなのか,考えてみましょう.