Calculate the function of the lunar calendar

xiaoxiao2021-03-06  68

I haven't seen it carefully, the code is found online.

: ------------------------------------------------- -------------------------------

[Benpian full text] [Reply to this article] [Benpian Author: top] [Benpian Popularity: 10]

Sender: TOP (English Level 6 && PHP), News District: Programming

Title: Yin and Yang Calendar Algorithm

Sending station: Yan Zhao BBS (Tue Apr 8 12:14:16 2003), transfer

Http://linux.tcpip.com.cn

Yin Yang calendar algorithm

Speaker: Kent speech time: 2001-11-08 12:03:11

The program is:

/ *

Prototype: int Calconv (STRUCT Convdate *);

Struct convdate

{

Int source; == 0 Enter the date in the record,! = 0 Enter is a lunar calendar

Int Solaryear; Western Medicine Output or Enter

Int Solarmonth; Vehcoon

Int solardate;

INT Lunaryear; Output or Enter Lunar New Year

Int lunarmonth; lunar month

Int lunarmonth; lunar month

Int Lunardate; Lunar New Year

Int weekday; this day is the day of the week (0 == Sunday, 1 == Monday, ...)

Int kan; day dry (0 == A, 1 == B, ..., 9 ==)

Int Chih; this day of the day (0 ==), 1 == Ugly, ..., 11 == Hai)

}

When the call is required to set the value of the Souce, if it is 0, it is a recorded lunar calendar. Otherwise, it will turn the Lunar Calendar. Then depend

