万年历程序代码实现

#include
#include//获取系统时间函数所在头文件
#include//清屏函数所在头文件
#define YEAR 365
int leap(int year)
{
int n;
n=(year%4==0&&year%100!=0||year%400==0);
return(n);
}
void numday(int year, int month) /*从2000年1月开始*/
{
int i,day,first_day,flag,year1,year2,temp=6;
flag=leap(year);
year1=year/100; /*相差几百年*/
year2=year%100; /*中间几十年*/
if(year>=2000) /*大于2000年*/
{
year1-=20;
day=year1*YEAR*100+year1*24+YEAR*year2+(year2-1)/4;/*2000年到读取系统时间时的总天数*/
if(year>2000) day+=(year/400-4); /*加上100到2000年能被400整除的年数*/
switch(month)
{
case 1:day+=0;break;
case 2:day+=31;break; /*加上月份天数*/
case 3:day+=59+flag;break;
case 4:day+=90+flag;break;
case 5:day+=120+flag;break;
case 6:day+=151+flag;break;
case 7:day+=181+flag;break;
case 8:day+=212+flag;break;
case 9:day+=243+flag;break;
case 10:day+=273+flag;break;
case 11:day+=304+flag;break;
case 12:day+=334+flag;break;
}
day+=temp; /*加上2000年1月1号是星期六*/
first_day=day%7; /*对7取余,为0时是星期日*/
}
else /*以下25行,计算<2000年,算法同上*/
{
year1=20-1-year1;
year2=100-year2-1; /*倒减,应多减1*/
day=year1/4;
day+=(365+24)*year1+365*year2+year2/4;
switch(month)
{
case 12:day+=31;break;
case 11:day+=61;break;
case 10:day+=92;break;
case 9:day+=122;break;
case 8:day+=153;break;
case 7:day+=184;break;
case 6:day+=214;break;
case 5:day+=245;break;
case 4:day+=275;break;
case 3:day+=306;break;
case 2:day+=334+flag;break;
case 1:day+=365+flag;break;
}
day-=temp; /*减去1号的6天*/
day=day%7;
first_day=(7-day)%7; /*反对称*/
}
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:month=31;break;
case 4:
case 6:
case 9:
case 11:month=30;break;
case 2:month=28+flag;
}
printf(" SUN MON TUE WED THU FRI SAT\n");
for(i=1;i<=4*first_day;i++) /*输出空格*/
printf(" ");
for(i=0;i{
printf("%4d",i+1); /*输出日历*/
if((first_day+i)%7==6)printf("\n");
}
printf("\n");
}
void main()
{
while(1)
{
int year,month,day,sec,min,hour;
time_t nowtime; //读取系统时间函数
struct tm *timeinfo;
time( &nowtime );
timeinfo = localtime( &nowtime );
year = timeinfo->tm_year + 1900;
month = timeinfo->tm_mon + 1;
day = timeinfo->tm_mday;
sec=timeinfo->tm_sec; //秒
min=timeinfo->tm_min;//当前的分钟
hour=timeinfo->tm_hour;//时
printf(" 万年历系统\n");
printf(" %d年%d月%d

日\n", year, month, day);
printf(" 时间:%d:%d:%d\n",hour,min,sec);
printf(" month:%d\n",month);
numday(year,month);
system("cls");//清屏函数
}
}










#include
#include
#include
class Date //定义一个时间类
{
private: //时间类包含的变量
int year;
int month;
int days;
int wday;
private: //私有成员的说明

int YearToDays(int y);
int DatesToDays();
int MonthToWeek();
int YearMonthToDay( int y,int m);
public:
Date(int y=0,int m=0,int d=0) //构造函数的定义
{
year=y;
month=m;
days=d;
wday=DatesToWeek();
}
~Date() //析构函数的定义
{}
void Now();
void showyuandan()//显示元旦是星期几的函数
{int n; //已知1900年的元旦刚好是星期一
if(year>1900)n=year-1900;
else n=1911-year;
n=n+(n-1)/4+1; // 判断,以每年52个整星期计算year年比1900年多出来的天数
n=n%7;
if(n==0)
cout<<"这年元旦是星期7"<< endl;
else
cout<<"这年元旦是星期"<
}
int DatesToWeek();
Date LastMonth(); //计算下个月的月历
Date NextMonth(); //
void LastTime();
void InputYearMonth(); //输入年月日的函数判断格式是否正确
void DisPlayMonth(); //显示月历
void InputDates(); //输入日期判断格式是否正确
int Week() //计算星期 按日历的形式输出
{
return wday;
}
Date operator+(const int &n); //运算符重载
Date operator-(const int &n);
int operator-( Date &dt);
friend ostream & operator<< ( ostream & out, const Date &c);
};
void Date::Now() //成员函数的定义以1900年为标准
{
time_t te;
tm *tp;
year=tp->tm_year+1900;
month=tp->tm_mon+1;
days=tp->tm_mday;
wday=tp->tm_wday;

}
Date Date:: operator-(const int &n)//减号的运算符重载为类的成员函数
{
int m=n;
int mday;
Date dt(*this);
mday=YearMonthToDay(dt.year,dt.month);
while(dt.days+m >mday)
{
dt.month--;
if(dt.month>1)
{
dt.year-=1;
dt.month=12;
}
m-=mday;
mday=YearMonthToDay(dt.year,dt.month);
}
dt.days+=m;
return dt;
}

Date Date::operator+(const int &n)//加号的运算符重载为类的成员函数
{
int m=n;
int mday;
Date dt(*this);
mday=YearMonthToDay(dt.year,dt.month);
while(dt.days+m > mday)
{
dt.month++;
if(dt.month>12)
{
dt.year+=1;
dt.month=1;
}
m-=mday;
mday=YearMonthToDay(dt.year,dt.month);
}

dt.days+=m;
return dt;
}
int Date::operator-( Date &dt)
{
int y=dt.year;
int m=dt.month;
int t1 = dt.DatesToDays ();
int t2 = DatesToDays();
return (t2 - t1);
}
int Date::YearToDays(int y) //计算某年的总共的天数是多少
{
int d=0;
int i=(y-1900)*365;

while(y>1900)
{
if((y-1)% 4 ==0 && (y-1) % 100 != 0 || (y-1) % 400 == 0)

//判断是否是闰年然后输出下面的函数

++d;
--y;
}
return(d+i);

}

int Date::YearMonthToDay(int y,int m )//计算某年的月份的的情况以及天数的情况
{

int mday=0;
switch(m) //switch语句判断每月的天数是多少以及二月份的天数是多少
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
mday=31;
break;
case 2:
if(y % 4 ==0 && y % 100 != 0 || y % 400 == 0)
mday=29;
else
mday=28;
break;
case 4: case 6: case 9: case 11:
mday=30;
break;
default:
mday=0;
}
return mday;
}
int Date::DatesToDays( ) //循环判断月份的函数
{
int total = 0;
while( month >1)
{
total += YearMonthToDay(year ,month-1);
--month;
}
int num = YearToDays( year);
return (total +num +days);
}
int Date::DatesToWeek()//计算某年的星期情况
{
int w = DatesToDays();
return (w%7);
}
Date Date:: NextMonth( )//进行下一个月份的计算
{
Date tmp( *this);
if(month ==12)
{
tmp.month = 1;
++tmp.year ;
}
else
++tmp.month;

return tmp;
}

Date Date::LastMonth( )
{
Date tmp( *this);
if(month ==1)
{
tmp.month = 12;
--tmp.year ;
}
else
--tmp.month;

return tmp;

}
void Date::LastTime()
{

}
void Date::InputDates() //输入日期判断是否正确并赋值包括年月日
{
cout<<"输入年:"<cin>>year;

cout<<"输入月:"<cin>>month;

cout<<"输入天"<cin>>days;
}

void Date::InputYearMonth() //输入日期判断是否正确并赋值包括年月
{
cout<<"输入年:"<cin>>year;

cout<<"输入月:"<cin>>month;

}
int Date::MonthToWeek( )
{
int t = DatesToDays( );
return (t-days)%7;
}
void Date::DisPlayMonth( ) //输出月历的函数
{
int y=year;
int m=month;
cout<<"---------------我爱万年历--------------------"<cout<<"**********************************************"<cout<<" "<<"日"<<" "<<"一"<<" "<<"二"<<" "<<"三"<<" "<<"四"<<" "<<"五"<<" "<<"六"<int w = MonthToWeek( );
if( w !=6)
for( int i =0;i<=w;i++)
cout<<" ";
int k = YearMonthToDay(y,m);
for( int j = 1 ;j<= k; ++j)
{
cout<if( (j+w+1)%7 ==0)
cout<}
cout<cout<<"********************************************"<cout<<"--------------------------------------------"<
}
ostream & operator<< ( ostream & out, const Date &c)
{
out<
return out;
}
void main() //主函数的定义包括输出
{
int i,j,k;
Date d1,d2,d3,d4,d5;
cout<<"**************欢迎使用我爱万年历**************"<cout<<"****请选择操作: ****"<cout<<"**** 1.查询某年月历: ****"<co

ut<<"**** 2.查询某天是星期几: ****"<cout<<"**** 3.查询某年元旦是星期几: ****"<cout<<"**** 0.退出该程序: ****"<cin>>i;
while(i!=0)
{
switch(i)
{
case 0:
break;
case 1:

d1.InputYearMonth();
d1.DisPlayMonth();
cout<<"1.查询上一个月"<cout<<"2. 查询下一个月:"<cout<<"0.返回:"<cin>>j;
while(j!=0)
{
switch(j)
{
case 0:
break;
case 1: //输出月历
d2=https://www.360docs.net/doc/eb14549751.html,stMonth();
d2.DisPlayMonth();
break;
case 2: //输出某日是星期几
d3=d1.NextMonth();
d3.DisPlayMonth();
break;
default:
while(j<0||j>2)
{
cout<<"请重新选择"<cin>>j;
}
}
cout<<"0返回"<cin>>j;
}
break;
case 2: //输出某天是星期几
d4.InputDates();
k=d4.DatesToWeek();
cout<<"这天是星期"<break;
case 3: //输出本年元旦是星期几,调用函数
d5.InputYearMonth();
d5.showyuandan();

break;
default:
while(i<0||i>3)
{
cout<<"请重新输入"<cin>>i;
}
}

cout<<"**** 1.查询某年月历: ****"<cout<<"**** 2.查询某天是星期几: ****"<cout<<"**** 3.查询某年元旦是星期几: ****"<cout<<"**** 0.退出该程序: ****"<cin>>i;
}
}

相关文档
最新文档