C语言实现农历万年历

C语言实现农历万年历

ID:38849461

大小:539.26 KB

页数:48页

时间:2019-06-20

C语言实现农历万年历_第1页
C语言实现农历万年历_第2页
C语言实现农历万年历_第3页
C语言实现农历万年历_第4页
C语言实现农历万年历_第5页
资源描述:

《C语言实现农历万年历》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、2016年全新原创C语言实现农历万年历paradise300C语言实现农历万年历一、前言我曾经在网上搜索过C/C++实现的农历万年历,那时,我刚想着要写一款自己的桌面小工具,希望它包含公、农历转换,节气查询等功能,找到的无非有两个版本,其中一个写于2000年,数据经过压缩,有节气信息,另一个,则是只有农历,没有节气。而且看到他们使用的数据,都是通过自己的努力,从日历中收集并整理出来,从1901年到2050年这150年,很是费工夫。近段时间,当我在整理资料,发现当时的代码时,就又拿起了这两份代码,总觉得写得不够好,一是它

2、的数据压缩率明显不够大,二是代码效率不够高,于是决心用自己的方法实现一款全新的农历万年历(源代码见最后一部分)。二、实现方式1/482016年全新原创C语言实现农历万年历paradise300要实现一个完整的万年历需要具备以下几点内容:1.星期2.公历每个月总天数3.农历正月初一对应的公历日期4.农历每个月的总天数5.农历闰月6.二十四节气7.数九、梅雨、三伏8.干支为了表达公历与农历的对应关系,本文引入了“年内序数”这一概念,它指的是距离公历1月1日的天数,即1月1日的年内序数为0,1月2日的年内序数为1,以此类推,

3、由于农历新年滞后于公历元旦,年内序数将被扩展到上一年,因此会出现负数,这是由于参考点选择不同引起的,比如,要描述上一年的冬至,则被转化为当前年份的年内序数为-10,表示上一年冬至在今年元旦之前10天。通过对年内序数的使用,就可以使整个对应关系得到简化。2/482016年全新原创C语言实现农历万年历paradise300星期的计算,普遍采用的公式是:W=[Y-1]+[(Y-1)/4]-[(Y-1)/100]+[(Y-1)/400]+DY是年份,D是这一天在这一年中的年内序数加1,也就是这一天在这一年中是第几天。这个公式验

4、证了一下是可行的。公历每个月的天数大小还算固定,只要通过判断闰年来区分2月天数即可,还是非常简单的。从第3点至第7点,这些是没有简单规律的,对于一般需求,用查表法可以解决,即节省空间,又提升效率,两全齐美。第三部分中将给出详细数据,以及对数据的解释。三、数据为了兼顾空间(数据大小)和时间(运行效率),我也是下足了工夫。首先,通过对公历正月初一的统计,发现从公元1600年到6400年之间,最早出现在19(即1月20日),最晚出现在51(2月21日),两者之差为32,即需要6个位来描述,6个位的范围从0到63,足够描述从1

5、9到51了。农历闰月从正月到十二月,转换为数字即1到12,0表示无闰月,总的范围是即从0到12,需要4个位。而农历月份大小是比较规范,大月30天,小月29天,因此可以用1个位来表示农历一个月的天数,月份大小信息可以描述为13个位。综合以上几项数据,最为经济的存储方式就是把这几项合在一起,总共23位数据,可以用3个字节来存储。简而言之,一个农历年的信息可以用3个字节来保存。农历数据:第23位第22至17位第16至13位第12至0位保留农历正月初一的年内序数闰月月份大小信息因此,农历数据使用24个位,即3字节。上述四个块,

6、分别有如下含义:3/482016年全新原创C语言实现农历万年历paradise300①保留位始终为0;②农历正月初一距离公历元旦的天数;③0表示无闰月,1至12表示闰月月份;④从低位到高位分别对应从正月到(闰)十二月的每个月的大小,“1”表示大月,即该月有30天,“0”表示小月,即该月有29天。以1900年为例:数据:0x3D,0x16,0xD2,组合起来为:0x3D16D2,展开为二进制:01111010001011011010010。二进制位01111010001011011010010十二月大十一月小十月大九月大

7、正月初一年内序闰八月小数30八月大含义保留闰八月七月大转为日期为六月小1900年1月31五月大日四月小三月小二月大正月小有了上述数据,可以轻松得推算出农历某一天的公历日历和公历某一天的农历日期,转换非常方便。4/482016年全新原创C语言实现农历万年历paradise300其次,二十四节气那可真是要了我的命了,从1600年到6400年之间,变化很不规律,1个公历月中的两个节气,早的出现在1日和18日,晚的出现在8日和24日,主要原因这里暂且不说。以前那份代码中的存储方式,作者将其描述为变态的压缩方式,就是将每个月的两

8、个节气对应的日与15的差值,比如小寒在1月6日,大寒在1月20日,那么,15-6=9,20-15=5,所需要的位数为4位和3位,而在其它月份,第二个节气可能出现在23日,甚至24日,一减,得到8或9,这是需要4个位,综合考虑,该作者将两个节气均用4个位来存储,就变成1个字节存放1个月的两个节气,如此一来,一年需要12个字节,可想而

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。