C++下的Date类编写
来源:互联网 发布:32位ubuntu镜像下载 编辑:程序博客网 时间:2024/05/17 01:25
Date类的编写要求如下,编写构造函数以及运算符的重载,以及测试基础代码
class Date
{public:
Date(int year = 1900, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{
// 如何检查一个日期是否合法
int days = GetMonthDays(year, month);
if (days == -1 || day < 1 || day > days)
{
cout<<"日期不合法"<<endl;
Display();
exit(-1);
}
}
//d1 > d2
bool operator>(const Date& d);
//operator>=
//operator<
//operator<=
//operator==
//operator!=
//d1 + 100
Date operator+(int day);
Date operator+=(int day);
Date operator-(int day);
Date operator-=(int day);
Date operator++();
Date operator++(int);
Date operator--();
Date operator--(int);
int operator-(const Date& d);
bool IsLeapYear(int year);
// if /switch/array
int GetMonthDays(int year, int month);
private:
int _year;
int _month;
int _day;
};
代码如下:这份代码的两个日期相减部分在最后做了优化,第一次代码太过于繁琐,可以使用代码复用进行优化。
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;class Date{public:Date(int year = 1900, int month = 1, int day = 1):_year(year), _month(month), _day(day){// 如何检查一个日期是否合法 int days = GetMonthDays(year, month);if (days == -1 || day < 1 || day > days){cout << "日期不合法" << endl;this->Display();//exit(-1);}}void Display()const{cout << _year << "-" << _month << "-" << _day << endl;}//d1 > d2 bool operator>(const Date& d) //>{if (this->_year > d._year){return true;}else if (this->_year == d._year){if (this->_month > d._month){return true;}else if (this->_month == d._month){if (this->_day > d._day){return true;}}}return false;}static bool IsLeapYear(int year){if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){return true;}return false;}inline static int GetMonthDays(int year, int month){if (year < 1900 || month<1 || month>12){return -1;}static int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int days = arr[month];if ((month == 2) && (IsLeapYear(year))){days += 1;}return days;}//operator>= bool operator >=(const Date& d) //>={return (*this>d)||(*this==d);}//operator< bool operator<(const Date& d) //<{return !(*this>= d);}//operator<= bool operator<=(const Date& d) //<={return (*this < d || *this == d);}//operator== bool operator==(const Date& d) //=={return _year == d._year&& _month == d._month&& _day == d._day;}//operator!= bool operator!=(const Date& d) //!={return !(*this == d);}bool IsInvalid(){if (_year < 1900 || _month<1 || _month>12 || _day<1 || _day>GetMonthDays(_year, _month)){return true;}else{return false;}}//d1 + 100 Date operator+(int day) //+{if (day < 0){return *this - (-day);}Date tmp(*this);tmp._day += day;while (tmp.IsInvalid()){tmp._day -= GetMonthDays(tmp._year, tmp._month);tmp._month++;if (tmp._month == 13){tmp._year++;tmp._month = 1;}}return tmp;}Date operator+=(int day) //+={if (day < 0){return *this -= (-day);}_day += day;while (IsInvalid()){_day -= GetMonthDays(_year, _month);_month++;if (_month == 13){_year++;_month = 1;}}return *this;}Date operator-(int day) //-{if (day < 0){return *this + (-day);}Date tmp(*this);tmp._day -= day;while (tmp.IsInvalid()==true){if (tmp._month == 1){tmp._year--;tmp._month = 12;}else{tmp._month--;}tmp._day += tmp.GetMonthDays(tmp._year, tmp._month);}return tmp;}Date operator-=(int day) //-={if (day < 0){return *this += (-day);}_day -= day;while (IsInvalid() == true){if (_month == 1){_year--;_month = 12;}else{_month--;}_day += GetMonthDays(_year, _month);}return *this;}Date operator++() //前置++{*this+=1;return *this;}Date operator++(int) //后置++{Date tmp(*this);*this+=1;return tmp;}Date operator--() //前置--{*this -= 1;return *this;}Date operator--(int) //后置--{Date tmp(*this);*this -= 1;return tmp;}int operator-(const Date& d) //一个日期减去一个日期,相差多少天{ //将两个日期分别与初始定义的1900-1-1相减,得到两个天数再相减int Leapyearday = 366;int Noleapyearday = 365;Date chushi;Date tmp1(*this);int day1 = tmp1._day ;while (tmp1._month >chushi._month){tmp1._month--;day1 += tmp1.GetMonthDays(tmp1._year, tmp1._month);}while (tmp1._year >chushi._year){tmp1._year--;if (tmp1.IsLeapYear(tmp1._year)){day1 += Leapyearday;}else{day1 += Noleapyearday;}}Date tmp2(d);int day2 = tmp2._day;while (tmp2._month >chushi._month){tmp2._month--;day2 += tmp2.GetMonthDays(tmp2._year, tmp2._month);}while (tmp2._year > chushi._year){tmp2._year--;if (tmp2.IsLeapYear(tmp2._year)){day2 += Leapyearday;}else{day2 += Noleapyearday;}}int day = day1 - day2;return day;}private:int _year;int _month;int _day;};
测试用例:
void test(){Date d1;Date d2(1996, 7, 1);d1.Display();d2.Display();cout << d1.operator==(d2)<< endl;cout << d1.operator<=(d2) << endl;cout << d1.operator>=(d2) << endl;cout << d1.operator!=(d2) << endl;cout << d1.operator<(d2) << endl;cout << d1.operator>(d2) << endl;}void test1(){Date d1(1996, 8, 6);Date d3 = ++d1;d3.Display();d3 = d1++;d3.Display();d1.Display();d3 = d1 + 1000;d3.Display();d1 += 1000;d1.Display();}void test2(){Date d1(1996, 8, 6);Date d3 = d1 - 1000;d3.Display();d1.Display();d1 -= 1000;d1.Display();}void test3(){Date d1(1996,8,6);d1.Display();Date d3 = d1--;d3.Display();d1.Display();d3 = --d1;d3.Display();d1.Display();}void test4(){Date d1(1996, 8, 6);Date d2(1994, 7, 1);int days = d2 - d1;cout << days << endl;}
从test()到test4()运行结果:
两个日期相减的代码优化:
int operator-(const Date& d) //一个日期减去一个日期,相差多少天{ //比较两个日期的大小,让小的日期做前置++运算,每次增加一天,直到和大的日期相等
Date min = d; //增加的天数,就是相差的天数Date max = *this;int flags = 1; //flags是标志位,大日期减小日期天数为正,反之为负int count = 0;if (*this < d){min = *this;max = d;flags = -1;}while (min != max){++min;++count;}return count*flags;}
阅读全文
0 0
- C++下的Date类编写
- linux下的who.c编写
- linux下的cp.c编写
- Mac下 lua C模块的编写
- Linux下C的编写和执行
- linux 下的C动态库编写
- LINUX 下编写C程序代码的工具
- Date日期类的实现(C++)
- linux下c编写
- 【C++】 日期类Date
- ubuntu下date的用法
- Linux下的date命令
- c#.net下成功调用c++编写的标准dll
- C语言编写linux下的守护进程
- Linux下C语言程序简单的编写和调试
- linux下的C语言开发(makefile编写)
- linux下的C语言开发(makefile编写)
- linux下的C语言开发(makefile编写)
- tp3.2中三表联查(join和 left join)
- 只包含因子2 3 5的数 51nod1010
- 堆的判断(1098)
- nio3
- netty之Future和ChannelFuture
- C++下的Date类编写
- 58. Length of Last Word
- 10. 电池曲线
- iOS 手势
- GO语言多值返回
- PagingAndSortingRepository
- PHP 的正则相关函数总结
- 最后的纪念——FromATP
- 冒泡