#include<iostream>
#include<string>
#include<iomanip>
#include <stdlib.h>
#include<time.h>
#include<windows.h>
using namespace std;
class Calendar
{
private:
int y;
int m;
int d;
static int mon_days_R[12];//定义闰年时每个月的天数
static int mon_days_NR[12];//定义非闰年时每个月的天数
static int week_days[7];//定义星期,从星期六开始
public:
Calendar();//构造函数初始化y,m,d
void showtime();//显示日期
int define_year_days(int year);//确定年份天数
int define_mon_days(int mon);//确定月份天数
int define_week_days();//确定月份首日星期数
void print_Calendar();//显示当月日历
void search_the_month();//查询月份
void the_last_month();//上一个月
void the_next_month();//下一个月
};
Calendar::Calendar()//构造函数初始化y,m,d
{
time_t timer;
time(&timer);
tm* t_tm = localtime(&timer);
y=t_tm->tm_year+1900;
m=t_tm->tm_mon+1;
d=t_tm->tm_mday;
}
void Calendar::showtime()//显示日期
{
cout<<'\n'<<" "<<y<<"年"<<m<<"月"<<d<<"日"<<'\n';
cout<<" -----------------------------------------"<<endl;
}
int Calendar::define_year_days(int year)//确定年份天数
{
int year_days;
if(((year%400==0) || (year%4==0 && year%100!=0)))
year_days=366;
else
year_days=365;
return year_days;
}
int Calendar::define_mon_days(int mon)//确定月份天数
{
int mon_days;
if(((y%400==0) || (y%4==0 && y%100!=0)))
mon_days=mon_days_R[mon-1];
else
mon_days=mon_days_NR[mon-1];
return mon_days;
}
int Calendar::define_week_days()//确定月份首日星期数
{
long temp=0,temp1=0,temp2=0;
long i,j,remainder;
int week_d;
if(y>=2000)
{
for(i=2000;i<y;i++)
{
int year_days=define_year_days(i);
temp1+=year_days;
};
}
if(m>=1&&m<13)
{
for(j=1;j<m;j++)
{
int mon_days=define_mon_days(j);
temp2+=mon_days;
};
}
temp=temp1+temp2;//总天数
remainder=temp%7;
week_d=week_days[remainder];
return week_d;
}
void Calendar::print_Calendar()//显示当月日历
{
while(1)
{
system("cls");
showtime();
int w_day,m_day;
int t=1,p,q;
w_day=define_week_days();
m_day=define_mon_days(m);
int chat[6][7];
cout<<endl;
cout<<" 日 一 二 三 四 五 六"<<endl;
cout<<" -----------------------------------------"<<endl;
for(p=0;p<1;p++)
{
for(q=w_day;q<7;q++)
chat[p][q]=t++;
}
for(p=1;p<6;p++)
{
for(q=0;q<7;q++)
{
chat[p][q]=t++;
if(t>m_day)
break;
}
}
cout<<" ";
for(p=0;p<1;p++)
{
for(q=0;q<w_day;q++)
cout<<" ";
for(q=w_day;q<7;q++)
cout<<setfill('0')<<setw(2)<<chat[p][q]<<" ";
}
cout<<endl;
for(p=1;p<6;p++)
{
cout<<" ";
for(q=0;q<7;q++)
{
cout<<setfill('0')<<setw(2)<<chat[p][q]<<" ";
if(chat[p][q]==m_day)
break;
}
cout<<endl;
if(chat[p][q]==m_day)
break;
}
cout<<endl<<endl;
cout<<" -----------------------------------------"<<endl;
cout<<" 功能选项:"<<endl;
cout<<" -----------------------------------------"<<endl;
cout<<" 1.查询日历"<<endl;
cout<<" 2.上一个月"<<endl;
cout<<" 3.下一个月"<<endl;
cout<<" 0.返回主菜单"<<endl<<endl;
cout<<" 请选择:";
int choose;
cin>>choose;
if(choose==0) break;
switch(choose)
{
case 1:
search_the_month();//查询月份
system("pause");
break;
case 2:
the_last_month();//上一个月
system("pause");
break;
case 3:
the_next_month();//下一个月
system("pause");
break;
default:
cout<<" 选择有误!!"<<endl;
}
}
}
void Calendar::search_the_month()//查询月份
{
char sel;
do
{
system("cls");
cout<<endl;
cout<<" 请输入所查询时间:";
cin>>y>>m>>d;
if(y>=2000 && m>=1 && m<13 && d>=1 && d<=define_mon_days(m))
{
system("cls");
showtime();
print_Calendar();
}
else
{
cout<<" 输入有误,是否要继续查询(Y/N):";
cin>>sel;
}
}while(sel=='Y' || sel=='y' );
}
void Calendar::the_last_month()//上一个月
{
system("cls");
if(m==1)
{
if(y==2000)
cout<<" 时间已至最前"<<endl;
else
{
m=12;
--y;
}
}
else
--m;
d=1;
showtime();
print_Calendar();
}
void Calendar::the_next_month()//下一个月
{
system("cls");
if(m==12)
{
m=1;
++y;
}
else
++m;
d=1;
showtime();
print_Calendar();
}
int Calendar::mon_days_R[12]={31,29,31,30,31,30,31,31,30,31,30,31};//定义闰年时每个月的天数
int Calendar::mon_days_NR[12]={31,28,31,30,31,30,31,31,30,31,30,31};//定义非闰年时每个月的天数
int Calendar::week_days[7]={6,0,1,2,3,4,5};//定义星期,从星期六开始
int main()
{
int select;
while(1)
{
system("cls");
cout<<endl;
cout<<" -----------------------------------------"<<endl;
cout<<" 日历记事本 "<<endl;
cout<<" -----------------------------------------"<<endl;
cout<<" 1--使用万年历 "<<endl;
cout<<" 2--新建记事本 "<<endl;
cout<<" 3--查看记事本 "<<endl;
cout<<" 0--退出 "<<endl;
cout<<endl;
cout<<" 请选择:";
cin>>select;
if(select==0) break;
switch(select)
{
case 1:
{
Calendar chat1;
chat1.print_Calendar();
system("pause");
break;
}
default:
cout<<" 选择有误,请重新选择"<<endl;
}
}
return 0;
}