voidshow_year(int year)
{inti,j,k,t,n; // 用來輔助計數int table[24][21] = {0}; // 年歷數組int month_day[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 每月上限天數if ((0 == year%4 || 0 == year%400) && 0 != year%100) //閏年檢查,如果是閏年,2月上限天數改為29
{
month_day[2] = 29;
}
printf ("******************\n");
printf ("%d \n", year);
printf ("******************\n");for (i=0; i<12; i++) // 為了使邏輯更加清晰,一次循環只完成一個月的日期填寫,i為當前月份
{n=cal_first(i+1); // n為當前月份第一天的星期數,cal_first函數中的月數必須為1~12,for (j=(i/3)*6; j3)*6+6; j++) // 所以這里傳參時+1,j用來根據月數控制每個月在年歷數組中的第一維坐標
{ // 坐標(縱坐標)的位置,同樣的,用來根據月數控制每個月在年歷數組中for (k=(i%3)*7; k3)*7+7; k++) // 第二維坐標(橫坐標)的位置
{
t= (j%6)*7 + k%7 - n + 2; // t用來臨時記錄當前位置應該填入年歷數組的值,為了簡化邏輯,這里通過if (0 >=t) // 數學計算記錄每一個位置應填入的值,(j%6)*7 + k%7計算出的值是本
{ // 月的第幾個位置,-n+2就會計算出當前格內正確的日期。這樣做會導致得出continue; // 負數或0,或炒熟每月天數上限,我們用if + continue將其跳過,這樣
} // 不正確的日期就依然是年歷數組初始化時的0if (t <=month_day[i])
{
table[j][k]=t;
}else{continue;
}
}
}
}for (i=0; i<24; i++) // 至此,年歷數組已經全部填好,接下來是打印環節,相信已經比較好理解了
{ // 每隔6行打印標頭,7列多打印幾個空格,遇到數組中為0則同樣打印空格if (0 ==i)
{
printf ("Jan Feb Mar\n");
printf ("Mon Tue Wen Thu Fir Sat Sun Mon Tue Wen Thu Fir Sat Sun Mon Tue Wen Thu Fir Sat Sun\n");
}if (6 ==i)
{
printf ("Apr May Jun\n");
printf ("Mon Tue Wen Thu Fir Sat Sun Mon Tue Wen Thu Fir Sat Sun Mon Tue Wen Thu Fir Sat Sun\n");
}if (12 ==i)
{
printf ("Jul Agu Sep\n");
printf ("Mon Tue Wen Thu Fir Sat Sun Mon Tue Wen Thu Fir Sat Sun Mon Tue Wen Thu Fir Sat Sun\n");
}if (18 ==i)
{
printf ("Oct Nov Dec\n");
printf ("Mon Tue Wen Thu Fir Sat Sun Mon Tue Wen Thu Fir Sat Sun Mon Tue Wen Thu Fir Sat Sun\n");
}for (j=0; j<21; j++)
{if (7 == j || 14 ==j)
{
printf (" ");
}if (0 ==table[i][j])
{
printf (" ");continue;
}
printf ("%4d", table[i][j]);
}
printf ("\n");
}
}