📄 单片机万年历.c
字号:
#include "stdio.h"
#include "math.h"
#include"stdlib.h"
int year;
int month;
int h,k,j;
int main()
{
/*定义输入变量,利用年月的值可求得每月的第一天与2006年1月相差的天数,由权威
资料得知公元2006年1月1日是星期一,所以可以利用相差的天数求出每月第一日的星
期数,然后确定这一月的每一天的星期数,从而实现万年历的算法.*/
char r;
do
{
printf("please input the year and month(just like:2006,8):");
scanf("%4d,%d",&year,&month);
if((month<1)||(month>12))
/*检查输入是否合法,若不合法跳出本次循环,重新循环*/
{
printf("输入有误,请按照格式重新输入.\n") ;
continue;
}
if(year>=2006)
up(year,month);
else
down(year,month);
dayin();
printf("\n");
printf("若退出,请输入q键+回车键,继续请按格式输入.\n");
r=getchar();/*可以根据输入的r,结束循环*/
}while(r!='q'&&r!='Q');
system("pause");
return 0;
}
int up()/*计算得出求2006后年历所需的数据h,j,k*/
{
int i ;
int now=0; /*now等于该年该月与2006年1月1日距离的天数*/
{
for(i=2006;i<year;i++)
/*先计算该年的1月1日于2006年1月1日距离的天数,逐年相加可以求出该值*/
{
if(((i%4==0)&&(i%100!=0))||(i%400==0))
now=now+366;
/*如果i年份是闰年,则now的值增加366*/
else now=now+365;
/*如果i年份不是闰年,则now的值增加355*/
}
if (((year%4==0)&&(year%100!=0))||(year%400==0))
/*若该年份是闰年,则该月第一日与该年第一日距离的天数由month的值
决定分别是0,(0+31),(0+31+29),(0+31+29+31),(0+31+29+231+30).....
该月的天数同时也由month的值决定*/
{
switch(month)
{
case 1 :
{
now=now+0;
j =31;
/* momth=1,第1月第1日与该年1月1日相距0天故now加上0,
1月全月共有31天*/
}
break;
case 2:
{
now=now+31;
j=29;
/* month=2,第2月第1日与该年1月1日相距0+31天
故now加上31,闰年的2月全月共有29天*/
}
break;
case 3:
{
now=now+60;
j=31;
}
break;
case 4:
{
now=now+91;
j=30;
}
break;
case 5:
{
now=now+121;
j=31;
}
break;
case 6:
{
now=now+152;
j=30;
}
break;
case 7:
{
now=now+182;
j=31;
}
break;
case 8:
{
now=now+213;
j=31;
}
break;
case 9:
{
now=now+244;
j=30;
}
break;
case 10:
{
now=now+274;
j=31;
}
break;
case 11:
{
now=now+305;
j=30;
}
break;
case 12:
{
now=now+335;
j=31;
}
break;
}
}
else
{
/*若该年份不是闰年,则该月第一日与该年第一日距离的天数由month的值
决定分别是0,(0+31),(0+31+29),(0+31+29+31),(0+31+29+231+30).....
该月的天数同时也由month的值决定*/
switch(month)
{
case 1 :
{
now=now+0;
j=31;
/* momth=1,第1月第1日与该年1月1日相距0天故now加上0
1月全月共有31天*/
}
break;
case 2:
{
now=now+31;
j=28;
/* month=2,第2月第1日与该年1月1日相距0+31天
故now加上31,非闰年的2月全月共有28天*/
}
break;
case 3:
{
now=now+59;
j=31;
}
break;
case 4:
{
now=now+90;
j=30;
}
break;
case 5 :
{
now=now+120;
j=31;
}
break;
case 6:
{
now=now+151;
j=30;
}
break;
case 7 :
{
now=now+181;j=31;
}
break;
case 8:
{
now=now+212;
j=31;
}
break;
case 9 :
{
now=now+243;
j=30;
}
break;
case 10:
{
now=now+273;
j=31;
}
break;
case 11:
{
now=now+304;
j=30;
}
break;
case 12 :
{
now=now+334;
j=31;
}
break;
}
}
h=(now%7)*8-1;
/*(now%7)的值是该月第一日的星期数(日,一,二...),为使日历排列整齐
在日历的第一排(第一日不是星期日时)空出h个空格,相邻俩数相隔8个空格*/
k=now;
}
}
int down()
{
int i ;
int now=0; /*计算得出求2006前的年历所需的数据h,j,k*/
{
for(i=2006;i>year+1;i=i-1)
/*先计算该年的1月1日于2006年1月1日距离的天数,逐年相加可以求出该值*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -