这是以前自己完ucos时弄的一个程序,就是浪费点空间;<br />因为不是做产品,所以也没有对代码效率考虑太多,楼主自己取舍。<br /><br /><br /><br />/************************************************************************************************************/<br />/*阳历日和农历节气的对应关系 */<br />/*压缩节气数据表: */<br />/*根据规律可以得到四个数据表(每个阳历月有两个节气,每个节气需要两个数据表): */<br />/************************************************************************************************************/<br />INT8U calendar_solar_term_table_01[12][33] = <br />{<br /> {7,6,6,6,6,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,5,5,5,5,5,4,5,5}, //month 1<br /> {5,4,5,5,5,4,4,5,5,4,4,4,4,4,4,4,4,3,4,4,4,3,3,4,4,3,3,3}, //2<br /> {6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5}, //3<br /> {5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,4,4,5,5,4,4,4,5,4,4,4,4,5}, //4<br /> {6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5}, //5<br /> {6,6,7,7,6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5},//6<br /> {7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7}, //7<br /> {8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7},//8<br /> {8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,7}, //9<br /> {9,9,9,9,8,9,9,9,8,8,9,9,8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,8}, //10<br /> {8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7}, //11<br /> {7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7}, //12<br />}; //这个数据表表示了每个月第一个节气出现的规律<br /><br />INT8U calendar_solar_term_year_01[12][9] = <br />{<br /> {13,49,85,117,149,185,201,250,250}, //month 1<br /> {13,45,81,117,149,185,201,250,250}, //2<br /> {13,48,84,112,148,184,200,201,250}, //3<br /> {13,45,76,108,140,172,200,201,250}, //4<br /> {13,44,72,104,132,168,200,201,250}, //5<br /> {5 ,33,68,96 ,124,152,188,200,201}, //6<br /> {29,57,85,120,148,176,200,201,250}, //7<br /> {13,48,76,104,132,168,196,200,201}, //8<br /> {25,60,88,120,148,184,200,201,250}, //9<br /> {16,44,76,108,144,172,200,201,250}, //10<br /> {28,60,92,124,160,192,200,201,250}, //11<br /> {17,53,85,124,156,188,200,201,250}, //12<br />}; //这个数据表表示了每个月第一个节气出现规律对应的阳历年份范围<br /><br />INT8U calendar_solar_term_table_02[12][29] = <br />{<br /> {21,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,20,20,20,20,20,19,20,20,20,19,19,20},<br /> {20,19,19,20,20,19,19,19,19,19,19,19,19,18,19,19,19,18,18,19,19,18,18,18,18,18,18,18},<br /> {21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,20},<br /> {20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,19,19,20,20,19,19,19,20,20},<br /> {21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,21},<br /> {22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,21},<br /> {23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,23},<br /> {23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23},<br /> {23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23},<br /> {24,24,24,24,23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,23},<br /> {23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,22},<br /> {22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,22},<br /><br />}; //这个数据表表示了每个月第二个节气出现的规律<br /><br />INT8U calendar_solar_term_year_02[12][8] = <br />{<br /> {13,45,81,113,149,185,201},<br /> {21,57,93,125,161,193,201},<br /> {21,56,88,120,152,188,200,201},<br /> {21,49,81,116,144,176,200,201},<br /> {17,49,77,112,140,168,200,201},<br /> {28,60,88,116,148,180,200,201},<br /> {25,53,84,112,144,172,200,201},<br /> {29,57,89,120,148,180,200,201},<br /> {17,45,73,108,140,168,200,201},<br /> {28,60,92,124,160,192,200,201},<br /> {16,44,80,112,148,180,200,201},<br /> {17,53,88,120,156,188,200,201},<br />};//这个数据表表示了每个月第二个节气出现规律对应的阳历年份范围<br /><br /><br />/************************************************************************************************************/<br />/*函 数:calendar_calculate_solar_term_1 */<br />/*输 入:solar_year,solar_month */<br />/*输 出:第一个节气出现的日期; */<br />/*函数说明:本函数用于计算给定年和月的第一个农历节日出现的节气,输入的年按-1900给定 */<br />/* 这个算法采用条件规律算法.给定的年和月信息是阳历,返回的日期也为阳历 */<br />/************************************************************************************************************/<br />INT8U calendar_calculate_solar_term_1(INT8U solar_year, INT8U solar_month)<br />{<br /> INT8U done_index;<br /> INT8U solar_term;<br /> <br /> done_index = 0;<br /> <br /> while(solar_year >= calendar_solar_term_year_01[solar_month - 1][done_index])<br /> {<br /> done_index++;<br /> if(done_index>8) break; //以防设置的年不在数据表格范围内;<br /> }<br /> solar_term = calendar_solar_term_table_01[solar_month - 1][4*done_index + solar_year%4];<br /> <br /> if((solar_year == 121)&&(solar_month == 4))solar_term = 5;<br /> if((solar_year == 132)&&(solar_month == 4))solar_term = 5;<br /> if((solar_year == 194)&&(solar_month == 6))solar_term = 6;<br /> return(solar_term);<br />}<br /><br />/************************************************************************************************************/<br />/*函 数:calendar_calculate_solar_term_2 */<br />/*输 入:solar_year,solar_month */<br />/*输 出:第二个节气出现的日期; */<br />/*函数说明:本函数用于计算给定年和月的第二个农历节日出现的节气,输入的年按-1900给定 */<br />/* 这个算法采用条件规律算法.给定的年和月信息是阳历,返回的日期也为阳历 */<br />/************************************************************************************************************/<br />INT8U calendar_calculate_solar_term_2(INT8U solar_year, INT8U solar_month)<br />{<br /> INT8U done_index;<br /> INT8U solar_term;<br /> <br /> done_index = 0;<br /> <br /> while(solar_year >= calendar_solar_term_year_02[solar_month - 1][done_index])<br /> {<br /> done_index++;<br /> if(done_index>8) break; //以防设置的年不在数据表格范围内;<br /> }<br /> solar_term = calendar_solar_term_table_02[solar_month - 1][4*done_index + solar_year%4];<br /> <br /> if((solar_year == 171)&&(solar_month == 3))solar_term = 21;<br /> if((solar_year == 181)&&(solar_month == 5))solar_term = 21;<br /> return(solar_term);<br />}
|