//本代码不考虑历法问题,设定1年1月1日为星期一。
//以星期日为始。
//完整代码在最下方。
根据题意,我们首先需要接收年份的月份的数据。
printf("请输入年份:");scanf("%d",&Year);printf("请输入月份:");scanf("%d",&Month);
如果我们要知道指定月份的第一天是星期几,
那么我们就需要一个基准点,以该基准点为起始向后推算。
那么就可以用年份减一乘上365,即(Year-1)*365,这样就可以得到我们所输入的这个年份之前有多少天。
s=365*(Year-1);
但我们都知道,在年份中有一个特殊的存在——闰年,2月为29天,一年有366天。
而这个问题也很好解决,只需要判断此前的是否有闰年的存在,
若有则在总天数上加一即可。
for(i=1;i<Year;i++){//判断是否有闰年,若有则累计if(i%4==0&&i%100!=0||i%400==0){Count++;}}//由于闰年有366天,故每有一个闰年,我们就需要再日数上加一s=s+Count;
这样一来,我们就得到了指定年份之前的总天数,那么接下来就要计算指定月份之前的总天数了。
由于本题目要体现数组的应用,故我们把各月份的天数都保存到一个数组中。
为了在使用过程中,使得程序更加的简单明了,我们让数组的下标和月份相对应。
例如:Day[1]代表一月,有31天。
int Day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
回到此前的闰年问题,若指定年份为闰年,我们就需要将该年二月的天数改为29天。
//如果我们所输入的这年是闰年,则该年的二月是29天。if(Year%4==0&&Year%100!=0||Year%400==0){Day[2]=29;}
利用循环,将指定月份前的天数与之前的数据相加,就得到指定月份之前的全部天数。
即,我们求2022年12月的日历表,那么就计算出了从1年1月1日到2022年11月的全部天数之和。
//加上所输入的月份之前的日子,例如我们输入5月,则加上1,2,3,4月的天数for(i=0;i<Month;i++){s=s+Day[i];}
在完成了这些准备工作后,我们就可以开始输出了。
首先将第一行的星期输出:日 一 二 三 四 五 六
for(i=0;i<7;i++){switch(i){case 0:printf("日");break;case 1:printf("一");break;case 2:printf("二");break;case 3:printf("三");break;case 4:printf("四");break;case 5:printf("五");break;case 6:printf("六\n");break;}}
紧接着就是空白问题了,即如果我们所求的该月的第一天为星期五,则前面星期日到星期四的数据为空,用k来保存这个数据,并通过循环输出空格符达到空白的效果。
k=s%7;for(i=0;i<=k;i++){printf("");}
最后就可以输出我们需要的日期啦,值得注意的是,由于我们是以星期日为始,所以每当日期来到星期六时,我们就需要对其进行换行。
//输出我们所指定的月份的天数for(i=1;i<=Day[Month];i++){printf("%4d",i);//控制每个星期的换行//以星期六为末尾进行换行if((i+k+1)%7==0){printf("\n");}}printf("\n");
以下为完整代码:
#includeint main( ){int i,Count=0,k,Year,Month,s;//为了让序号和月份对应,我们这里的Day[0]设为0,月份从Day[1]开始计算。int Day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};printf("请输入年份:");scanf("%d",&Year);printf("请输入月份:");scanf("%d",&Month);//假设没有闰年存在,那么我们所输入的这年的第一天之前就有s日。s=365*(Year-1);for(i=1;i<Year;i++){//判断是否有闰年,若有则累计if(i%4==0&&i%100!=0||i%400==0){Count++;}}//由于闰年有366天,故每有一个闰年,我们就需要再日数上加一s=s+Count;//如果我们所输入的这年是闰年,则该年的二月是29天。if(Year%4==0&&Year%100!=0||Year%400==0){Day[2]=29;}//加上所输入的月份之前的日子,例如我们输入5月,则加上1,2,3,4月的天数for(i=0;i<Month;i++){s=s+Day[i];}//得到总共的星期数k=s%7;//输出第一行的数据:日 一 二 三 四 五 六 for(i=0;i<7;i++){switch(i){case 0:printf("日");break;case 1:printf("一");break;case 2:printf("二");break;case 3:printf("三");break;case 4:printf("四");break;case 5:printf("五");break;case 6:printf("六\n");break;}}//空白区域,例如我们需要的这个月的第一天是周二二,那么在此前的周日和周一则是空白的for(i=0;i<=k;i++){printf("");}//输出我们所指定的月份的天数for(i=1;i<=Day[Month];i++){printf("%4d",i);//控制每个星期的换行//以星期六为末尾进行换行if((i+k+1)%7==0){printf("\n");}}printf("\n");return 0;}
执行结果如下: