5. 输入年份和月份,输出该月日历,复杂问题的分解 /*输入年份和月份,输出该月月历*/ #include <stdio.h> /*声明函数GetWeekDay求某年某月某日是星期几*/ int GetWeekDay(int,int,int); /*声明函数GetMonthDays求某年某月共有几天*/ int GetMonthDays(int,int); /*声明函数PrintMonthCalender打印某月日历*/ int PrintMonthCalender(int,int); /*声明函数CheckLeap判断某年是否是闰年*/ int CheckLeap(int); main() { /*定义变量,startDay为要求月的第一天的星期数, *days为要求月的天数 */ int year,month,startDay,days; printf("input the year and month(YYYY-MM):"); scanf("%d-%d",&year,&month); printf("\n\t\t\t%d-%d\n",year,month); /*引用函数GetWeekDay求要求月的首天是星期几*/ startDay=GetWeekDay(year,month,1); /*引用函数GetMonthDays求要求月有多少天*/ days=GetMonthDays(year,month); PrintMonthCalender(startDay,days); return(0); } /*定义函数GetWeekDay求某年某月某日是星期几*/ int GetWeekDay(int year,int month,int day) { /*定义变量,days是从 *weekday是星期数,i是控制月份的变量 */ int days,weekday,i; days=year*365+year/400+year/4-year/100; /*计算从 for(i=12;i>=month;i--) days=days-GetMonthDays(year,i); /*计算从 days=days+day; /*计算该天的星期数*/ weekday=days%7; return weekday; } /*定义函数GetMonthDays求某年某月共有几天*/ int GetMonthDays(int year,int month) { /*对天数不同的月份分开讨论*/ if(month==4||month==6||month==9||month==11) return 30; else { /*单独对二月的讨论*/ if(month==2) { /*对闰年的判断*/ if(CheckLeap(year)) return 29; else return 28; } else return 31; } } /*定义函数PrintMonthCalender打印某月日历*/ int PrintMonthCalender(int startDay,int days) { int num,count; num=-startDay; printf("\nSun.\tMon.\tTue.\tWed.\tThu.\tFri.\tSat.\n"); /*控制输出的天数*/ while(num<=days) { printf("\n"); /*对一个星期七天的控制*/ for(count=1;count<=7;count++) { num=num+1; /*控制输出的天数*/ if(num>=1&&num<=days) printf("%d\t",num); else printf("\t"); } } printf("\n"); } /*定义函数CheckLeap判断某年是否是闰年*/ int CheckLeap(int year) { if((year%4==0&&year%100!=0)||(year%400==0)) return 1; else return 0; } 运行效果如图:
![]() |
|