c++课程设计 对日期的基本运算 使用重载

本文介绍了一个简单的日期计算器类的实现,该类能够进行日期加减运算并返回指定日期是一周中的哪一天。通过重载加减运算符,可以方便地向前或向后推算日期,并计算两个日期之间的天数差。
#include<iostream>
#include<iomanip>
#include<string>
#define error 0
using namespace std;

class Calendar
{
private:
	
	int month;
	int date;
	string Day[7];//char Day[7][10];//私有成员不能初始化,而且字符数组要想赋值,要么就一个一个的赋值
	int Month[13];
	int sumday;
	int year;
public:
	Calendar(){}
	Calendar(int y,int m,int d)
	{
		year=y;
		month=m;
		date=d;
		Month[0]=0;Day[0]="日";
		Month[1]=31;Day[1]="一";
		Month[2]=28;Day[2]="二";
		Month[3]=31;Day[3]="三";
		Month[4]=30;Day[4]="四";
		Month[5]=31;Day[5]="五";
		Month[6]=30;Day[6]="六";
		Month[7]=31;
		Month[8]=31;
		Month[9]=30;
		Month[10]=31;
		Month[11]=30;
		Month[12]=31;
		sumday=0;
	}
	bool Leapyear(int y)
	{
		if((y%400==0)||((y%4==0)&&(y%100!=0)))
		{
			Month[2]=29;
			return true;
		}
		else
		{
			Month[2]=28;
			return false;
		}
	}
	int yearDay(int y)
	{
		if(Leapyear(y))return 366;
		if(!Leapyear(y))return 365;
		return error;
	}
	int Dateday()
	{
		return date;
	}
	int Monthday(int m)
	{
		return Month[m];
	}
	void Yearday(int y)
	{
		if(Leapyear(y))sumday=sumday+366;
		else
			sumday=sumday+365;
	}
	void Sumday()               //返回从公元1年1月至今的天数一
	{
		int i=1;
		for(;i!=year;i++)
		{
			Yearday(i);
		}
		Leapyear(year);
		for(i=1;i<month;i++)
		{
			sumday+=Monthday(i);
		}
		sumday+=date;
	}
	int Return_sumday()
	{
		return sumday;
	}
	int Onedate1(int t) //返回这一年的第一天是星期几
	{
		t=sumday%7;
		if(t==1) return 1;
		if(t==2) return 2;
		if(t==3) return 3;
		if(t==4) return 4;
		if(t==5) return 5;
		if(t==6) return 6;
		if(t==0) return 0;
		return error;
	}
	/*int Onedate2(int t)
	{
		t=sumday%7;
		if(t==1) return 0;
		if(t==2) return 6;
		if(t==3) return 5;
		if(t==4) return 4;
		if(t==5) return 3;
		if(t==6) return 2;
		if(t==0) return 1;
		return error;
	}*/
	void Output1()              //往前推得输出年,月,日
	{
		cout<<"year:"<<year<<endl;
		cout<<"month:"<<month<<endl;
		cout<<"date:"<<date<<endl;
		int t;
		cout<<"星期";
		t=Onedate1(sumday);
		if(t==7)cout<<Day[0]<<endl;
		else
			cout<<Day[t]<<endl;
	}
	/*void Output2()                //往后推的年月日
	{
		cout<<"year:"<<year<<endl;
		cout<<"month:"<<month<<endl;
		cout<<"date:"<<date<<endl;
		int t;
		cout<<"星期";
		t=Onedate2(sumday);
		if(t==7)cout<<Day[0]<<endl;
		else
			cout<<Day[t]<<endl;
	}*/
	int One_Year()              //返回本年一共是多少天
	{
		int i,s1=0;
		for(i=1;i<month;i++)
			s1=s1+Monthday(i);
		s1=s1+date;
		return s1;
	}
	void operator +(int n)
	{
		sumday+=n;
		int s,s2,s3,s4,i,k1,k2,k3;
		if(Leapyear(year))s=366;
		else
			s=365;
		s3=One_Year();
		s4=s3+n;
		if(s>=s4)                  //在本年内
		{
			s2=n-Monthday(month)+date;
			if(s2<=0)date=date+n;    //本月内
			else
			{
				
				i=month;
				while(s2!=0)
				{
					i++;
					k1=s2%Monthday(i);
					s2=s2/Monthday(i);	
				}
				month=i;
				date=k1;
			}
		}
		else                     //不在本年内
		{
			s2=n-s+s3;
			while(s2!=0)         //确定第几年
			{
				year++;
				k2=s2%yearDay(year);
				s2=s2/yearDay(year);
			}
			month=0;
			while(k2!=0)         //确定第几个月
			{
				month++;
				k3=k2%Monthday(month);
				k2=k2/Monthday(month);
				
			}
			date=k3;             //第几日
		}
	}	
	void operator -(int n)    //刚开始没有重载好减号运算符,应为是倒过来算的,所以日起赋值必须是用这个月份的全部天数-求模余下来的天数
	{
		sumday-=n;
		if(sumday<0)
		{
			cout<<"超出了天数的范围!"<<endl;
			return ;
		}
		else
		{
			if(sumday==0)
			{
				cout<<"超出了天数的范围!"<<endl;
				return ;
			}
			else
			{
				int s1,s2,k1,k2;
				s1=One_Year();
				s1=s1-n;
				if(s1>0)            //在本年内
				{
					s2=date-n;
					if(s2>0)        //在本月内
						date-=n;
					else                //不在本月内
					{
						//	sumday++;             //??不在本年和本月的时候就sumday要加一次
						if(s2<0)
						{
							s2=-s2;
							while(s2!=0)
							{
								month--;
								k1=s2%Monthday(month);
								s2=s2/Monthday(month);
							}
							date=Monthday(month)-k1;
						}
						else
						{
							month--;
							date=Monthday(month);
						}
					}
				}
				else                      //不再本年内
					{
						s2=-s1;
						if(s2!=0)
						{
							while(s2!=0)          //确定第几年
							{
								year--;
								k1=s2%yearDay(year);
								s2=s2/yearDay(year);
							}
							month=13;
							while(k1!=0)         //确定第几个月
							{
								month--;
								k2=k1%Monthday(month);
								k1=k1/Monthday(month);
							}
							date=Monthday(month)-k2;             //第几日
						} 
						else
						{
							year--;
							month=12;
							date=Monthday(month);
						}
					}
			}
		}
	}
	int operator -(Calendar b)
	{
		int n;
		Sumday();
		b.Sumday();
		n=Return_sumday()-b.Return_sumday();
		if(n<0)n=n*(-1);
		return n;
	}
};
	
int main()
{
	cout<<"Please input year,month,date:";
	int y,m,d;
	cin>>y>>m>>d;
	cout<<"Please input add and reduce:";
	int n1,n2;
	cin>>n1>>n2;
	Calendar a(y,m,d);
	a.Sumday();
	cout<<a.Return_sumday()<<endl;
	a.Output1();
	a+n1;
	cout<<a.Return_sumday()<<endl;
	a.Output1();
	Calendar b(y,m,d);
	b.Sumday();
	cout<<b.Return_sumday()<<endl;
	b-n2;
	cout<<b.Return_sumday()<<endl;
	b.Output1();
	int x1,y1,z1;
	cout<<"Please input add_date and reduce_date:";
	cin>>x1>>y1>>z1;
	Calendar a1(x1,y1,z1),a3(y,m,d);
	//int s1,s2;
	cout<<"The reduce_day is "<<a1-a3<<endl;
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值