问题介绍:

今天突然看到一个问题看起来蛮有趣的,跟大家分享一下. 给定任意日期对该日期进行加减天数,最后得出加减后出现的日期.以及给两个日期你可以得出他们两个之间相隔多少天.(需要考虑闰年,每个月天数不同,我们需要写一个我们直接可以使用的日期加减器)因为时间比较仓促,我也没有写界面,只有其中几个主要的函数的架构思想以及简单的调试就发出来了.
代码实现:
#include<iostream>
#include<Windows.h>
#include<assert.h>
using namespace std;
class Date
{
public:
Date(int year = 1997,int month = 1,int day = 1)
:years(year)
, months(month)
, days(day)
{
assert(IScorrect());
}
Date& operator=(const Date& d)
{
if (this != &d)
{
years = d.years;
months = d.months;
days = d.days;
}
return *this;
}
Date& operator + (int day)
{
while (day > 365)
{
if (ISleapyear() && day > 366)
{
years++;
day = day - 366;
}
else
{
years++;
day = day - 365;
}
}
while (day >= Getmonthsday())
{
//注意这里的次序问题,一定先减 再加 最后再判断. 如果顺序错了会出BUG的.
day = day - Getmonthsday();
months++;
if (months > 12)
{
years++;
months = 1;
}
}
while (day > 0)
{
DateAdvance();
day = day - 1;
days++;
}
return *this;
}
Date& operator - (int day) //先减去一年,然后在使用加的重载,所以你只需要写一个无懈可击的加算法就够了.
{
while (day > 365)
{
if (ISleapyear() && day > 366)
{
day = day - 366;
years--;
}
else
{
day = day - 365;
years--;
}
}
if (ISleapyear())
{
day = 366 - day;
years--;
}
else
{
day = 365 - day;
years--;
}
operator+(day);
return *this;
}
void DateAdvance() //用于出现可以进化的情况
{
if (days > Getmonthsday())
{
months++;
days = 1;
}
if (months > 12)
{
years++;
months = 1;
}
}
int operator - (Date D)
{
int count = 0;
if (*this > D)
{
while (*this != D)
{
D.operator+(1);
count++;
}
}
else
{
while (*this != D)
{
operator+(1);
count++;
}
}
return count;
}
bool ISleapyear()
{
if ((years % 4 == 0 && years % 100 != 0) || (years % 400 == 0))
{
return true;
}
return false;
}
int Getmonthsday()
{
int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (ISleapyear() && months == 2)
{
return 29;
}
return monthDays[months];
}
void print()
{
cout << "目前的时间为";
cout << years << "." << months << "." <<days<< endl;
}
bool IScorrect()
{
if (years > 0 && ((years % 4 == 0 && years % 100 != 0) || (years % 400 == 0)) && days < 367)//闰年
{
if (months >0 && months < 13)
{
if (days > 0 && days <= Getmonthsday())
{
return true;
}
}
}
else if (years >0 && days < 366) //非闰年
{
if (months >0 && months < 13)
{
if (days > 0 && days <= Getmonthsday())
{
return true;
}
}
}
return false;
}
Date operator += (int day)
{
*this = *this + 100;
return *this;
}
Date operator -= (int day)
{
return *this = *this - day;
}
inline Date& operator++()
{
*this += 1;
return *this;
}
inline Date operator++(int)
{
Date tmp(*this);
*this = *this + 1;
return tmp;
}
bool operator == (const Date& d)
{
return (years == d.years&& months == d.months&&days == d.days);
}
bool operator != (const Date& d)
{
return !(*this == d);
}
bool operator >(const Date& d)
{
if (years > d.years ||
(years == d.years&&months > d.months)
|| (years == d.years&&months == d.months && days > d.days))
{
return true;
}
return false;
}
bool operator < (const Date& d)
{
return !(*this > d);
}
bool operator >= (const Date& d)
{
return (*this == d) && (*this > d);
}
bool operator <= (const Date& d)
{
return (*this == d) && (*this < d);
}
private:
int years;
int months;
int days;
};
void Test()
{
Date d1(2012, 4, 5);
Date d2(2013, 4, 5);
d1.print();
/*d1 = d1 - 400;*/
d1.print();
cout << d1 - d2 << endl;
d1.print();
system("pause");
}
总结:
日期类对我们掌握面向对象这里还是一个蛮重要的知识,你至少要能很熟练很正确地自己快速写出这个整个框架,然后一个一个实现函数,我只能说很重要,很重要,很重要大家一定要掌握.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# c
# 实现日期计算器
# C++实现日期计算器
# 基于C++实现简单日期计算器
# 基于C++实现日期计算器的详细教程
# 基于C++实现一个日期计算器
# C++日期类计算器的模拟实现举例详解
# C++实现日期计算器详细代码示例
# 详解如何用C++写一个日期计算器
# C++日期类的实现日期计算器举例详解
# 很重要
# 加减
# 我也
# 几个
# 来了
# 你可以
# 错了
# 无懈可击
# 时间为
# 可以使用
# 一个问题
# 大家分享
# 每个月
# 再加
# 大家多多
# 正确地
# 面向对象
# 很熟
# 你只需要
# 就够了
相关文章:
建站之星安全性能如何?防护体系能否抵御黑客入侵?
大同网页,大同瑞慈医院官网?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
如何在西部数码注册域名并快速搭建网站?
如何在云主机快速搭建网站站点?
,制作一个手机app网站要多少钱?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
家具网站制作软件,家具厂怎么跑业务?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
代刷网站制作软件,别人代刷火车票靠谱吗?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站之星客服服务时间及联系方式如何?
如何快速生成ASP一键建站模板并优化安全性?
常州企业建站如何选择最佳模板?
如何通过虚拟主机空间快速建站?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何获取开源自助建站系统免费下载链接?
如何批量查询域名的建站时间记录?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何在自有机房高效搭建专业网站?
宝塔建站后网页无法访问如何解决?
建站之星上传入口如何快速找到?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何快速生成橙子建站落地页链接?
如何选择PHP开源工具快速搭建网站?
盘锦网站制作公司,盘锦大洼有多少5G网站?
如何在橙子建站中快速调整背景颜色?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
如何通过二级域名建站提升品牌影响力?
建站VPS能否同时实现高效与安全翻墙?
移民网站制作流程,怎么看加拿大移民官网?
安云自助建站系统如何快速提升SEO排名?
如何通过虚拟机搭建网站?详细步骤解析
寿县云建站:智能SEO优化与多行业模板快速上线指南
如何在万网自助建站中设置域名及备案?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
,网页ppt怎么弄成自己的ppt?
Android自定义控件实现温度旋转按钮效果
建站主机选哪种环境更利于SEO优化?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
中山网站制作网页,中山新生登记系统登记流程?
招贴海报怎么做,什么是海报招贴?
*请认真填写需求信息,我们会在24小时内与您取得联系。