是否程序出問題????????
我用的是網(wǎng)上大老提供的程序,原來一直沒問題。現(xiàn)將轉(zhuǎn)換程序列如下,
請大老們審查:
2000年到2100年數(shù)據(jù)表
uc code year_cod[300]={
0x0C,0x96,0x45,0x4d,0x4A,0xB8,0x0d,0x4A,0x4C, // 2000-2002
0x0d,0xA5,0x41,0x25,0xAA,0xB6,0x05,0x6A,0x49, // 2003-2005
0x7A,0xAd,0xBd,0x02,0x5d,0x52,0x09,0x2d,0x47, // 2006-2008
0x5C,0x95,0xBA,0x0A,0x95,0x4e,0x0B,0x4A,0x43, // 2009-2011
0x4B,0x55,0x37,0x0A,0xd5,0x4A,0x95,0x5A,0xBf, // 2012-2014
0x04,0xBA,0x53,0x0A,0x5B,0x48,0x65,0x2B,0xBC, // 2015-2017
0x05,0x2B,0x50,0x0A,0x93,0x45,0x47,0x4A,0xB9, // 2018-2020
0x06,0xAA,0x4C,0x0A,0xd5,0x41,0x24,0xdA,0xB6, // 2021-2023
0x04,0xB6,0x4A,0x69,0x57,0x3d,0x0A,0x4e,0x51, // 2024-2026
0x0d,0x26,0x46,0x5e,0x93,0x3A,0x0d,0x53,0x4d, // 2027-2029
0x05,0xAA,0x43,0x36,0xB5,0x37,0x09,0x6d,0x4B, // 2030-2032
0xB4,0xAe,0xBf,0x04,0xAd,0x53,0x0A,0x4d,0x48, // 2033-2035
0x6d,0x25,0xBC,0x0d,0x25,0x4f,0x0d,0x52,0x44, // 2036-2038
0x5d,0xAA,0x38,0x0B,0x5A,0x4C,0x05,0x6d,0x41, // 2039-2041
0x24,0xAd,0xB6,0x04,0x9B,0x4A,0x7A,0x4B,0xBe, // 2042-2044
0x0A,0x4B,0x51,0x0A,0xA5,0x46,0x5B,0x52,0xBA, // 2045-2047
0x06,0xd2,0x4e,0x0A,0xdA,0x42,0x35,0x5B,0x37, // 2048-2050
0x09,0x37,0x4B,0x84,0x97,0xC1,0x04,0x97,0x53, // 2051-2053
0x06,0x4B,0x48,0x66,0xA5,0x3C,0x0e,0xA5,0x4f, // 2054-2056
0x06,0xB2,0x44,0x4A,0xB6,0x38,0x0A,0xAe,0x4C, // 2057-2059
0x09,0x2e,0x42,0x3C,0x97,0x35,0x0C,0x96,0x49, // 2060-2062
0x7d,0x4A,0xBd,0x0d,0x4A,0x51,0x0d,0xA5,0x45, // 2063-2065
0x55,0xAA,0xBA,0x05,0x6A,0x4e,0x0A,0x6d,0x43, // 2066-2068
0x45,0x2e,0xB7,0x05,0x2d,0x4B,0x8A,0x95,0xBf, // 2069-2071
0x0A,0x95,0x53,0x0B,0x4A,0x47,0x6B,0x55,0x3B, // 2072-2074
0x0A,0xd5,0x4f,0x05,0x5A,0x45,0x4A,0x5d,0x38, // 2075-2077
0x0A,0x5B,0x4C,0x05,0x2B,0x42,0x3A,0x93,0xB6, // 2078-2080
0x06,0x93,0x49,0x77,0x29,0xBd,0x06,0xAA,0x51, // 2081-2083
0x0A,0xd5,0x46,0x54,0xdA,0xBA,0x04,0xB6,0x4e, // 2084-2086
0x0A,0x57,0x43,0x45,0x27,0x38,0x0d,0x26,0x4A, // 2087-2089
0x8e,0x93,0x3e,0x0d,0x52,0x52,0x0d,0xAA,0x47, // 2090-2092
0x66,0xB5,0x3B,0x05,0x6d,0x4f,0x04,0xAe,0x45, // 2093-2095
0x4A,0x4e,0xB9,0x0A,0x4d,0x4C,0x0d,0x15,0x41, // 2096-2098
0x2d,0x92,0xB5}; // 2099
uc year_moon,month_moon,day_moon;
uc code day_cod1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};//月份天數(shù)數(shù)據(jù)表
ui code day_cod2[3]={0x111,0x130,0x14e};//月修正數(shù)據(jù)表
/*讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月大返回1,小返回0*/
bit get_moon_day(uc month_p,ui code_addr)
{
uc temp,temp1;
temp1=(month_p+3)/8;
temp=0x80>>((month_p+3)%8);
temp=year_cod[code_addr+temp1]&temp;
if(temp==0){return(0);}
else{return(1);}
}
/*==轉(zhuǎn)換當(dāng)前農(nóng)歷信息====================================*/
void SunToMoon(uc year,uc month,uc day) //輸入公歷十進制輸出農(nóng)歷十進制
{
uc temp1,temp2,temp3,month_p;
ui temp4,code_addr;
bit flag2,flag_y;
// year=year/16*10+year%16;
// month=month/16*10+month%16;
// day=day/16*10+day%16;
code_addr=year*3; //定位數(shù)據(jù)表地址
temp1=year_cod[code_addr+2]&0x60; //取當(dāng)年春節(jié)所在的公歷月份
temp1=_cror_(temp1,5);
temp2=year_cod[code_addr+2]&0x1f; //取當(dāng)年春節(jié)所在的公歷日
temp3=temp2-1; //計算當(dāng)年春節(jié)離當(dāng)年元旦的天數(shù),春節(jié)只會在公歷1月或2月
if(temp1!=1)
temp3+=0x1f;
if(month<10)
temp4=day_cod1[month-1]+day;
else
temp4=day_cod2[month-10]+day;
if((month<2)||(year%0x04!=0)) temp4-=1; //如果公歷月小于2月或者該年的2月非閏月,天數(shù)減1
if (temp4>=temp3) //判斷公歷日在春節(jié)前還是春節(jié)后
{
//公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進行運算
temp4 -=temp3;
month = 1;
flag_y = 0;
month_p= 1; //month_p為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日month_p指向首月
flag2=get_moon_day(month_p,code_addr); //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
if(flag2==0) temp1=29;
else temp1=30; //小月29天、大月30天
temp2=year_cod[code_addr]&0xf0;
temp2=_cror_(temp2,4); //從數(shù)據(jù)表中取該年的閏月月份,如為0則該年無閏月
while(temp4>=temp1)
{
temp4-=temp1;
month_p+=1;
if(month==temp2)
{
flag_y=~flag_y;
if(flag_y==0)month+=1;
}
else month+=1;
flag2=get_moon_day(month_p,code_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else//公歷日在春節(jié)前使用下面代碼進行運算
{
temp3-=temp4;
if(year==0) year=0xe3;
else year-=1;
code_addr-=3;
month = 0xc;
temp2 = year_cod[code_addr]&0xf0;
temp2 = _cror_(temp2,4);
flag_y = 0;
if(temp2==0) month_p=12;
else month_p=13; //如果當(dāng)年有閏月,一年有十三個月,月指向13,無閏月指向12
flag2=get_moon_day(month_p,code_addr);
if(flag2==0) temp1=29;
else temp1=30;
while(temp3>temp1)
{
temp3-=temp1;
month_p-=1;
if(flag_y==0) month-=1;
if(month==temp2) flag_y=~flag_y;
flag2=get_moon_day(month_p,code_addr);
if(flag2==0) temp1=0x1d;
else temp1=0x1e;
}
day=temp1-temp3+1;
}
year_moon = year; //將農(nóng)歷信息寫進指定變量
month_moon = month;
day_moon = day;
}
/*************************************************************************
函數(shù)功能:輸入陽歷數(shù)據(jù),輸出星期數(shù)據(jù)(只允許2000-2099年)
調(diào)用函數(shù)示例:Conver_WEEK(year_sun,month_sun,day_sun)
如:計算2015年10月16日Conversion(15,10,16);
*****************************************************************************/
//使用基姆拉爾森計算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 改裝
/*****uc Conver_WEEK(uc year,uc month,uc day)
{
uc iWeek;
if(month<3) //3月為公式月頭
{
month+=12;
if( year> 0 )
year--;
else
year = 4;
}
iWeek=(day+2*month+3*(month+1)/5+year+year/4)%7 +1;
return iWeek;
}
*********************************************/
#endif
|