C++ 自定义日期类实现日期的加减算法

#include<iostream>
using namespace std;
class Date{
private:
	int m_year,m_month,m_day;
	int m_totalDaysYear;
public:
	Date(int year=2001,int month=1,int day=1);
	~Date(){};
	Date(const Date & date);
	Date & operator=(const Date & date);

	int operator-(const Date &date);
	Date operator+(int days);
	int compare(const Date &date);
	void print();
	int getDaysofYear();
	int getRemainingDaysofYear();
	friend ostream & operator<<(ostream & out, const Date & date);
};
inline bool isLeapYear(int year ){
	if(year%4==0&&year%100!=0||year%400==0) return true;
	else return false;
}
Date::Date(int year,int month,int day):m_year(year),m_month(month),m_day(day){ 
	m_totalDaysYear=isLeapYear(m_year)?366:365;
}
Date::Date(const Date &date){
	m_year=date.m_year;
	m_month=date.m_month;
	m_day=date.m_day;
	m_totalDaysYear=date.m_totalDaysYear;
}
Date & Date::operator=(const Date & date){
	if(this==&date) return *this;
	m_year=date.m_year;
	m_month=date.m_month;
	m_day=date.m_day;
	m_totalDaysYear=date.m_totalDaysYear;

	return *this;
}
int Date::operator-(const Date &date){
	int num=0;
	Date bigDate,smallDate;
	int value=compare(date);
	if(value==1){
		bigDate=*this;
		smallDate=date;
	}else if(value==-1){
		bigDate=date;
		smallDate=*this;
	}else return 0;

	int yearGap=bigDate.m_year-smallDate.m_year;
	if(yearGap>=2){
		for(int i=smallDate.m_year+1;i<=bigDate.m_year-1;i++){
			if(isLeapYear(i)) num+=366;
			else num+=365;
		}
		num+=bigDate.getDaysofYear();
		num+=smallDate.getRemainingDaysofYear();
	}else if(bigDate.m_year-smallDate.m_year==1){
		num+=bigDate.getDaysofYear();
		num+=smallDate.getRemainingDaysofYear();
	}else{
		num+=bigDate.getDaysofYear();
		num-=smallDate.getDaysofYear();
	}

	if(value==1) return num;
	else return -num;
}
Date  Date::operator+(int days){
	int year=m_year,month,day;
	int remainings=getRemainingDaysofYear();
	if(days>remainings){
		days-=remainings;
		year++;
		int num=isLeapYear(year)?366:365;
		while(days>num){ // 找到相应的年份
			days-=num;
			year++;
			num=isLeapYear(year)?366:365;
		}	
	}
	int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	if(isLeapYear(year)) months[1]=29;
	month=m_month;
	if(days-(months[m_month-1]-m_day)>0){
		days-=months[m_month-1]-m_day;
		int i=m_month;
		for(;i<12;i++){// 找到相应的月份
			if(days-months[i]<0) break;
			days-=months[i];
		}
		month=i+1;
	}
	day=days;
	return Date(year,month,day);
}
int Date::compare(const Date &date){
	if(m_year>date.m_year){
		return 1;
	}else if(m_year<date.m_year){
		return -1;
	}else{
		if(m_month>date.m_month) return 1;
		else if(m_month<date.m_month) return -1;
		else{
			if(m_day>date.m_day) return 1;
			else if(m_day<date.m_day) return -1;
			else return 0;
		} 
	}
}


void Date::print(){
	cout<<m_year<<'\\'<<m_month<<'\\'<<m_day<<endl;
}
int Date::getDaysofYear(){
	int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	if(isLeapYear(m_year)) months[1]=29;
	int num=0;
	for(int i=0;i<m_month-1;i++){
		num+=months[i];
	}
	return num+m_day;
}
int Date::getRemainingDaysofYear(){
	return m_totalDaysYear-getDaysofYear();
}


ostream & operator<<(ostream & out, const Date & date){
	out<<date.m_year<<'\\'<<date.m_month<<'\\'<<date.m_day;
	return out;
}


