一.基本思路
1.日历的大致形状
2.细节的实现
(1)首先需要打印年月和月历的周一到周日
(2)判断每个月的1号是周几,这样利用固定的算法就可以依次求出
2、3、4、、、等是星期几
(3)其中还需要判断在什么时候进行换行处理。以及判断 是否是润年
。
二.代码实现
1.标题的输入和输出这个可以很简答就写出来
2.判断每个月的1号是周几
其中有一个固定的公式:
temp=(y-1)+ (y-1)/ 4 - (y-1)/100+(y-1)/400+days
week = temp%7
注释:y代表年数;days表示这一年的第几天;
例如2014年1月1号,
temp = 2014-1 + (2014-1)/ 4 - (2014-1) / 100 + (y-1) / 400 + 1
week = temp%7
计算出来就是周三
3.现在又出来一个问题,已知年月日如何计算days呢?
(1)判断是否是润年
(year % 4 == 0 && year % 100 !=0 ) || ( year % 400 == 0);若为真则是闰年
(2)从1到12月份,每个月的天数是知道的
可以将其写入到一个数组中,然后利用switch选择相应的case。
m[11] = {31,28,31,30,31,30,31,31,30,31,30,31}
switch month {
case 1:
days = ;
break;
case 2:
判断是否是闰年
for循环
................
4.接下来输出其他日子
(1)1号位置的确定
利用for循环,输出空格
(2)换行问题
再次利用for循环,如果(week+日数-1 % 7) == 0,为换行判断条件。
(3)日数递增的临界条件
即每个月的最后一天是多少。
代码如下:
#include<stdio.h>
#define bool int//自定义bool类型
#define true 1
#define false 0
bool IsLeap(int year);
int GetWeek(int year,int month);
void main()
{
int y,m,week,i;
printf("输入yyyy-mm:");
scanf("%d%d",&y,&m);
printf(" %d年%d月\n",y,m);
printf("=====================\n");
printf(" 一 二 三 四 五 六 日\n");
week = GetWeek(y,m);
if(week == 0)
week = 7; //若week == 0,将其视作7,以便留下足够的空格
for (i = 1;i < week; i++)
{
printf(" "); //三个字符为一个单位,保证第一行与周数对应
}
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//以数组方式统计每个月的天数
if (IsLeap(y) == true) //若为闰年,将2月份的天数修改为29
month[1] = 29;
for(i=1;i<=month[m-1];i++) //利用for循环,依次输出日数,并且若加上通过计算week+i-1%7来判断是否该换行
{
printf("%3d",i);
if((i+week-1) % 7 == 0)
printf("\n");
}
printf("\n=====================\n");
}
bool IsLeap(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))//判断是否为闰年的条件
return true;
else
return false;
}
int GetWeek(int year,int month)
{
int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //以数组记录每个月的天数
int day=0,week,i;
switch (month)
{
case 1:
day = 1;
break;
case 2:
day = m[0] + 1;
break;
case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12:
if (IsLeap(year) == true)
m[1] = 29;
for (i=0;i<month-1;i++)
{
day = day + m[i];
}
day = day + 1;
break;
}
week = ((year-1) + (year-1)/4 - (year-1)/100 + (year-1)/400 + day) % 7;
return week;
}