⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pubdata.h

📁 用Emebedded Visual C++编写的“阴历阳历换算器”程序。
💻 H
字号:
#ifndef _PUBDATA_H_
#define _PUBDATA_H_
const CString TianGan[10] =
{_T("甲"),_T("乙"),_T("丙"),_T("丁"),_T("戊"),_T("己"),_T("庚"),_T("辛"),_T("壬"),_T("癸")};
const CString DiZhi[12]=
{_T("子"),_T("丑"),_T("寅"),_T("卯"),_T("辰"),_T("巳"),_T("午"),_T("未"),_T("申"),_T("酉"),_T("戌"),_T("亥")};
const CString YearAnimals[12]=
{_T("鼠"),_T("牛"),_T("虎"),_T("兔"),_T("龙"),_T("蛇"),_T("马"),_T("羊"),_T("猴"),_T("鸡"),_T("狗"),_T("猪")};
const CString CYinMonth[12]=
{_T("正"),_T("二"),_T("三"),_T("四"),_T("五"),_T("六"),_T("七"),_T("八"),_T("九"),_T("十"),_T("十一"),_T("腊")};
const CString CYinDay[30]=
{
_T("初一"),_T("初二"),_T("初三"),_T("初四"),_T("初五"),_T("初六"),
_T("初七"),_T("初八"),_T("初九"),_T("初十"),_T("十一"),_T("十二"),
_T("十三"),_T("十四"),_T("十五"),_T("十六"),_T("十七"),_T("十八"),
_T("十九"),_T("二十"),_T("廿一"),_T("廿二"),_T("廿三"),_T("廿四"),
_T("廿五"),_T("廿六"),_T("廿七"),_T("廿八"),_T("廿九"),_T("三十")
};

const TCHAR CCweek[7]=
{'日','一','二','三','四','五','六'};

const int  YEAR = 0;//1;
const int  MONTH =1;// 2;
const int  DAY =  2;// 3;

const int  YangDateBase[3]= {1971,12,8};//08};
const int  YinDateBase[3]= {1971,10,21};
const int  YinGanZhiBase[3] = {48,36,4};
//    {y,m,d: '辛亥','己亥','丁卯'  Search table to get GZ numbers.}
BOOL  bYinBaseLeapMonth = FALSE;
const int YinAnimalBase = 12; //{ Pig }

const int  YEAR_START = 1881;// {1903;}
const int  YEAR_END   = 2060;

const int  YinMonthsOfYear[YEAR_END-YEAR_START+1] =
{ 2922,3498,2980,6985,3401,2709,5419,1325,2733,5482,
   3498,7588,3748,3402,2709,2711,1366,2741,2773,5842,
   1874,3749,
   5706,1611,2715,5462,1386,2905,5970,1874,6949,2853,
   2635,4779,2733,1386,2921,3497,7570,3474,3365,6733,
   2646,694, 5557,1748,3753,7826,3730,3366,1323,2647,
   4790,2906,1748,3785,1865,5779,2707,1323,2651,2733,
   1386,6997,2980,2889,6803,2709,5421,1334,2733,5546,
   1458,3493,7498,3402,2709,2711,1366,2741,2773,1746,
   3749,3749,1610,3223,2715,5466,1386,2921,5970,2898,
   2853,5707,2635,5291,685, 1389,2921,3497,3474,7461,
   3365,6733,2646,694, 1461,1749,3753,7826,3730,3366,
   2646,2647,5334,858, 1749,5833,1865,1683,5419,1323,
   2651,5466,1386,6997,2980,2889,6803,2709,1325,2733,
   2733,5546,1490,3493,7498,3402,3222,5422,1366,2741,
   5554,1746,3749,1829,1611,3323,3343,1370,2274,2921,
   5970,2898,2853,6859,2635,1199,1371,1453,3434,6994,
   3474,7461,3365,2645,5293,1206,1461,3498,3785,7826,
   3730,2854,2646,2647,1206,1711,1909,1865  
   };
/*
     {//数字构造方法: 阴历一至十二月(有闰月时为十三月):
       // 大月(30天)为1,小月(29天)为0,每月占1bit,
       // 由右向左依次为:1,2,3,...,12/13 }
*/
const BYTE  LeapMonthOfYear[YEAR_END-YEAR_START+1] =//[YEAR_START..YEAR_END] of Byte{Integer} =
{7,0,0,5,0,0,4,0,0,2,     0,6,0,0,5,0,0,3,0,8,
   0,0,
   5,0,0,4,0,0,2,0,6,0,     0,5,0,0,2,0,7,0,0,5,
   0,0,4,0,0,2,0,6,0,0,     5,0,0,3,0,7,0,0,6,0,
   0,4,0,0,2,0,7,0,0,5,     0,0,3,0,8,0,0,6,0,0,
   4,0,0,3,0,7,0,0,5,0,     0,4,0,8,0,0,6,0,0,4,
   0,10,0,0,6,0,0,5,0,0,    3,0,8,0,0,5,0,0,4,0,
   0,2,0,7,0,0,5,0,0,4,     0,9,0,0,6,0,0,4,0,0,
   2,0,6,0,0,5,0,0,3,0,     7,0,0,6,0,0,5,0,0,2,
   0,7,0,0,5,0,0,3,0,8,     0,0,6,0,0,4,0,0  
};

BOOL  DateYang2Yin(int yYang,int mYang,int dYang,int& yYin,int& mYin,int& dYin,BOOL& bLeapMonth);
BOOL DateYin2Yang(int yYin,int mYin,int dYin,BOOL bLeapMonth,int& yYang,int& mYang,int& dYang);
CString YearName(int yYang,int mYang,int dYang,int yYin );
int CalcYangDays(int y1,int m1,int d1);
int CalcNewYangWithDays(int days,int& y,int& m,int& d);
int CalcNewYangWithDaysLess365(int year,int days,int& y,int& m,int& d);

CString DateYin2GanZhi(int yYin,int mYin,int dYin,BOOL bLeapMonth);
CString YearYin2GanZhi(int yYin);
void GetGanZhi(LONG l,int& g,int& z );
int  YinYear2Animal(int yYin);


BOOL IsLeapYear(int AYear);

int DaysOfYinMonth(int yYin,int mYin);
LONG  DaysOfYinYear(int y);

LONG  CalcYinDatesSpan(int Y,int M,int D,BOOL bLeapMonth,int y1,int m1,int d1,BOOL bLeapMonth1);
int CalcYangDays(int endY,int endM,int endD)
{
	int i,leapYearNum=0;
	for(i=1;i<endY;i++)
		{
		if(IsLeapYear(i))
			leapYearNum++;
		}
	int day1=endY*365+leapYearNum;
	int day2=0;
		for(i=1;i<endM;i++)
			{
			if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)||(i==12))
				day2+=31;
			else
				{
				if(i!=2)
					day2+=30;
				else
					if(IsLeapYear(endY))
						day2+=29;
					else
						day2+=28;
				}
			}
		day1+=day2+endD;
		
		
	return day1;
}

