C++ 日期计算器

日期计算器

        • 概要
    • Date类的规划
    • Date类的实现
      • Date 构造函数
      • Date 拷贝构造函数
      • ~Date 析构函数
      • GetMonthDay 求某年某月的天数
      • operator= 赋值操作符重载
      • operator+= 加等操作符重载
      • operator+ 加号操作符重载
      • operator-= 减等操作符重载
      • operator- 减法操作符重载 (日期 - 天数)
      • operator++ 前置自增操作符重载
      • operator++ 后置自增操作符重载
      • operator-- 前置自减操作符重载
      • operator-- 后置自减操作符重载
      • operator< 小于操作符重载
      • operator== 相等操作符重载
      • operator!= 不等操作符重载
      • operator<= 小于或等于操作符重载
      • operator> 大于操作符重载
      • operator>= 大于或等于操作符重载
      • operator- 减法操作符重载(日期 - 日期)
      • Print 打印函数
    • Date 类的测试
      • 测试操作符重载(+,+=,- ,-=,x++,++x,x--,--x)
      • 测试操作符重载(>,>=,==,<,<=,!=)
      • 测试操作符重载(日期 - 日期)
        • 结语

请添加图片描述

概要

本篇主要探究C++ 实现日期计算器

Date类的规划

class Date
{
public:int GetMonthDay(int year, int month);Date(int year = 2024 , int month = 2, int day = 6);Date(const Date& d);Date& operator=(const Date& d);~Date();Date& operator+=(int day);Date operator+(int day);Date operator-(int day);Date& operator-=(int day);Date& operator++();Date operator++(int);Date operator--(int);Date& operator--();bool operator>(const Date& d) const;bool operator==(const Date& d) const;bool operator>= (const Date& d) const;bool operator< (const Date& d) const;bool operator<= (const Date& d) const;bool operator!= (const Date& d) const;int operator-(const Date& d) const;void Print();private:int _year;int _month;int _day;
};

Date类的实现

Date 构造函数

Date::Date(int year, int month, int day):_year(year), _month(month), _day(day)
{ }

构造函数,他是在创建类的时候调用进行初始化操作,我们这里声明与定义分离,所以它的参数不需要填写缺省值,缺省值在声明的时候定义即可。

Date 拷贝构造函数

Date::Date(const Date& x):_year(x._year), _month(x._month), _day(x._day)
{ }

拷贝构造函数和构造函数作用相似,拷贝构造函数是将已有的类的对象拷贝给新创建的类的对象,如上所示。

~Date 析构函数

Date::~Date()
{_year = _month = _day = 0;
}

构析函数是在对象即将销毁前所调用的函数,常用来清理数据空间,这里我们的内存都在栈上申请的,所以影响不大。

GetMonthDay 求某年某月的天数

int Date::GetMonthDay(int year,int month)
{int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};if((month==2)&&((year%4==0&&year%100!=0)||(year%400==0))){return 29;}return a[month];
}

该函数是用来求某年某月的月份天数,通过创建一个大小为13的数组a, 再对二月份进行判断闰年来确定是否为特殊情况,否则返回已设定好的月份天数。

operator= 赋值操作符重载

Date& Date::operator=(const Date& d)
{_year=d._year;_month=d._month;_day=d._day;return *this;
}

该函数用于对象与对象之间的赋值操作,在对象的年月日进行逐一复制后并返回this指针的解引用。

operator+= 加等操作符重载

Date& Date::operator+=(int day)
{_day+=day;int time=GetMonthDay(_year,_month);while(_day>time){_day-=time;_month++;if(_month>12){_month-=12;_year++;}time = GetMonthDay(_year,_month);}return *this;
}

该函数用于日期与天数的相加,在实现该函数时先将this->_day加上想加的day。然后再通过月份的天数以及月与年的关系进行调整,如上所示。

operator+ 加号操作符重载

Date Date::operator+(int day)
{Date newdate = *this;newdate+=day;return newdate;
}

