c++日期类
2015-11-29 21:15
204 查看
用c++完成一个日期类Date,该类用于表示日期值(年、月、日),要求能实现查询n天后的日期,两个日期相差天数。
# include<iostream> # include<assert.h> using namespace std; class Date { public: Date(int year=1900,int month=1,int day=1) :_year(year) ,_month(month) ,_day(day) { assert(year >= 1900); assert(month > 0 && month < 13); assert(day > 0 && day <= getMonDay(year,month)); } int getMonDay(int year,int month) { assert(year >= 1900); assert(month > 0 && month < 13); static int ArrayDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; int day = ArrayDay[month]; if ((IsLeapYear(year) && month == 2)) { day += 1; } return day; } Date operator +(int day) { Date tmp = *this; int monDay = 0; while (tmp._day += day) { monDay = getMonDay(tmp._year,tmp._month); if (tmp._day <= monDay) { break; } day = tmp._day - monDay; tmp._month++; tmp._day = 0; if (tmp._month > 12) { tmp._year++; tmp._month = 1; } } return tmp; } Date& operator +=(int day) { int monDay = 0; while (_day += day) { monDay = getMonDay(_year,_month); if (_day <= monDay) { break; } day = _day - monDay; _month++; _day = 0; if (_month > 12) { _year++; _month = 1; } } return *this; } Date operator -(int day) { Date tmp = *this; while (day >= tmp._day) { tmp._month--; day -= tmp._day; if (day == tmp._day) { day = 0; } if (tmp._month == 0) { tmp._year--; tmp._month = 12; } tmp._day = getMonDay(tmp._year,tmp._month); } tmp._day -= day; return tmp; } Date& operator -=(int day) { while (day >= _day) { _month--; day -= _day; if (day == _day) { day = 0; } if (_month == 0) { _year--; _month = 12; } _day = getMonDay(_year,_month); } _day -= day; return *this; } int operator -(Date& d) { return (this->SumDay() - d.SumDay()); } Date operator ++() { _day++; if (_day > getMonDay(_year,_month)) { _month++; if (_month > 12) { _year++; _month = 1; } _day = 1; } return *this; } Date operator ++(int ) { Date tmp = *this; _day++; if (_day > getMonDay(_year,_month)) { _month++; if (_month > 12) { _year++; _month = 1; } _day = 1; } return tmp; } Date& operator --() { _day--; if (_day == 0) { _month--; if (_month == 0) { _year--; _month = 12; } _day = getMonDay(_year,_month); } return *this; } Date operator --(int ) { Date tmp = *this; _day--; if (_day == 0) { _month--; if (_month == 0) { _year--; _month = 12; } _day = getMonDay(_year,_month); } return tmp; } int IsLeapYear(int year) { if ((year%400 == 0) || (year%4 == 0 && year%100 != 0)) { return 1; } return 0; } int SumDay() { int sum =0; for(int y=1;y<_year;++y) { sum += 365+IsLeapYear(y); } for(int m=1;m<_month;++m) { sum += getMonDay(_year,m); } sum += _day; return sum; } void Display() { cout<<_year<<'-'<<_month<<'-'<<_day<<endl; } private: int _year; int _month; int _day; }; //测试 void Test1() { Date d1(2015,11,28); Date d2(2015,1,29); cout<<"d1:"; d1.Display(); cout<<"d1加33天:"<<endl; Date ret = d1 + 33; ret.Display(); cout<<"d1加等100:"<<endl; d1 += 100; d1.Display(); cout<<endl<<"d2:"; d2.Display(); cout<<"d2减等50天:"<<endl; d2 -= 50; d2.Display(); } void Test2() { Date d3(2015,1,1); Date d4(2015,3,1); cout<<endl<<"d3:"; d3.Display(); cout<<"d4:"; d4.Display(); int ret = d4 - d3; cout<<"相差:"<<ret<<"天"<<endl; } void Test3() { Date d5(2015,2,28); Date d6(2016,1,1); cout<<"d5:"; d5.Display(); cout<<"d5的明天:"; d5++; d5.Display(); cout<<"d6:"; d6.Display(); cout<<"d6的昨天:"; d6--; d6.Display(); } int main() { Test1(); Test2(); Test3(); return 0; }
相关文章推荐
- 一起talk C栗子吧(第六十八回:C语言实例--DIY字符串长度函数的小疑问)
- 【C语言提高02】数据类型本质
- C++实现输入输出运算符重载、友元函数和成员函数实现复数类Complex
- C++学习笔记——一只P转C的OIer的学习历程
- 【C语言提高01】冒泡排序和数组做参数的问题
- 黑马程序员——基础笔记:初始C语言
- C++静态成员变量和静态成员函数
- c语言:判断一个字符串中是否含有字符C
- C++ 之函数调用操作符和函数对象
- c语言:输出一个静态局部变量只在函数内部有效的例子
- c++ 模板
- 关于内存对齐的感悟
- C++11学习笔记(三)
- C++ 类的前置声明
- C++学习笔记31——类的基础概念
- C++Builder 自定义消息 处理
- C++类型转化小结
- C++重载下标操作符
- 深度剖析C语言可变参数列表
- C++解引用与箭头操作符重载