ADV-216 5-3日历

问题描述
  已知2007年1月1日为星期一。设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。为完成此函数,设计必要的辅助函数也是必要的。
样例输入
一个满足题目要求的输入范例。
例:

2050 3
样例输出
与上面的样例输入对应的输出。
例:


数据规模和约定
  输入数据中每一个数的范围。

  例:年 2007-3000,月:1-12。


#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(year < 2007)
	{
		printf("The year must after 2007(inclued)!\n");
		return;
	}
	if(year > 9999)
	{
		printf("The year must before 9999(inclued)!\n");
		return;
	}
	/*检查输入的月份*/
	if(month < 0||month > 12)
	{
		printf("Illegal month : %d ! The month must range [0,12]");
	}

	/********************开始打印日历********************/
	/*日历年月头部*/
	if(month > 10)
	{
		printf("Calendar %d - %d\n",year,month);
	}
	else
	{
		printf("Calendar %d - %d%d\n",year,0,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<=daysOfMonth; d++)
	{
		if(daysCounter%7==0)
		{
			printf("\n");
		}
		printf("%2d ",d);

		daysCounter++;
	}
	printf("\n---------------------\n");
}
int main(int argc,char *argv[])
{

	int year,month;
	while(scanf("%d%d",&year,&month)!=EOF)
	{
		printCalendar(year,month);
	}
	return 0;
}
 

    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值