通过复用加等操作符重载,在不改变*this的情况下,返回相加后的对象

operator-= 减等操作符重载

Date& Date::operator(int day)
{_day-=day;int time =GetMonthDay(_year,_month)while(_day>=0){_day+=time;_month--;if(_month<=1){_month+=12;_year--;}time=GetMonthDay(_year,_month);} return *this;
}

该函数和加等操作符重载类似,先将this->_day减去day,然后进行月份的天数和年与月之间的调整即可。

operator- 减法操作符重载 (日期 - 天数)

Date Date::operator-(int day)
{Date newdate=*this;newdate-=day;return newdate;
}

通过复用减等操作符重载,在不改变*this的情况下,返回相加后的对象

operator++ 前置自增操作符重载

Date& Date::operator++()
{(*this)+=1;return *this;
}

operator++ 后置自增操作符重载

Date Date::operator--(int)
{Date a = *this;(*this)+=1;return a;
}

operator-- 前置自减操作符重载

Date& Date::operator--()
{	(*this)-=1;return *this;
}

operator-- 后置自减操作符重载

Date Date::operator--(int)
{	Date a=*this;(*this)-=1;return a;
}

operator< 小于操作符重载

bool Date::operator<(const Date& d)
{if(_year<d._year){return 1;}else if(_year==d._year){if(_month<d._month){return 1;}else if(_month==d._month){if(_day<d._day){return 1;}}}return 0;
}

operator== 相等操作符重载

bool Date::operator==(const Date& d)
{return _day==d._day&&_month==d._month&&_year==d._year;
}

operator!= 不等操作符重载

bool Date::operator!=(const Date& d)
{return !(*this==d);
}

operator<= 小于或等于操作符重载

bool Date::operator<=(const Date& d)
{return (*this<d)||(*this==d);
}

operator> 大于操作符重载

bool Date::operator>(const Date& d)
{return !(*this<=d);
}

operator>= 大于或等于操作符重载

bool Date::operator>=(const Date& d)
{return !(*this<d);
}

operator- 减法操作符重载(日期 - 日期)

int operator-(const Date& date) const
{Date max = *this,min = date;int flag=(max>=min);if(!flag){max=date;min=*this;flag=-1;}int count=0;while(max>min){min++;count++;}return flag*count;
}

通过比较选出最大的日期max与最小的日期min,让最小的日期min和记录数的count进行循环自增,直到max与min相等为止,此时刻的count就是相差的天数,而flag先前用于比较的就是它的符号,所以返回flag*count。

Print 打印函数

void Date::Print()
{printf("%d %d %d\n",_year,_month,_day);
}

Date 类的测试

测试操作符重载(+,+=,- ,-=,x++,++x,x–,–x)

void Test_1()
{std::cout << "Test_1:\n";Date a(2024, 2, 6);std::cout << "a ||";a.Print();Date b = a;std::cout << "b ||";b.Print();b += 30;std::cout << "b += 30 ||";b.Print();a -= 20;std::cout << "a -= 20 ||";a.Print();Date c = b - 30;std::cout << "c 或 b - 30 ||";c.Print();Date d = a + 20;std::cout << "d 或 a + 20 ||";d.Print();d++;std::cout << "++d ||";d.Print();c--;std::cout << "++c ||";c.Print();Date e = a++;std::cout << "e = a++ -> e||";e.Print();std::cout << "e = a++ -> a||";a.Print();Date f = a++;std::cout << "f = b-- -> f||";f.Print();std::cout << "f = b-- -> b||";b.Print();std::cout << "\n";
}

运行结果如下:
在这里插入图片描述

测试操作符重载(>,>=,==,<,<=,!=)