BOOL  DateYang2Yin(int yYang,int mYang,int dYang,int& yYin,int& mYin,int& dYin,BOOL& bLeapMonth)
{
  int   lDaySpan;
int  y, m, d;
  //{0.Is year valid?}
  if (yYang<YEAR_START||yYang>YEAR_END) return 0;
  //{1.Calc gap from dYang to YangDateBase}
 
int test1  =  CalcYangDays(YangDateBase[YEAR],YangDateBase[MONTH],YangDateBase[DAY]);
int test2  =  CalcYangDays(yYang,mYang,dYang);
lDaySpan  =  test2-test1;

  //{2.Plus the gap to YinDateBase}
    yYin = YinDateBase[YEAR];
    mYin = YinDateBase[MONTH];
    dYin = YinDateBase[DAY];
    if ((LeapMonthOfYear[yYin-YEAR_START] >0 ) &&((LeapMonthOfYear[yYin-YEAR_START] <mYin ) ||
       (bYinBaseLeapMonth && (LeapMonthOfYear[yYin-YEAR_START] == mYin))))
      mYin = mYin +1;

    if( lDaySpan > 0 )
		{//{Adjust the YinDateBase's Day to 1}
		lDaySpan = lDaySpan + dYin -1;
		dYin = 1;
		while ( lDaySpan >= DaysOfYinMonth( yYin, mYin ) )
			{
			if ( DaysOfYinMonth( yYin, mYin ) < 29 )
				return 0;
            lDaySpan = lDaySpan - DaysOfYinMonth( yYin, mYin );
			mYin = mYin + 1;
			if (( mYin > 13 ) || ( (mYin == 13)&&(LeapMonthOfYear[yYin-YEAR_START] == 0) ))
				{
				mYin = 1;
				yYin = yYin + 1;
				}
			}
		dYin = dYin + lDaySpan;
		}
    else if( lDaySpan < 0 )
		{
		lDaySpan = lDaySpan*(-1);
	    //  {Adjust the YinDateBase's Day to 1 of next month}
		lDaySpan = lDaySpan + DaysOfYinMonth( yYin, mYin ) - dYin +1;
		dYin = 1;
		while ( lDaySpan > DaysOfYinMonth( yYin, mYin ) ) 
			{
			if ( DaysOfYinMonth( yYin, mYin ) < 29 )
				return 0;
			lDaySpan = lDaySpan - DaysOfYinMonth( yYin, mYin );
			mYin = mYin - 1;
			if ( mYin == 0 )
				{
				yYin = yYin - 1;
				if ( LeapMonthOfYear[yYin-YEAR_START] > 0 )
					mYin = 13;
				else
					mYin = 12;
				}
			}
		dYin = DaysOfYinMonth( yYin, mYin ) - lDaySpan +1;
		}
    //{3.Return the result Yin date}
    if ((LeapMonthOfYear[yYin-YEAR_START] >0 ) && (LeapMonthOfYear[yYin-YEAR_START] < mYin ))
		{
		mYin = mYin -1;
		bLeapMonth = ( LeapMonthOfYear[yYin-YEAR_START] == mYin );
		}
    else
		bLeapMonth = FALSE;

    return 1;
}

BOOL DateYin2Yang(int yYin,int mYin,int dYin,BOOL bLeapMonth,int& yYang,int& mYang,int& dYang)
{
  LONG   lDaySpan;
  CTime    dYangBase;
  //{0.Is year valid?}
  //{1.Calc gap from Yin date to YinDateBase}
  lDaySpan = CalcYinDatesSpan( yYin, mYin, dYin, bLeapMonth,
      YinDateBase[YEAR],YinDateBase[MONTH], YinDateBase[DAY],
      bYinBaseLeapMonth );
  //{2.Add the gap to YangDateBase}
  //CTimeSpan
int d1=CalcYangDays(YangDateBase[YEAR],YangDateBase[MONTH],YangDateBase[DAY]);
int test=CalcNewYangWithDays(d1,yYang,mYang,dYang);
d1+=lDaySpan;
return CalcNewYangWithDays(d1,yYang,mYang,dYang);
}


int  YinYear2Animal(int yYin)
{
 int result = ( yYin - YinDateBase[YEAR] + YinAnimalBase ) % 12;
  if (result <= 0) result = result + 12;
  return result;
}

CString YearName(int yYang,int mYang,int dYang,int yYin )
{
	TCHAR tc[20];
	CString result;
	const int YinYears[3] =
	{1875,1909,1912};
    const CString YearNames[3]=	{_T("光绪"),_T("宣统"),_T("民国")};
	const int MinGuoYear[2]= {1912, 1949};
    WORD y,m,d;
    //{Compare Yin year}
	if (yYin < YinYears[0])  result = "";
    else
    if (yYin == YinYears[0])  result = YearNames[0]+_T("元年 ");
    else
    if (yYin < YinYears[1] ) 
		{
		//result =Format(_T("%s%d年 "), [YearNames[1], yYin-YinYears[1]+1 ]);
		wsprintf(tc,_T("%d"),yYin-YinYears[0]+1);
		result =YearNames[0]+tc+_T("年 ");
		}
	else
    if (yYin == YinYears[1])  result = YearNames[1]+_T("元年 ");
    else
    if (yYin < YinYears[2] )  
		{
		// result =Format("%s%d年 ", [YearNames[2], yYin-YinYears[2]+1 ]);
		wsprintf(tc,_T("%d"),yYin-YinYears[1]+1);
		result =YearNames[1]+tc+_T("年 ");
		}
    else result = "";

    //{Compare Yang year}
//    DecodeDate( dateYang, y, m, d );
y=yYang;
m=mYang;
d=dYang;
	if (y < MinGuoYear[0])return "";
    else
    if (y == MinGuoYear[0]) result = YearNames[2]+_T("元年 ");
    else
    if (y < MinGuoYear[1] )
		{
	    //result =Format("%s%d年 ", [YearNames[3], y-MinGuoYear[1]+1 ]);
		wsprintf(tc,_T("%d"),y-MinGuoYear[0]+1);
		result =YearNames[2]+tc+_T("年 ");
		}

    else result = "";
	
	return result;
}

