C语言编写万年历
不包括1900年之前
第一次编写万年历,以1900年1月1日周一为基准
计算思路,计算所查年月到1900年的天数,对天数除7取余,得到每月1日对应周几,再根据每月天数控制打印。
## 天数计算 ##
- 假设每年365天,计算当前年份到1900年初始天数
- 计算当前年份与1900年有多少个闰年,每个闰年为初始天数增加一天,得到修正天数
- 以上计算未考虑所查年份从1月1日开始到所查月份1日之间相差的天数,因此再次修正,考虑闰年和平年的区别,以及闰年2月与平年2月的差别
打印控制
- 屏幕上先打印出
- %d年%d月
一 二 三 四 五 六 日 - 打印第一行,考虑空格
- 打印剩余天数
代码如下
#include<stdio.h>
#include<stdlib.h>
int main()
{
int leap(int i);//判断是否是闰年
int monthday(int i);//判断每月对应天数
int monthcal(int i);
int year=0,month=0;
int i=0,j=0;
int k=1;
int day=0,week=0;
int m=0,n=0;
int md=0;//用于输出时控制每月天数
printf("Please input year and month:\n");
scanf("%d%d",&year,&month);
while(getchar()!='\n');//接收年月,并消除错误输入
if(year<1900||month<1||month>12)
{
printf("wrong input!!!\n");
exit(1);
}
//for循环确定闰年个数
for(j=year;j>=1900;j--)
{
if(leap(j)>0)
i++;
//leap(j)?i++:;//调用leap函数判断是否是闰年
}
day+=(year-1900)*365+i+1;
if(leap(year)>0)
{
if(month>2)
day+=(monthcal(month)+1);
else if(month<=2)
day+=monthcal(month);
}
else
day+=monthcal(month);
printf("%d\n",day);//检查天数
week=day%7;
if(!week)
week = 7;
printf("%d\n",week);//检查确定日期的星期是否符合
//输出至屏幕
printf(" %d年%d月 \n",year,month);
printf(" 一 二 三 四 五 六 日\n");
//打印第一行,先打印空格
for(m=0,n=0;n<week-1;n++)
printf(" ");
for(n=week-1;n<7;n++,++k)
printf("%3d",k);
printf("\n");
//确定打印天数
if(leap(year)>0)
{
if(2==month)
md=29;
else
md=monthday(month);
}
else
md=monthday(month);
//打印剩余天数
for(m=1;m<6;m++)
{
for(n=0;n<7;n++,++k)
{
if(k<=md)
printf("%3d",k);
}
printf("\n");
}//printf("%d",md);检查md的值
return 0;
}
int leap(int i)//判断是否是闰年
{
if(!(i%4)&&i%100||!(i%400))
return 1;
else
return -1;
}
int monthday(int i)//判断每月对应天数
{
switch(i)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
return 31;
break;
case 4:case 6:case 9:case 11:
return 30;
break;
case 2:
return 28;
break;
}
}
int monthcal(int i)
{
int m=0;
switch(i)
{
case 1:
m=0;
break;
case 2:
m=31;
break;
case 3:
m=31+28;
break;
case 4:
m=31+28+31;
break;
case 5:
m=31+28+31+30;
break;
case 6:
m=31+28+31+30+31;
break;
case 7:
m=31+28+31+30+31+30;
break;
case 8:
m=31+28+31+30+31+30+31;
break;
case 9:
m=31+28+31+30+31+30+31+31;
break;
case 10:
m=31+28+31+30+31+30+31+31+30;
break;
case 11:
m=31+28+31+30+31+30+31+31+30+31;
break;
case 12:
m=31+28+31+30+31+30+31+31+30+31+30;
break;
}
return m;
}