C++课程设计万年历Word下载.docx
《C++课程设计万年历Word下载.docx》由会员分享,可在线阅读,更多相关《C++课程设计万年历Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
//或是经常使用但不常更改的
//特定于项目的包含文件
#pragmaonce
#include<
iostream>
cstring>
ctime>
iomanip>
stdio.h>
fstream>
cmath>
#include<
vcclr.h>
vector>
#using<
mscorlib.dll>
System.dll>
System.Windows.Forms.dll>
System.Drawing.dll>
#defineLeapYear(y)((y%4==0)&
&
(y%100!
=0)||(y%400==0))
usingnamespacestd;
structSolarLunar
{
intSolarYear;
//阳历年
intSolarMonth;
//阳历月
intSolarDay;
//阳历日
intLunarYear;
//阴历年
intLunarMonth;
//阴历月
intLunarDay;
//阴历日
intLunarLeapMonth;
//阴历闰月标志,1表示此月为闰月,0表示非闰月
charholiday[9];
//节日信息
};
intdjs(intcurYear,intcurMonth,intcurDay,intcurHour,intcurMin);
//倒计时统计
intgetdays(intyear,intmonth);
//计算当前月份天数
intgetweek(intyear,intmonth,intday);
//分析当前月份第一天是星期几
intgetsec(System:
:
String^s);
//转换txt字符为日期并让djs()处理返回秒
voidSolarToLunar(SolarLunar*p);
//阳历转换成农历
voidGetHoliday(SolarLunar*p);
//获得节日信息
intGetDayNumber(intyear,intmonth,intday);
//判断阳历某一天是该年的第几天
intGetTotalDayNumber(intyear,intmonth,intday);
//求从阳历1900年1月31日(阴历1900年1月1日)到某年某月某日(阳历)共多少天
intLunarYearDays(inty);
intIsLeapYear(intyear);
intLunarLeapDays(inty);
intLunarMonthDays(inty,intm);
intLunarLeapMonth(inty);
//djs.cpp计算时间差的函数
#include"
stdafx.h"
intdjs(intcurYear,intcurMonth,intcurDay,intcurHour,intcurMin)
{
time_tt;
t=time(NULL);
structtmt1,t2,*ptr;
ptr=localtime(&
t);
memset(&
t1,0x00,sizeof(t1));
t2,0x00,sizeof(t2));
intstrYear=curYear;
intstrMon=curMonth;
intstrDay=curDay;
intstrHour=curHour;
intstrMin=curMin;
intstrSec=0;
t1.tm_year=strYear-1900;
t1.tm_mon=strMon-1;
t1.tm_mday=strDay;
t1.tm_hour=strHour;
t1.tm_min=strMin;
t1.tm_sec=strSec;
t2.tm_year=ptr->
tm_year;
t2.tm_mon=ptr->
tm_mon;
t2.tm_mday=ptr->
tm_mday;
t2.tm_hour=ptr->
tm_hour;
t2.tm_min=ptr->
tm_min;
t2.tm_sec=ptr->
tm_sec;
time_tstart=mktime(&
t1);
time_tend=mktime(&
t2);
time_tretSec=start-end;
time_tretMin=retSec/60;
//time_tretHour=retMin/60;
//time_tretDay=retHour/24;
return(int)retSec;
}
//getweek.cpp
#include"
intgetweek(intyear,intmonth,intday)
if(month==1||month==2){
month+=12;
--year;
}
return(day+1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
//getday.cpp
intgetdays(intyear,intmonth)
intdays[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(LeapYear(year)&
month==2)
return29;
else
returndays[month-1];
//getsec.cpp计算时间差的函数
//将从txt得到的字符时间转换成整型数时间差得到秒
String^s)
structtmt1;
memset(&
System:
String^strYear,^strMon,^strDay,^strHour,^strMin;
String^str1(s);
//2010-01-0101:
01
strYear=str1->
Substring(0,4);
strMon=str1->
Substring(5,2);
strDay=str1->
Substring(8,2);
strHour=str1->
Substring(11,2);
strMin=str1->
Substring(14,2);
t1.tm_year=(strYear[0]-48)*1000+(strYear[1]-48)*100+(strYear[2]-48)*10+(strYear[3]-48)-1900;
t1.tm_mon=(strMon[0]-48)*10+(strMon[1]-48)-1;
t1.tm_mday=(strDay[0]-48)*10+(strDay[1]-48);
t1.tm_hour=(strHour[0]-48)*10+(strHour[1]-48);
t1.tm_min=(strMin[0]-48)*10+(strMin[1]-48);
t1.tm_sec=0;
structtmt2,*ptr;
}//getsec结束
//SolarToLunar.cpp阳历到农历的转换
//阳历到阴历的转换
voidSolarToLunar(SolarLunar*p)
p->
LunarLeapMonth=0;
//初始设置当前月不是阴历闰月
intnumber=GetTotalDayNumber(p->
SolarYear,p->
SolarMonth,p->
SolarDay);
inti;
for(i=1900;
i<
2050&
number>
0;
i++)
number=number-LunarYearDays(i);
if(number<
=0)
{
number=number+LunarYearDays(i-1);
//number最终保存了当天是该年(阴历年)的第几天
i--;
LunarYear=i;
//获得阴历年
inta=LunarLeapMonth(i);
//获得阴历年的闰月
intflag=0;
//减掉闰月的标志
intj;
for(j=1;
j<
12&
j++)//应考虑阴历闰月的情况
number=number-LunarMonthDays(i,j);
if(j==a&
0)
{
number=number-LunarLeapDays(i);
//减掉闰月天数
flag=1;
}
if(LunarLeapMonth(i)&
j-1==a&
flag)//最后一次减掉的是闰月
number=number+LunarLeapDays(i);
//加上最后减掉的闰月天数
p->
LunarLeapMonth=1;
//设置当前月是阴历闰月的标记
else
number=number+LunarMonthDays(i,j-1);
j--;
LunarMonth=j;
//获得阴历月
LunarDay=number;
//获得阴历日
//holiday.cpp节日判断(由于调试问题本程序最终应用的时候并没有添加此功能)
//获得节日信息
voidGetHoliday(SolarLunar*p)
strcpy(p->
holiday,"
"
);
//初始化
intnumber;
number=p->
LunarMonth*100+p->
LunarDay;
//阴历节日
switch(number)
case115:
strcpy(p->
holiday,"
元宵"
break;
case505:
端午"
case707:
中元"
case815:
中秋"
case1208:
腊八"
intLunarInfo[]={0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0};
//判断闰年
intIsLeapYear(intyear)
if((year%4==0&
year%100!
=0)||(year%400==0))
return1;
return0;
//获取农历y年的总天数
intLunarYearDays(inty)
inti,sum=348;
for(i=0x8000;
i>
0x8;
=1)
sum+=(LunarInfo[y-1900]&
i)?
1:
0;
return(sum+LunarLeapDays(y));
//获取农历y年闰月的天数
intLunarLeapDays(inty)
if(LunarLeapMonth(y))
return((LunarInfo[y-1900]&
0x10000)?
30:
29);
else
return(0);
//获取农历y年闰哪个月1-12,没闰传回0
intLunarLeapMonth(inty)
return(LunarInfo[y-1900]&
0xf);
//获取农历y年m月的总天数
intLunarMonthDays(inty,intm)
return((LunarInfo[y-1900]&
(0x10000>
m))?
//GetDayNumber.cpp
intGetDayNumber(intyear,intmonth,intday)
intMonthDays[12]={0,31,28,31,30,31,30,31,31,30,31,30};
intnumber=0;
for(inti=0;
i<
month;
i++)//求1月到month-1月的天数,暂时不考虑闰年
number=number+MonthDays[i];
if(month>
2)//该月不是1,2月份,这时需要考虑闰年
number=number+IsLeapYear(year);
returnnumber+day;
//GetTotalDayNumber.cpp
//求从阳历1900年1月31日(阴历1900年1月1日)到某年某月某日(阳历)共多少天
intGetTotalDayNumber(intyear,intmonth,intday)
for(inti=1900;
year;
i++)//1900年1月1日到year-1年12月31日的天数
if(IsLeapYear(i))
number=number+366;
number=number+365;
number=number+Ge