void Test_2()
{std::cout << "Test_2:\n";Date a(2024, 2, 6);std::cout << "a ||";a.Print();Date b = a + 999;std::cout << "b ||";b.Print();Date c = a - 999;std::cout << "c ||";c.Print();Date d = a;std::cout << "d ||";d.Print();std::cout << "a < b  ->" << (a < b) << std::endl;std::cout << "a > b  ->" << (a > b) << std::endl;std::cout << "a == b ->" << (a == b) << std::endl;std::cout << "a != b ->" << (a != b) << std::endl;std::cout << "a < c  ->" << (a < c) << std::endl;std::cout << "a > c  ->" << (a > c) << std::endl;std::cout << "a == c ->" << (a == c) << std::endl;std::cout << "a != c ->" << (a != c) << std::endl;std::cout << "a == d ->" << (a == d) << std::endl;std::cout << "a != d ->" << (a != d) << std::endl;std::cout << "a >= d ->" << (a >= d) << std::endl;std::cout << "a <= d ->" << (a <= d) << std::endl;std::cout << "a < d  ->" << (a < d) << std::endl;std::cout << "a > d  ->" << (a > d) << std::endl;std::cout << "\n";
}

运行结果如下:
在这里插入图片描述

测试操作符重载(日期 - 日期)

void Test_3()
{std::cout << "Test_3:\n";Date a(2024, 2, 6);Date b(2025, 2, 6);Date c = a + 99;std::cout << "c ||";c.Print();std::cout << "a ||";a.Print();std::cout << "b ||";b.Print();std::cout << "a - b ||" << (a - b) << std::endl;std::cout << "b - b ||" << (b - b) << std::endl;std::cout << "b - a ||" << (b - a) << std::endl;std::cout << "c - a ||" << (c - a) << std::endl;std::cout << "a - c ||" << (a - c) << std::endl;std::cout << "\n";
}

运行结果如下:
在这里插入图片描述
测试完毕,综合上述代码及运行结果,可得代码正确,可以正常模拟日期计算器。

结语

以上就是本期的全部内容了,喜欢就多多关注吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年第四季度硬盘容量强势增长9%

在2023年第四季度&#xff08;CQ4 23&#xff09;&#xff0c;硬盘驱动器&#xff08;HDD&#xff09;市场的总容量出货量环比增长9%&#xff0c;达到214EB&#xff0c;而单位出货量保持在2900万块不变。其中&#xff0c;近线存储&#xff08;Nearline&#xff09;硬盘的容量出…

Java基于微信小程序的驾校报名小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

JVM双亲委派机制

双亲委派模型是一种组织类加载器之间关系的一种规范,他的工作原理是:如果一个类加载器收到了类加载的请求,它不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,这样层层递进,最终所有的加载请求都被传到最顶层的启动类加载器中,只有当父类加载器无法完成这个加载…

基于SSM的实习管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的实习管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Verilog刷题笔记19

题目&#xff1a; A common source of errors: How to avoid making latches When designing circuits, you must think first in terms of circuits: I want this logic gate I want a combinational blob of logic that has these inputs and produces these outputs I want…

【高阶数据结构】B-树详解

文章目录 1. 常见的搜索结构2. 问题提出使用平衡二叉树搜索树的缺陷使用哈希表的缺陷 3. B-树的概念4. B-树的插入分析插入过程分析插入过程总结 5. B-树的代码实现5.1 B-树的结点设计5.2 B-树的查找5.3 B-树的插入实现InsertKey插入和分裂测试 6. B-树的删除&#xff08;思想&…

使用WPS制作三线表

点击边框和底纹点击1、2、3、4并且应用于表格点击确定 再次选中表格点击右键表格属性选择边框和底纹 选中表格第一行右键点击表格属性选择边框和底纹 如果表格中存在虚线

【Linux开发工具】gcc/g++的使用

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.前言2.gcc/g使用方…

【自动化测试】---Selenium+Java

1.自动化测试分类 接口自动化测试UI自动化测试&#xff08;移动端自动化测试、Web端自动化测试&#xff09; 2.选择Selenium作为web自动化工具原因&#xff08;面试题&#xff09; 开源免费支持多个浏览器支持多个系统支持多语言Selenium包提供很多供测试使用的API 3.自动化是什…

