/*DOS下的日历表(C++精简版)*/
#include<iostream>
#include<ctime>
#include<iomanip>
using namespace std;
int sum(int y,int m); //计算并输出这天是1992年后的第几天
bool fun(int y); //判断是否是瑞年
int mouth(int m); //返回各月天数
int y,m,d; //全局变量年-月-日
int main()
{
char c;
bool judge(); //输入并判断日期格式是否正确
void time(); //获取系统日期
void printdate(int y,int m,int d); //打印日期
time(); //初始化时间
printdate(y,m,d); //打印当前日期
do
{
while(!judge())
{
cout<<"输入有误请重新输入(1992年以后日期):"<<endl;
};
printdate(y,m,d);
cout<<"是否继续(Y):";
cin>>c;
}while(c=='Y');
return 0;
}
//判断是否是瑞年
bool fun(int y)
{
if ((y%4==0)&&(y%100!=0)||(y%400==0)) return true ;
return false;
}
//输入并判断日期格式是否正确
bool judge()
{
cout<<"请输入要查询的日期(1992年后的日期):(格式:year-mouth-day)";
cin>>y>>m>>d;
if ((y<1992)||(m<1)||(m>12)||(d>mouth(m)||d<1)) return false;
return true;
}
//返回各月天数
int mouth(int m)
{
if((m==4)||(m==6)||(m==9)||(m==11)) return 30;
if((m==2)&&(fun(y))) return 29;
if((m==2)&&(!fun(y))) return 28;
return 31;
}
//计算并输出这天是1992年后的第几天
int sum(int y,int m)
{
int sum=0;
for(int j=1992;j<y;j++)
fun(j)?sum+=366:sum+=365;
for(int i=1;i<m;i++)
sum+=mouth(i);
return sum;
}
//获取系统日期
void time()
{
time_t now;
struct tm*fmt;
time(&now);
fmt=localtime(&now);
y=1900+fmt->tm_year; //返回年
m=1+fmt->tm_mon; //返回月
d=fmt->tm_mday; //返回日
if(y<1992) //因系统错误对软件的异常处理
{
cerr<<"error"<<endl;
exit(0);
}
cout<<"当前日期为: "<<y<<"-"<<m<<"-"<<d<<endl;
}
//打印日期表
void printdate(int y,int m,int d)
{
int days;
days=sum(y,m); //返回1992年至今的总天数
cout<<"当前日期高黑显示"<<endl;
cout<<setw(4)<<"Su"<<setw(4)<<"Mo"<<setw(4)<<"Tu"<<setw(4);
cout<<"W"<<setw(4)<<"Th"<<setw(4)<<"Fr"<<setw(4)<<"Sa"<<endl;//格式化日历表头
for(int j=0;j<(days+3)%7;j++)
cout<<" ";
for(int i=j+1;i<mouth(m)+j+1;i++)
{
if (i%7==0) cout<<setw(4)<<i-j<<endl;
else if(i-j==d) cout<<" "; //当前日期高黑标记
else cout<<setw(4)<<i-j;
}
cout<<endl;
}
/*DOS下的日历表(C++精简版)*/
最新推荐文章于 2017-05-17 14:31:24 发布