题目描述
已知2007年1月1日为星期一。
设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。
为完成此函数,设计必要的辅助函数可能也是必要的。其中输入为年分和月份。
注意:短线“-”个数要与题目中一致,否则系统会判为错误。
样例输入
2010 9
样例输出
思路:先算出输入的这一年的1号是星期几,然后算出这一月的1号是星期几,然后用格式控制输出即可。
#include <bits/stdc++.h>
using namespace std;
int judge(int year)//闰年判断
{
if(year%400==0||(year%4==0&&year%100!=0))
return 1;
else
return 0;
}
int main()
{ int i,year,month,d=1;//d表示当前是星期几
cin>>year>>month; //输入年year 月monrh
for(i=2007;i<year;i++)
{ if(judge(i))
d=(d+366)%7;
else
d=(d+365)%7;
} //循环完毕后d就变为year这一年的1月1日是星期几
for(i=1;i<month;i++)
{ switch(i)
{ case 2: if(judge(year)) d=(d+29)%7; else d=(d+28)%7;break;
case 4:
case 6:
case 9:
case 11:d=(d+30)%7; break;
default:d=(d+31)%7; break;
}
} //循环完毕后d就变为month这个月1号是星期几
int count=1,sum,flag=0,j;//count计数 sum表示这个月总共多少天 flag标志变量
switch(month)//计算这个月有多少天
{ case 2: if(judge(year)) sum=29; else sum=28;break;
case 4:
case 6:
case 9:
case 11:sum=30; break;
default:sum=31; break;
}
if(month>=10)
printf("Calendar %d-%d\n",year,month);
else printf("Calendar %d-0%d\n",year,month);
printf("---------------------\n");//打印日历头部
printf(" Su Mo Tu We Th Fr Sa\n");
printf("---------------------\n");
for(i=0;i<d;i++)//如果这个月1号不是星期日 每次打印3个空格
printf(" ");// 直到找到应该写入1号的正确星期位置
for(i=d;i<=6;i++)//从1号开始打印第一行
printf("%3d",count++);
printf("\n");
for(i=1;i<=4;i++)//剩下可能3行或4行 最多不超过4行
{ for(j=0;j<7;j++)
{ printf("%3d",count++);//每行打印7个数
if(count>sum)//如果数到该月份的总天数之后
{flag=1;break;//标记为1 跳出 停止打印
}
}
printf("\n");
if(flag)//如果该月份所有天数已经打印完毕
break;//跳出
}
printf("---------------------\n");//打印底部
return 0;
}