谁有将阳历转换成阴历的C语言程序代码啊

如题所述

我刚好有资源,这是我原创的程序,里面的数据压缩方式、转换、参考点等,都是自行设计的,能够准确地将公历转农历,将农历转公历,同时还提供一个自行设计的农历库,附带例程,还有农历信息提取工具,可以自定义年份区间(1600-7000)。

农历信息提取器生成的头文件(这里限于篇幅,只取10年跨度)

/*****************************************************
* 农历信息(查表方式)         *
* 生成时间:2014/12/25         *
*****************************************************/
#ifndef _LUNARDATA_H
#define _LUNARDATA_H
#define START_YEAR 1600 //定义数据起始年份(公历)
#define END_YEAR 1610 //定义数据终止年份(不包含该年)
short iPreLeapIndex=-1;//起始年份以前的农历闰月索引,对应iPreMonth中的序号,如果是-1则代表无闰月。
//从起始年份前一年的农历十月开始,每月初一对应在起始年份中的年内序数,
//序数小于零代表起始年份之前。
short iPreMonth[3]={-44,-15,15};
//每年农历正月初一的日期在公历年内的序数(年内序数指定元旦为0)。
unsigned char uLunarNewYearOrdinal[10]={
 44,33,22,41,30,48,37,27,46,34  //1600-1609
};
//月份大小数组,从“START_YEAR”的正月到“END_YEAR”前一年的(闰)十二月。
//每年十二或十三个月用两个字节表示,最高两位定为10,后面从正月开始到十二月,包含闰月。月份小的在前,
//1 0           0或1                         x x x x x x x x x x x x x
//1 0   12个月为0,13个月为1    从正月到十二月,月份天数29天则为0,月份天数30天则为1。
//注意,如果没有闰月,月份位为12位,总长度是15位,有闰月,月份位为13位,总长度是16位。
unsigned short LunarMonthDX[10]={
 0x4A5D,0x492D,0xB92B,0x4A95,0xB695,0x46AA,0x4AD5,0xAAB5,0x44BA,0x4A5B  //1600-1609
};
//闰月数组,用4位表示一个农历年内的闰月信息,一个字节表示相邻两年。
// x x x x   x x x x
//  年份①    年份②
unsigned char LeapMonth[5]={
 0x00,0x20,0x90,0x06,0x00  //1600-1609
};
//24节气数组,一年用12个字节表示,即每个月用一个字节(注意:此压缩算法适用于公元1600以后的数据)。
//如1901年的节气为:
//    1月      2月       3月       4月       5月       6月      7月       8月       9月       10月      11月      12月
//  6,  21,  4,  19,   6,  21,   5,  21,    6, 22,    6, 22,    8, 23,    8, 24,    8, 24,    8, 24,    8, 23,    8, 22
//  9,  6,   11,  4,   9,   6,   10,  6,    9,  7,    9,  7,    7,  8,    7,  9,    7,  9,    7,  9,    7,  8,    7, 15
//小寒 大寒 立春 雨水 惊蛰 春分 清明 谷雨 立夏 小满 芒种 夏至 小暑 大暑 立秋 处暑 白露 秋分 寒露 霜降 立冬 小雪 大雪 冬至
//这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放第二个节气的数据,可得下表:
unsigned char SolarTerms[120]={
 0x96,0x96,0x87,0x97,0x87,0x97,0x87,0x96,0x96,0x96,0x96,0x96, //1600
 0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x97,0x96,0x96, //1601
 0x96,0xA5,0x88,0x87,0x88,0x87,0x87,0x87,0x96,0x87,0x96,0x97, //1602
 0x96,0xA6,0x78,0x87,0x78,0x87,0x88,0x87,0x97,0x87,0x96,0x87, //1603
 0x96,0x96,0x87,0x97,0x87,0x97,0x87,0x96,0x96,0x96,0xA6,0x96, //1604
 0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x96,0x96,0x96, //1605
 0x96,0xA5,0x88,0x87,0x88,0x87,0x87,0x87,0x96,0x87,0x96,0x97, //1606
 0x96,0xA5,0x78,0x87,0x78,0x87,0x88,0x87,0x97,0x87,0x96,0x87, //1607
 0x96,0x96,0x87,0x97,0x87,0x96,0x87,0x96,0x96,0x96,0xA6,0x96, //1608
 0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x96,0x96,0x96  //1609
};
//每年数九、入梅、出梅及三伏日期(以该年元旦为基准)。
//公历年内首个是三九(适用于公元1600年以后)。
//数组中,每一行表示一年,四九、五九……省略,输在每个九相差9天,同理二九省略,中伏在初伏后10天。分别对应如下(括号中的已省略):
//三九 (四九 五九 六九 七九 八九 九九) 入梅 出梅 初伏 (中伏) 末伏 一九 (二九),注意:一九就是冬至。
unsigned short ExtermSeason[60]={
 8,165,190,199,219,355,7,159,196,193,223,355, //1600-1601
 7,164,191,198,218,355,8,159,198,193,223,355, //1602-1603
 8,164,193,198,218,355,7,158,199,202,222,355, //1604-1605
 7,163,194,197,227,355,8,158,189,202,222,355, //1606-1607
 8,163,196,197,227,355,7,167,190,201,221,354  //1608-1609
};
#endif //_LUNARDATA_H

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-08-06
推荐一个库给你吧,叫sxtwl_cpp (github上有,去那搜索一下) 你试一下看。转的范围还很广的
第2个回答  2014-12-20
百度文库里面有:http://wenku.baidu.com/link?url=ZNb5_A5sSqbbtujjONC_CVuovIwH15hJ1qRrCNHFdcFk2N7qZa1N151zYN_nf79WtmrWbj-8ktUcHrO4KSIAyx2eyUCTol5lqwAv1EVNo_G追问

一大坨错误

追答

错误不要紧,关键是要耐心debug

追问

恩恩,谢谢奥

追答

welcome

本回答被提问者采纳
相似回答