BOOL IsLeapYear(int AYear)
{
 return (AYear % 4 == 0) && ((AYear % 100 != 0) || (AYear % 400 == 0));
}

int DaysOfYinMonth(int  yYin,int mYin)
{
int n,result;
// {NOTE: If 4th month is lunar(two 4th), mYin=7 means 6th month! }
//  {Is year/month valid? }
  if ((yYin<YEAR_START) || (yYin>YEAR_END) ||
     (mYin<1) || (mYin>13) ||
     ( (mYin==13) && (LeapMonthOfYear[yYin-YEAR_START]==0) ))
	{
    result = 0;
    return result;
	}

  n = YinMonthsOfYear[yYin-YEAR_START];
  n = n >> (mYin-1);
  if ( n & 0x1 == 1 )
     result = 30;  //{大月}
  else
     result = 29;// {小月}
return result;
}

LONG DaysOfYinYear( int y )
{
int  m;
LONG  result = 0;
for (m= 1;m<=13;m++)
    result = result + DaysOfYinMonth( y, m );
return result;
}


LONG CalcYinDatesSpan(int Y,int M,int D,BOOL bLeapMonth,
   int y1,int m1,int d1,BOOL bLeapMonth1 )
   //{Calc the days count between two Yin dates: return (YMD-ymd) }
{
int  nTotalSign, nDays_md1, nDays_MD, k, t;
LONG  lTotalDays,result;
  if ((LeapMonthOfYear[Y-YEAR_START]  > 0) && ((LeapMonthOfYear[Y-YEAR_START] < M ) ||
     (bLeapMonth && (LeapMonthOfYear[Y-YEAR_START] == M))))  M = M + 1;
  if ((LeapMonthOfYear[y1-YEAR_START] > 0) && ((LeapMonthOfYear[y1-YEAR_START] < m1 )||
     (bLeapMonth1 && (LeapMonthOfYear[y1-YEAR_START] == m1)))) m1 = m1 + 1;

  if( y1 < Y ) nTotalSign = 1;
  else if( y1 > Y ) nTotalSign = -1;
  else if( m1 < M ) nTotalSign =  1;
  else if( m1 > M ) nTotalSign = -1;
  else if( d1 < D ) nTotalSign =  1;
  else if( d1 > D ) nTotalSign = -1;
  else 
	{
    result = 0;//    {the same dates!}
    return result;
	}

  //{Assume YMD as Base Date and make sure YMD > ymd}
  if( nTotalSign == -1 )
	{
    t = Y;
	Y = y1;
	y1 = t;
	t = M;
	M = m1;
	m1 = t;
    t = D;
	D = d1;
	d1 = t;
	}

  //{Calc days between ymd and y11}
  nDays_md1 = 0;
  for( k=1;k<=m1-1;k++)
	nDays_md1 = nDays_md1 + DaysOfYinMonth( y1, k );
  nDays_md1 = nDays_md1 + d1;
	

  //{Calc days between YMD and Y11}
  nDays_MD = 0;
  for (k=1;k<=M-1;k++)
    nDays_MD = nDays_MD + DaysOfYinMonth( Y, k );
  nDays_MD = nDays_MD + D;

  //{Calc the total days between YMD and ymd}
  lTotalDays = 0;
  for (k=y1;k<=Y-1;k++)
    lTotalDays = lTotalDays + DaysOfYinYear( k );
  lTotalDays = lTotalDays + nDays_MD - nDays_md1;
  lTotalDays = lTotalDays * nTotalSign;

  result = lTotalDays;
  return result;	
}


