作业帮 > 综合 > 作业

求答 .4.已知2007年1月1日为星期一.设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/03/29 22:11:18
求答 .
4.已知2007年1月1日为星期一.设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印.
Calendar 2007-01
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
------------------------------------------------------
/*
Calendar 2007-01
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
------------------------------------------------------
*/
#include
/*表示星期的常量*/
const int Su = 0;
const int Mo = 1;
const int Tu = 2;
const int We = 3;
const int Th = 4;
const int Fr = 5;
const int Sa = 6;
/*日历开始年份,默认是 2007 年*/
const int START_YEAR = 2007;
/*日历开始月份,默认是 1 月*/
const int START_MONTH = 1;
/*日历开始月份,默认是 1 号*/
const int START_DAY = 1;
/*日历开始的星期,默认是星期一(2007年1月1日是星期一)*/
const int START_WEEK_DAY = Mo;
/*
功能:计算一年中指定月份的天数
*/
int calDaysOfMonth(int year ,int month)
{
const int daysOfMonth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

if( month == 2 && ( (year%4==0 && year%100!=0) || year %400==0 ))
{
return daysOfMonth[month] +1;
}
else
{
return daysOfMonth[month];
}
}
/*
功能:计算距离 START_YEAR : START_MONTH : START_DAY 的天数
输入:年year,月month,日day
输出:距离 START_YEAR : START_MONTH : START_DAY 的天数
*/
int calDateInterval(int year ,int month , int day)
{
int days = 0 ;
int y,m,d;

/*加上整年的天数*/
for(y = 2007 ; y < year ; y ++)
{
/*如果是闰年*/
if((y%4==0%y%100!=0) || y%400==0)
{
days += 366;
}
else
{
days += 365;
}
}
/*加上整月的天数*/
for(m = 1 ; m < month ; m ++)
{
days += calDaysOfMonth(year,m);
}

/*加上当月的天数*/
days += ( day - 1 );

return days;

}
/*
功能:计算每月第一天所在的星期
*/
int calFirstDayOfMonthInWeekDay(int year ,int month)
{
int days = calDateInterval(year,month,1);

return (days % 7 + START_WEEK_DAY) % 7;
}
void printCalendar(int year,int month)
{
int firstDayOfMonthInWeekDay = 1;
int daysOfMonth;
int daysCounter;
int d;

//
/*日历年月头部*/
if(month > 10)
{
printf("Calendar %d-%d\n",year,month);
}
else
{
printf("Calendar %d-%0d\n",year,month);
}
printf("------------------------------------------------------\n");
/*日历星期头部*/
printf("Su Mo Tu We Th Fr Sa\n");
printf("------------------------------------------------------\n");
/*日历每天排列*/

/*每月的第一天所在的星期*/
firstDayOfMonthInWeekDay = calFirstDayOfMonthInWeekDay(year,month);
/*当月的天数*/
daysOfMonth = calDaysOfMonth(year,month);

/*输出每月开头空出的星期,并统计空白的星期*/
for(d = 0 ,daysCounter = 0; d < firstDayOfMonthInWeekDay ; d ++)
{
printf(" ");
daysCounter ++;
}
/*输出每月的天,根据所在的星期*/
for( d = 1 ; d