Enter the annual day of the contraman or lunar calendar to set the monkey or lunar calendar. The year and month after the conversion will be filled in the structure (agriculture

Calendar or Western calendar, and the day is a day, and the sky is branched.

If the function of the function is 0, there is no error, 1 is an incorrect error, 2 is incorrectly in the input month.

,

3 For the input date error.

Input weeks must be in 1937 - 2031

Enter the lunar calendar year must be in 1936 - 2030

If you need to expand, then lunarcal is added.

* /

#define first year 1936 / * The first year in lunarcal [] * /

Struct convdate

{

Int source;

Int source;

Int Solaryear;

Int solarmonth;

Int solardate;

Int Lunaryear;

Int lunarmonth;

Int Lunardate;

Int weekday;

Int kan;

Int chih;

}

Struct Taglunarcal

{

Int basedays; / * to the Western 1st to the number of days in the first day of the lunar calendar * /

INTITERCALATION; / * Take the month. 0 == There is no leap in this year * /

Int baseweekday; / * This year, the Western Day is 1 * /

INT basekanchih; / * This year, the sanctuary of January 1 is reduced by 1 * /

Int Monthdays [13]; / * This lunar month size, 0 == Xiaoyue (29th), 1 == Dali (30th

) * /

}

Struct taglunarcal lunarcal [] = {

{23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0), / * 1936 * /

{23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0}, / * 1936 * / {41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1},

{30, 7, 5, 28, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1),

{49, 0, 6, 33, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1),

{38, 0, 0, 38, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1}, / * 1940 * /

{26, 6, 2, 44, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0),

{45, 0, 3, 49, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0),

{35, 0, 4, 54, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1),

{24, 4, 5, 59, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1}, / * 1944 * /

{43, 0, 0, 5, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1),

{32, 0, 1, 10, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1),

{21, 2, 2, 15, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1),

{40, 0, 3, 20, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1}, / * 1948 * /

{28, 7, 5, 26, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),

{47, 0, 6, 31, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1),

{36, 0, 0, 36, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0),

{26, 5, 1, 41, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1}, / * 1952 * /

{44, 0, 3, 47, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1),

{33, 0, 4, 52, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0),

{23, 3, 5, 57, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1),

{42, 0, 6, 2, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1}, / * 1956 * /

{30, 8, 1, 8, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0),

{48, 0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0),

{48, 0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0),

{38, 0, 3, 18, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1),

{27, 6, 4, 23, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0), / * 1960 * /

{45, 0, 6, 29, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0),

{35, 0, 0, 34, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},

{24, 4, 1, 39, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0), {43, 0, 2, 44, 1, 0, 1 , 0, 0, 1, 0, 1, 0, 1, 1, 1, 0}, / * 1964 * /

{32, 0, 4, 50, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1},

{20, 3, 5, 55, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0),

{39, 0, 6, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0),

{29, 7, 0, 5, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1}, / * 1968 * /

{47, 0, 2, 11, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1),

{36, 0, 3, 16, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0),

{26, 5, 4, 21, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1),

{45, 0, 5, 26, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1}, / * 1972 * /

{33, 0, 0, 32, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1),

{22, 4, 1, 37, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1),

{41, 0, 2, 42, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1),

{30, 8, 3, 47, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1}, / * 1976 * /

{48, 0, 5, 53, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1),

{37, 0, 6, 58, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1),

{27, 6, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0),

{46, 0, 1, 8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0), / * 1980 * /

{46, 0, 1, 8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0), / * 1980 * /

{35, 0, 3, 14, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1),

{24, 4, 4, 19, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1),

{43, 0, 5, 24, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1),

{32, 10, 6, 29, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1}, / * 1984 * /

{50, 0, 1, 35, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0),

{39, 0, 2, 40, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1},

{28, 6, 3, 45, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0),

{47, 0, 4, 50, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1}, / * 1988 * /

{36, 0, 6, 56, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0),

{26, 5, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1}, {45, 0, 1, 6, 0, 1, 0 , 0, 1, 0, 0, 1, 0, 1, 1, 1, 0),

{34, 0, 2, 11, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0}, / * 1992 * /

{22, 3, 4, 17, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0),

{40, 0, 5, 22, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0),

{30, 8, 6, 27, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1),

{49, 0, 0, 32, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1}, / * 1996 * /

{37, 0, 2, 38, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1),

{27, 5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1),

{46, 0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1),

{35, 0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1}, / * 2000 * /

{23, 4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),

{42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),

{42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),

{31, 0, 2, 9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0),

{21, 2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1}, / * 2004 * /

{39, 0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1),

{28, 7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1),

{48, 0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1),

{37, 0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1}, / * 2008 * /

{25, 5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1),

{44, 0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1),

{33, 0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),

{22, 4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0}, / * 2012 * /

{40, 0, 1, 2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0),

{30, 9, 2, 7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1),

{49, 0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1),

{38, 0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0}, / * 2016 * /

{27, 6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1),

{46, 0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0),

{35, 0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0),

{24, 4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1}, / * 2020 * /

{42, 0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},

{31, 0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0),

{21, 2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1),

{40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1}, / * 2024 * /

{40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1}, / * 2024 * /

{28, 6, 2, 5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0),

{47, 0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1),

{36, 0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1),

{25, 5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0}, / * 2028 * /

{43, 0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1),

{32, 0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0),

{22, 3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0})

#define lastyear (Firstyear Sizeof (Lunarcal) / Sizeof (Struct

Taglunarcal) -1)

/ * Number of days per month * /

