打印

转:[原创]万年历另类算法(长)

[复制链接]
1786|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
杜_U_ME|  楼主 | 2011-10-30 14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两星期来的课程设计,现拿出来和大家一起探讨,因将考试,不再详细编辑。希望可以给大家带来帮助。1.算法分析

本设计的目的主要是从键盘输入年月信息,并在液晶屏上显示该年月的月历信息,那么只要知道该月第一天的星期值和天数,就可以将月历排列并显示出来。

经分析发现各年1月1日的星期值有如下规律:


1950.1.1


1951.1.1

1952.1.1
(闰年)
1953.1.1
1954.1.1
1955.1.1



星期日
`
星期一


星期二

星期四

星期五

星期六




1956.1.1
(闰年) 1957.1.1
1958.1.1
1959.1.1
1960.1.1


星期日

星期二
星期三
星期四
星期五

也就是说紧挨着的两年,如果前一年是平年,那么后一年的第一天(1月1日)在星期(7天)的排列上肯定比前一年的第一天(1月1日)推后一天;如果前一年是闰年,那么就是推后两天。比如2007年1月1日是星期一,因为2007年是平年,所以2008年1月1日就是星期二;又因为2008年是闰年,所以2009年1月1日就是星期四。依次类推就可以知道任意一年的1月1日的星期值。以上规律可以用一个式子来计算:


在本设计中,我们以1950年为起点(1950年1月1日为星期日,定其星期值为0),输入年份为NNNN,设NNNN年1月1日的星期值为firsr,那么有:


First=
((NNNN-1950)+(NNNN-1950+1)/4)%7

若first=3,就说明NNNN年1月1日是星期三。

另外,一年内各个月的第一天(1日)相对于该年1月1日在星期的排列上也是有规律的。分析如下:

设NNNN年1月1日的星期值是first,该年YY月1日的星期值为yihao,那么这两者之间有如下关系:


yihao=(first+a)7
(a=P[YY-1]或a=R[YY-1],P[]={0,3,3,6,1,4,6,2,5,0,3,5}

R[]={0,3,4,0,2,5,0,3,6,1,4,6}

若YY=4,如果NNNN为平年,则yihao=first+6;如果NNNN为闰年,则yihao=first+0。

每个月的天数可以很容易得出,而2月的天数只要根据当年是否为闰年来取值。

通过以上前两步就可以求出所输入年月的第一天的星期值,再根据第三步所求得的天数,可以在屏幕上显示月历信息。








2.月历算法子程序





/********************************************************************

*名称:FirstDay()

*功能:求取所输入年月的第一天(1号)相对于该年1月1号的星期值的偏移量。

*入口参数:year--所输入的年份


month--
所输入的月份

*出口参数:firstday--该月1号的星期值

********************************************************************/

uint8
FirstDay(uint16 year,uint8 month)



{



uint8 firstday,January;



uint8 yyh1[12]={0,3,3,6,1,4,6,2,5,0,3,5};
/*
平年每月第一天的星期值相对于



该年1月1号星期值的偏移量*/


uint8 yyh2[12]={0,3,4,0,2,5,0,3,6,1,4,6};

/*
闰年每月第一天的星期值相对



该年1月1号星期值的偏移量 */

January=((year-qidian)+(year-qidian+1)/4)%7;
//
求取该年1月1日的星期

值(1950年 1月1号的星期值为0)



if(year%4)


firstday=yyh1[month-1];
//
平年偏移量



else



firstday=yyh2[month-1];
//
闰年偏移量



firstday=(firstday+January)%7;
//
求取该月1日的星期值




return(firstday);
//
返回该月1日的星期值



}

相关帖子

沙发
米其林r| | 2011-10-30 18:35 | 只看该作者
收藏了!

使用特权

评论回复
板凳
pkat| | 2011-11-7 22:43 | 只看该作者
学C语言时编的最多的就是这个了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

640

帖子

1

粉丝