C++内存模型的内存布局

C内存模型的内存布局 什么是内存模型内存布局及作用C程序的内存布局 本文章介绍了C程序的内存布局&#xff0c;并附有一段演示 数据区和 栈区存储不同类型变量的代码示例。 什么是内存模型 在计算机科学中&#xff0c;程序的内存模型是指程序在内存中的组织结构和存储方式的抽…

编译原理实验2——自上而下语法分析LL1(包含去消除左递归、消除回溯)

文章目录 实验目的实现流程代码运行结果测试1&#xff08;含公共因子&#xff09;测试2&#xff08;经典的ii*i文法&#xff0c;且含左递归&#xff09;测试3&#xff08;识别部分标识符&#xff09; 总结 实验目的 实现自上而下分析的LL1语法分析器&#xff0c;给出分析过程 …

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

什么是ScottPlot.WPF&#xff1f; ScottPlot.WPF 是一个开源的数据可视化库&#xff0c;用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本&#xff0c;提供了简单易用的 API&#xff0c;使开发人员能够通过简单的代码创建各种类型的图表&#…

2、6作业

TCP和UDP的区别 TCP和UDP都是通信协议 TCP提供有连接的&#xff0c;稳定的&#xff0c;无误码无失真无乱序无丢失的通信 UDP提供无连接的&#xff0c;尽力的&#xff0c;可能误码可能乱序&#xff0c;可能丢失的通信 TCP每发一个数据包就需要对方回应一个应答包&#xff0c…

自定义npm包从vue2升级到vue3遇到的问题解决

1.执行npm run build时报错&#xff1a; (node:16724) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token ‘??’ at Loader.moduleStrategy (internal/modules/esm/translators.js:149:18 解决&#xff1a;更新node版本 查看了我使用的node版本是14.21.3&…

《合成孔径雷达成像算法与实现》Figure6.10

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

UUID和雪花(Snowflake)算法该如何选择?

UUID和雪花(Snowflake)算法该如何选择&#xff1f; UUID 和 Snowflake 都可以生成唯一标识&#xff0c;在分布式系统中可以说是必备利器&#xff0c;那么我们该如何对不同的场景进行不同算法的选择呢&#xff0c;UUID 简单无序十分适合生成 requestID&#xff0c; Snowflake 里…

Flink实战六_直播礼物统计

接上文&#xff1a;Flink实战五_状态机制 1、需求背景 现在网络直播平台非常火爆&#xff0c;在斗鱼这样的网络直播间&#xff0c;经常可以看到这样的总榜排名&#xff0c;体现了主播的人气值。 人气值计算规则&#xff1a;用户发送1条弹幕互动&#xff0c;赠送1个荧光棒免费…

07-使用Package、Crates、Modules管理项目

上一篇&#xff1a;06-枚举和模式匹配 当你编写大型程序时&#xff0c;组织代码将变得越来越重要。通过对相关功能进行分组并将具有不同功能的代码分开&#xff0c;您可以明确在哪里可以找到实现特定功能的代码&#xff0c;以及在哪里可以改变功能的工作方式。 到目前为止&…

必收藏!第六版CCF推荐会议C类国际学术会议!(中国计算机学会)

中国计算机学会 中国计算机学会&#xff08;CCF&#xff09;是全国性、学术性、非营利的学术团体&#xff0c;由从事计算机及相关科学技术领域的个人和单位自愿组成。作为独立社团法人&#xff0c;CCF是中国科学技术协会的成员之一&#xff0c;是全国一级学会&#xff01; CCF的…

JavaScript基础第四天

JavaScript 基础第四天 今天我们学习js的函数&#xff0c;包括普通函数、匿名函数、箭头函数以及函数作用域。 1. 函数的初体验 1.1. 什么是函数 函数是 JavaScript 中的基本组件之一。一个函数是 JavaScript 过程一组执行任务或计算值的语句。要使用一个函数&#xff0c;你…