INT Solarcal [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/ * The number of days per month, the number of days and leap years * /

Int SolarDays [2] [14] = {

{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 396},

{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 397}};

/ * Ask if this west calendar year is a leap year, return 0 is the year, 1 is a leap year * /

Int getleap (int year)

{

IF (Year% 400 == 0)

IF (Year% 400 == 0)

Return 1;

Else IF (Year% 100 == 0)

Return 0;

Else IF (Year% 4 == 0)

Return 1;

Else

Return 0;

}

/ * Survey Lunar Conversion * /

INT Calconv (Struct Convdate * CD)

{

INT LEAP, D, SM, Y, IM, L1, L2, ACC, I, LM, KC;

IF (CD-> Source == 0) / * Solar * /

{

IF (CD-> Solaryear <= firstyear || CD-> Solaryear> Lastyear) Return 1;

SM = CD-> Solarmonth - 1;

IF (SM <0 || SM> 11)

Return 2;

Leap = getleap (CD-> Solaryear);

IF (SM == 1)

IF (SM == 1)

D = leap 28;

Else

D = Solarcal [SM];

IF (CD-> Solardate <1 || CD-> Solardate> D)

Return 3;

Y = CD-> Solaryear - firstyear;

ACC = SolarDays [Leap] [SM] CD-> Solardate;

CD-> weekday = (ACC Lunarcal [Y] .baseweekday)% 7;

Kc = ACC Lunarcal [Y] .Basekanchih;

CD-> kan = kc% 10;

CD-> CHIH = KC% 12;

IF (ACC <= Lunarcal [Y] .BaseDays)

{

Y--

CD-> Lunaryear = CD-> Solaryear - 1;

Leap = Getleap (CD-> Lunaryear);

SM = 12;

ACC = SolarDays [Leap] [SM] CD-> Solardate;

}

Else

CD-> Lunaryear = CD-> Solaryear;

L1 = lunarcal [y] .basedays;

L1 = lunarcal [y] .basedays;

For (i = 0; i <13; i )

{

L2 = L1 Lunarcal [Y] .MONTHDAYS [i] 29;

IF (ACC <= L2)

Break;

L1 = L2;

}

CD-> lunarmonth = i 1;

CD-> Lunardate = ACC - L1;

IM = Lunarcal [Y] .intercalation;

IF (IM! = 0 && CD-> Lunarmonth> IM)

{

CD-> lunarmonth -;

IF (cd-> lunarmonth == iM)

CD-> lunarmonth = -im;

}

IF (CD-> Lunarmonth> 12)

CD-> Lunarmonth - = 12;

}

ELSE / * LUNAR * /

{

IF (CD-> Lunaryear Lunaryear> = lastyear)

IF (CD-> Lunaryear Lunaryear> = lastyear)

Return 1;

Y = CD-> Lunaryear - firstyear;

IM = Lunarcal [Y] .intercalation;

LM = CD-> Lunarmonth;

IF (lm <0)

{

IF (lm! = -im)

Return 2;

}

ELSE IF (LM <1 || LM> 12)

Return 2;

IF (IM! = 0)

{

IF (lm> IM)

LM ;

ELSE IF (lm == -im)

LM = IM 1;

}

LM -;

IF (CD-> Lunardate> Lunarcal [Y] .MONTHDAYS [LM] 29)

Return 3;

ACC = Lunarcal [Y] .BaseDays;

ACC = Lunarcal [Y] .BaseDays;

For (i = 0; I ACC = Lunarcal [Y] .MONTHDAYS [i] 29;

ACC = CD-> Lunardate;

Leap = Getleap (CD-> Lunaryear);

For (i = 13; i> = 0; I -)

IF (ACC> SolarDays [leap] [i])

Break;

CD-> Solardate = ACC - SolarDays [leap] [i];

IF (i <= 11)

{

CD-> Solaryear = CD-> LunaryEar;

CD-> Solarmonth = i 1;

}

Else

{

CD-> Solaryear = CD-> LunaryEar 1;

CD-> Solarmonth = I - 11;

}

Leap = getleap (CD-> Solaryear);

Y = CD-> Solaryear - firstyear;

ACC = SolarDays [Leap] [CD-> Solarmonth-1] CD-> Solardate;

CD-> weekday = (ACC Lunarcal [Y] .baseweekday)% 7;

Kc = ACC Lunarcal [Y] .Basekanchih;

{

CD-> kan = kc% 10;

CD-> CHIH = KC% 12;

}

Return 0;

}

转载请注明原文地址:https://www.9cbs.com/read-91945.html

New Post(0)