int main(){
	Date d1(2012,1,20),d2(2014,1,12);
  Date d3(d2),d4;
  d4=d1;
  cout<<d1;
	int days=50;
	cout<<d1<<" - "<<d2<<" = "<<d1-d2<<" days "<<endl;
	return 0;
}

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
(1) 测试日期类成员函数,在主函数中列出菜单选项,可以完成日期加减比较等测试功能。 (2) 完善程序功能,在日期相加的菜单选项中增加日期加天数,结果为新日期日期家月份,结果为新日期,要考虑闰年情况。 (3) 完善程序功能,在日期相减的菜单选项中增加日期减天数,结果为新日期日期减月份,结果为新日期,要考虑闰年情况。 (4) 显示日期时增加显示星期及英文形式的月份的功能。 (5) 增加输入的甄别功能,即输入非法数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。 (1) 仿照日期类编写时间类CTime_t,可以完成时间的设置、运算、比较等功能。 (2) 增加时间的输入功能,既可以选择输入格式,可以输入hh:mm:ss格式的信息。 (3) 增加时间的输出格式,可以输出12小时的时间格式。 (4) 编写时间和日期的派生类CDati,完成日期与时间的联合设置、运算、比较等功能,要求该派生类可以完成:日期时间加天数或时间等于新的日期时间,日期时间减天数或等于新的日期时间,两个日期时间相减等于天数或时间等工作,在程序中考虑闰年等具体情况,并重载各种运算符。 (5) 增加输入的甄别功能,即输入非法数据,即输入非法数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。
以下是使用 C 语言实现日期加减的示例代码: ```c #include <stdio.h> #include <stdlib.h> struct Date { int year; int month; int day; }; // 计算一个月有多少天 int days_in_month(int year, int month) { switch (month) { case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 29; } else { return 28; } case 4: case 6: case 9: case 11: return 30; default: return 31; } } // 计算日期加上指定天数后的日期 struct Date add_days(struct Date date, int days) { while (days > 0) { int days_in_month = days_in_month(date.year, date.month); if (date.day + days > days_in_month) { days -= days_in_month - date.day + 1; date.day = 1; if (date.month == 12) { date.year++; date.month = 1; } else { date.month++; } } else { date.day += days; break; } } return date; } // 计算日期减去指定天数后的日期 struct Date sub_days(struct Date date, int days) { while (days > 0) { if (date.day - days < 1) { days -= date.day - 1; if (date.month == 1) { date.year--; date.month = 12; } else { date.month--; } date.day = days_in_month(date.year, date.month); } else { date.day -= days; break; } } return date; } int main() { struct Date date = {2021, 3, 15}; printf("原始日期:%d年%d月%d日\n", date.year, date.month, date.day); struct Date new_date = add_days(date, 10); printf("加上10天后的日期:%d年%d月%d日\n", new_date.year, new_date.month, new_date.day); new_date = sub_days(date, 10); printf("减去10天后的日期:%d年%d月%d日\n", new_date.year, new_date.month, new_date.day); return 0; } ``` 在这个示例代码中,我们定义了一个 `struct Date` 结构体来表示日期,其中包含年、月、日三个字段。 我们使用 `days_in_month` 函数来计算一个月有多少天。这个函数会根据年份和月份来判断每个月有多少天,考虑闰年和平年的情况。 我们使用 `add_days` 函数来计算日期加上指定天数后的日期。这个函数会循环遍历每一天,直到指定天数减为 0,每次循环都会判断当前月份是否已经超过了这个月的最大天数,如果超过了,就将月份加 1,将日期重置为 1。如果月份已经是 12 月了,就将年份加 1,月份重置为 1。 我们使用 `sub_days` 函数来计算日期减去指定天数后的日期。这个函数的实现和 `add_days` 函数类似,只是每次循环都会判断当前日期是否已经小于 1,如果小于 1,就将月份减 1,将日期重置为上个月的最大天数。如果月份已经是 1 月了,就将年份减 1,月份重置为 12。 在 `main` 函数中,我们定义了一个初始日期,然后分别调用 `add_days` 和 `sub_days` 函数来计算加上和减去指定天数后的日期,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值