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;
}