CString MonthYin2GanZhi(int yYin,int mYin)
{
int  nSign, y, m, t, n, g, z;
LONG  lMonths;
//{NOTE: Yin leap month has same GanZhi with its prev
//   month, so we can say that every Yin year has 12 months here.}
  y = YinDateBase[YEAR];
  m = YinDateBase[MONTH];

  if (yYin > y) nSign = 1;
  else if (yYin < y) nSign = -1;
  else if (mYin > m ) nSign = 1;
  else if (mYin < m ) nSign = -1;
  else 
	{
    nSign = 1;
    n = YinGanZhiBase[MONTH];
	}
  
  //{Make sure that yYin.mYin >= y.m }
  if (nSign == -1)
	{
    t = yYin;
	yYin = y;
	y = t;
    t = mYin;
	mYin = m;
	m = t;
	}

  lMonths = ( (yYin - y)*12 + mYin - m )* nSign + YinGanZhiBase[MONTH];
  GetGanZhi( lMonths, g, z );
  return TianGan[g-1] + DiZhi[z-1];
}

CString YearYin2GanZhi(int yYin)
{
 LONG lYears;
 int  g, z;
 lYears =  yYin - YinDateBase[YEAR] + YinGanZhiBase[YEAR];
  GetGanZhi( lYears, g, z );
  return TianGan[g-1] + DiZhi[z-1];
}


void GetGanZhi(LONG l,int& g,int& z )
{
  g =l%10;
  if (g <= 0)   g = g + 10;

  z =  l % 12;
  if (z <= 0) z = z + 12;
}

CString DateYin2GanZhi(int yYin,int mYin,int dYin,BOOL bLeapMonth)
{
  //int lDays;
  LONG lDays;
  int g, z;
  lDays = CalcYinDatesSpan( yYin, mYin, dYin,bLeapMonth,
      YinDateBase[YEAR],YinDateBase[MONTH], YinDateBase[DAY],
      bYinBaseLeapMonth ) + YinGanZhiBase[DAY];
  GetGanZhi( lDays, g, z );
  return TianGan[g-1] + DiZhi[z-1];
}

int	CalcNewYangWithDaysLess365(int year,int days,int& y,int& m,int& d)//0,0,0 as base yang year
{
	if(days<1)
		{
		if(IsLeapYear(year))
			days=366+days;
		else
			days=365+days;
		year--;
		CalcNewYangWithDaysLess365(year,days,y,m,d);
		return 1;
		}
	//days>0:
	y=year;
	m=12;
	d=31;
	int i;
	m=0;
	d=0;
	y++;
	for(i=1;i<13;i++)
		{
		if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)||(i==12))
			{
			if(days>31)
				days-=31;
			else
				{
				m=i;
				d=days;
				break;
				}
			}
		else
			{
			if(i!=2)//4,6,9,11
				{
				if(days>30)
					days-=30;
				else
					{
					m=i;
					d=days;
					break;
					}
				}
			else
				{
				if(IsLeapYear(y))
					{
					if(days>29)
						days-=29;
					else
						{
						m=i;
						d=days;
						break;
						}
					}
				else
					{
					if(days>28)
						days-=28;
					else
						{
						m=i;
						d=days;
						break;
						}
					}
				}
			}
		m=i;
		}
return 1;
}

int CalcNewYangWithDays(int days,int& y,int& m,int& d)//0,0,0 as base yang year
{
	int i=0;
	int num=days/365-1;
	if(num<0)return 0;
	int leftDays=days-(num+1)*365;
	int leapYearNum=0;
	for(i=1;i<=num;i++)
		{
		if(IsLeapYear(i))
			leapYearNum++;
		}
	if(leftDays>=leapYearNum)
		{
		leftDays=leftDays-leapYearNum;
		CalcNewYangWithDaysLess365(num,leftDays,y,m,d);
		}
	else//leftDays<leapYearNum
		{
		if(IsLeapYear(num))
			leapYearNum--;
		num=num-1;
		leftDays=365+leftDays-leapYearNum;
		CalcNewYangWithDaysLess365(num,leftDays,y,m,d);
		}
return 1;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -