輸入年份,列印出該年的日曆: #include <stdio.h> void PrintEnter(int mod); void PrintSkip(int lastday); void PrintTitle(int year,int month); int JudgeDays(int year, ...
輸入年份,列印出該年的日曆:
#include <stdio.h> void PrintEnter(int mod); void PrintSkip(int lastday); void PrintTitle(int year,int month); int JudgeDays(int year, int month); void PrintMonth(int year, int mod, int lastday); int main() { int year; //每一個月的最後一天 int lastday = 1; printf("請輸入年份:"); scanf("%d",&year); //判斷這一年的第一天為星期幾 //公式: (5(year-1)/4-(year-1)/100+(year-1)/400)%7+1 int flag = (5 * (year-1) / 4 - (year-1) / 100+(year-1)/400) % 7+1; //計算開頭有幾個\t int skip = flag - 1; //判斷是否需要換行 判斷每月最後一天 int mod = skip; //直接調用PrintMonth函數列印月曆 PrintMonth(year,mod,lastday); return 0; } /** * @brief JudgeDays 判斷月份的天數 * @param year 判斷年份是否為閏年 * @param month 需要判斷的月份 * @return 返回值為月份的天數 */ int JudgeDays(int year, int month) { if(month==4||month==6||month==9||month==11) return 30; else if(month==2) { //判斷年份是否為閏年 if(year % 400 == 0 || (year % 100 !=0 && year % 4 == 0)) return 29; else return 28; } else return 31; } /** * @brief PrintTitle 列印月份的開頭 * @param month 需要列印的月份 */ void PrintTitle(int year, int month) { printf("\n"); printf("%d年%d月\n",year,month); printf("--------------------------------\n"); printf("一 二 三 四 五 六 日\n"); } /** * @brief PrintSkip 解決每一月開頭的空格問題 * @param lastday 上一月份的最後一天 */ void PrintSkip(int lastday) { int i; for(i = 0;i < lastday;i++) { printf(" "); } } /** * @brief PrintEnter 判斷是否換行 * @param mod 換行的標誌(判斷是否是七的倍數) */ void PrintEnter(int mod) { if(mod % 7 ==0) printf("\n"); } /** * @brief PrintMonth 列印月曆 * @param year 月曆的年數 * @param mod 換行的標誌 * @param lastday 每個月最後一天的標識 */ void PrintMonth(int year, int mod, int lastday) { //列印月曆的頭 PrintTitle(year,1); //列印空格 PrintSkip(lastday); //列印一月月曆 int i; for(i = 1;i <= 31;i++) { mod++; printf("%-5d",i); //換行 PrintEnter(mod); //判斷一月的最後一天 if(i == 31) lastday = mod % 7; } //每列印一個月換一行 printf("\n"); int month; for(month = 2;month < 13;month++) { //列印月曆的頭 PrintTitle(year,month); //列印空格 PrintSkip(lastday); //列印二月到十二月的日曆 int i; for(i = 1;i <= JudgeDays(year, month);i++) { mod++; printf("%-5d",i); //換行問題 PrintEnter(mod); //判斷每月的最後一天 if(i == JudgeDays(year, month)) lastday = mod % 7; } //每列印一個月換一行 printf("\n"); } }