阳历算阴历-----C语言程序

来源:互联网 发布:网络主播策划方案 编辑:程序博客网 时间:2024/05/05 18:54
#include<stdio.h>

void ToLunar(unsigned int year,unsigned char month,unsigned char day);//阳历转阴历

typedef struct _Spdate
{
unsigned int year;
unsigned char month;
unsigned char day;
} SPDATE;

SPDATE Spdate;

unsigned int lunar_array[] = {
0x0C9645,/*2000*/
0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52,0x092D47,0x5C95BA,0x0A954E,/*2001-2010*/
0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC,0x052B50,0x0A9345,0x474AB9,/*2011-2020*/
0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646,0x5E933A,0x0D534D,0x05AA43,/*2021-2030*/
0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F,0x0D5244,0x5DAA38,0x0B5A4C,/*2031-2040*/
0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA,0x06D24E,0x0ADA42,0x355B37,/*2041-2050*/
0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244,0x4AB638,0x0AAE4C,0x092E42,/*2051-2060*/
0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E,0x0A6D43,0x452EB7,0x052D4B,/*2061-2070*/
0x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,0x055A45,0x4A5D38,0x0A5B4C,0x052B42,0x3A93B6,/*2071-2080*/
0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,0x04B64E,0x0A5743,0x452738,0x0D264A,0x8E933E,/*2081-2090*/
0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,0x4A4EB9,0x0A4D4C,0x0D1541,0x2D92B5 /*2091-2099*/
};

unsigned int MonthTotal[] = {0,31,59,90,120,151,181,212,243,273,304,334,365};


int main()
{
int year,month,day;
year = 2011;
month = 1;
for(;month<13;month++)
{
for(day = 1;day<20;day++)
{
ToLunar(year,month,day);
printf("%d- %d- %d",year,month,day);
printf(" %d-%d-%d\n",Spdate.year,Spdate.month,Spdate.day);
}
}
getch();
return 0;
}

void ToLunar(unsigned int year,unsigned char month,unsigned char day)//阳历转阴历
{
int bySpring,bySolar,daysPerMonth;
int index,flag;
if( ((lunar_array[year-2000] & 0x0060) >> 5) == 1)
bySpring = (lunar_array[year-2000]&0x001F)-1;
else
bySpring = (lunar_array[year-2000]&0x001F)-1+31;
bySolar = MonthTotal[month-1] + day - 1;
if( (!(year % 4)) && (month > 2))
bySolar++;
if (bySolar >= bySpring)
{
bySolar -= bySpring;
month = 1;
index = 1;
flag = 0;
if((lunar_array[year-2000]&(0x80000>>(index-1)))==0)
daysPerMonth = 29;
else
daysPerMonth = 30;
while(bySolar >= daysPerMonth)
{
bySolar -= daysPerMonth;
index++;
if(month == ((lunar_array[year-2000]&0xF00000)>>20))
{
flag = ~flag;
if(flag == 0)
month++;
}
else
month++;
if((lunar_array[year-2000]&(0x80000>>(index-1)))==0)
daysPerMonth=29;
else
daysPerMonth=30;
}
day = bySolar + 1;
}
else
{
bySpring -= bySolar;
year--;
month = 12;
if(((lunar_array[year-2000]&0xF00000)>>20)==0)
index = 12;
else
index = 13;
flag = 0;
if((lunar_array[year-2000]&(0x80000>>(index-1)))==0)
daysPerMonth = 29;
else
daysPerMonth = 30;
while(bySpring > daysPerMonth)
{
bySpring -= daysPerMonth;
index--;
if(flag == 0)
month--;
if(month==((lunar_array[year-2000]&0xF00000)>>20))
flag = ~flag;
if((lunar_array[year-2000]&(0x80000>>(index-1)))==0)
daysPerMonth = 29;
else
daysPerMonth = 30;
}
day = daysPerMonth - bySpring + 1;
}
Spdate.day = day;
Spdate.month = month;
Spdate.year = year;
}


原创粉丝点击