//本代码不考虑历法问题,设定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");
以下为完整代码:
#include<stdio.h>
int 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;
}
执行结果如下: