//date.h
//选择输出日期前请先设置日期
//制作:杨忠学
//E_mail: yzx_xue@163.com
#include<iostream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
int const NoLeapday[]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年
int const Leapday[]={31,29,31,30,31,30,31,31,30,31,30,31}; //润年
char const *WeekDay[]={"日","一","二","三","四","五","六"};
class Tdate{
public:
void Menupri(void);
void SetDay(void);
void Dayadd(void); //日期加1
void Daysub(void); //日期减1
void Dayprint(void);
int getyear() { return year;}
int getmonth() { return month;}
int getday() {return day;}
int getdayofmonth(int y,int m);
int Dayofweek(int y,int m,int d=1);
int IsLeapYear() const{ return ( year%4==0 && year%100!=0 )||( year%400==0 ); }
void pMonthRili(int y,int m);
void pYearRil();
Tdate(){week=Dayofweek(getyear(),getmonth(),getday());}
private:
int year;
int month;
int day;
int week;
};
//date.cpp
#include "data.h"
#include <iostream>
using namespace std;
void Tdate::SetDay()
{
system("cls");
cout<<"请输入年月日"<<endl;
cin>>year>>month>>day;
while(month>12||month<=0||day<=0||(IsLeapYear()&&(day>Leapday[month-1]))||!IsLeapYear()&&(day>NoLeapday[month-1])) //判断输入是否正确
{
cout<<"输入错误!"<<endl<<"重新输入"<<endl;
cin>>year>>month>>day;
}
}
void Tdate::Menupri()
{
cout<<" 请选择菜单 "<<endl;
cout<<" 0.退出"<<endl;
cout<<" 1.输出日期"<<endl;
cout<<" 2.设置日期"<<endl;
cout<<" 3.日期加1"<<endl;
cout<<" 4.日期减1"<<endl;
cout<<" 5.输出年日历"<<endl;
cout<<" 6.输出本月日历"<<endl;
}
void Tdate::Dayadd()
{
if((IsLeapYear()&&(day==Leapday[month-1]))||!IsLeapYear()&&(day==NoLeapday[month-1]))
{
day=1;
if(month==12)
{ month=1;
year++;
}
else
month++;
}
else
day++;
cout<<"明天是:"<<year<<"-"<<month<<"-"<<day<<endl;
}
void Tdate::Daysub()
{
if(day==1) //如果是1号
{ if(month==1) //如果是1月1号
{ month=12;
year--;
}
else //其他月
month--;
if(IsLeapYear()) //闰年
day=Leapday[month-1];
else //平年
day=NoLeapday[month-1];
}
else //不是1号
day--;
cout<<"昨天是:"<<year<<"-"<<month<<"-"<<day<<endl;
}
int Tdate::getdayofmonth(int y,int m)
{
if(IsLeapYear())
return (Leapday[m-1]);
else
return(NoLeapday[m-1]);
}
int Tdate::Dayofweek(int y,int m,int d)
{
int new_year,new_month;
new_year=y;
new_month=m;
if(m==1||m==2)
{
new_month+=12;
new_year--;
}
return ((d+2*new_month+3*(new_month+1)/5+new_year+new_year/4-new_year/100+new_year/100)%7);
}
void Tdate::pYearRil() //从1月开始打印日历
{
for(int k=1;k<=12;k++)
pMonthRili(getyear(),k);
}
void Tdate::pMonthRili(int y,int m)
{
int w=Dayofweek(getyear(),m,1); //计算1号是星期几
cout<<"**********"<<y<<"年"<<m<<"月"<<"**********"<<endl;
for(int i=0;i<=6;i++)
cout<<setw(4)<<WeekDay[i];
cout<<endl;
cout<<setw(4*w)<<"";
for(i=1;i<=getdayofmonth(getyear(),m);i++)
{ cout<<setw(4)<<i;
w++;
if(w==7)
{ w=0;
cout<<endl;
}
}
cout<<endl<<"*****************************"<<endl;
}
void Tdate::Dayprint(void)
{
char p[10];
week=Dayofweek(getyear(),getmonth(),day);
strcpy(p,WeekDay[week==7?0:week]);
cout<<"今天是:"<<year<<"-"<<month<<"-"<<day<<" 星期"<<p<<endl;
}
void main()
{
Tdate myday;
cout<<"请先设置日期!"<<endl;
int index;
while(1)
{
myday.Menupri(); //输出菜单
cin>>index;
switch(index)
{
case 1: myday.Dayprint();break;
case 2: myday.SetDay(); break;
case 3: myday.Dayadd();break;
case 4: myday.Daysub();break;
case 5: myday.pYearRil();break;
case 6: myday.pMonthRili(myday.getyear(),myday.getmonth());break;
default: exit(1);
}
}
}