/*DOS下的日历表(C++精简版)*/

/*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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值