【c++】简单的日期计算器

🔥个人主页:Quitecoder
🔥专栏:c++笔记仓

朋友们大家好啊,在我们学习了默认成员函数后,我们本节内容来完成知识的实践,来实现一个简易的日期计算器
目录
- 头文件声明函数
- 函数的实现
- 1.全缺省默认构造函数
- 2.拷贝构造函数
- 3.七个个运算符重载
- 4.日期计算函数
- 5.前后置加加减减
- 6.两个对象直接相减
头文件声明函数
头文件声明所有函数:
#pragma once
#include<iostream>using namespace std;class Date
{
public:int GetMonthDay(int year, int month){static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };int day = days[month];if (month == 2&& ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){day += 1;}return day;}// 全缺省的构造函数Date(int year = 1, int month = 1, int day = 1);// 拷贝构造函数// d2(d1)Date(const Date& d);// 赋值运算符重载// d2 = d3 -> d2.operator=(&d2, d3)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);// ==运算符重载bool operator==(const Date& d);// >=运算符重载bool operator >= (const Date& d);// <运算符重载bool operator < (const Date& d);// <=运算符重载bool operator <= (const Date& d);// !=运算符重载bool operator != (const Date& d);// 日期-日期 返回天数int operator-(const Date& d);void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
函数的实现
第一个函数,获取某月天数
class Date
{
public:int GetMonthDay(int year, int month){static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };int day = days[month];if (month == 2&& ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){day += 1;}return day;}
为了按照月的月份直接访问数组,我们设置大小为13,由于要进行多次访问,我们可以将数组变量设置在全局
如果是闰年,则二月为29天,返回某个月的天数
1.全缺省默认构造函数
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}
在头文件进行缺省,源文件不需要
2.拷贝构造函数
Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;
}
3.七个个运算符重载
这里总共有七个运算符,除了赋值运算符外,我们只需要得到特殊的两个就可以简单的写出另外四个函数
首先,=的重载
bool Date::operator==(const Date& d)
{return _year == d._year&& _month == d._month&& _day == d._day;
}
我们再写一个<的重载
bool Date::operator<(const Date& d)
{if (_year < d._year){return true;}else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){if (_day < d._day){return true;}}}return false;
}
按照年月日逐次判断
上面两个完成后,其余的就很简单了
小于等于,就是小于或者等于
bool Date::operator <= (const Date& d)
{return *this < d || *this == d;
}
直接使用小于和等于的重载
大于,即为不小于等于:
bool Date::operator>(const Date& d)
{return !(*this <= d);
}
大于等于,即为不小于
bool Date::operator >= (const Date& d)
{return !(*this < d);
}
最后一个不等于也十分简单了:
bool Date::operator != (const Date& d)
{return !(*this == d);
}
赋值运算符重载
Date& Date::operator=(const Date& d)
{if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;
}
4.日期计算函数
自身增加天数
Date& Date::operator+=(int day)
{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}return *this;
}
如果天数超过某个月,则天数减去当前这个月,让月份增加,如果月数等于13了,则年进一,月份重置为1月
有了加等,实现加就很简单了
Date Date::operator+(int day)
{Date tmp = *this;tmp += day;return tmp;
}
这两个有什么区别呢??
这两个函数都是Date类的成员函数,用于对日期进行增加天数的操作,但它们在用法和效果上有所不同。
Date& Date::operator+=(int day)
这个函数重载了+=运算符,允许你直接在当前对象上增加天数。它会修改调用它的对象本身,并返回修改后对象的引用。
特点:
- 直接修改:它修改调用对象的状态,即增加的天数直接反映在原对象上
- 返回引用:返回调用它的对象的引用,允许链式操作
用法示例:
Date d1(2020, 3, 30); // 假设是2020年3月30日
d1 += 3; // 在d1上增加3天
// d1现在是2020年4月2日
Date Date::operator+(int day)
这个函数重载了+运算符,允许你在一个临时对象上增加天数,而不改变原始对象。它通过创建一个当前对象的副本,然后在这个副本上应用+=操作,最后返回这个修改后的副本
特点:
- 不直接修改:它不会修改原始调用对象的状态,而是返回一个新的修改后的对象。
- 返回对象:返回一个新的
Date对象,这个对象是在原对象基础上增加天数后的结果。
用法示例:
Date d2(2020, 3, 30); // 假设是2020年3月30日
Date d3 = d2 + 3; // 在d2的基础上增加3天,但d2本身不变
// d2仍然是2020年3月30日
// d3是2020年4月2日
operator+=是一个修改原对象并返回其引用的成员函数,用于实现“就地修改”。operator+是一个返回新对象的成员函数,它在不修改原对象的情况下返回增加天数后的新日期对象。
我们现在是加等嵌套在加里面,如果反过来呢?
对比我们能发现,两种加法都要创建一个新的变量,效果相同,但是加等,右边复用加的时候又创建对象,对比左边效率降低,所以用加复用加等效果更好
同理完成日期的减等和减
Date& Date::operator-=(int day)
{_day -= day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}
Date Date::operator-(int day)
{Date tmp = *this;tmp -= day;return tmp;
}
5.前后置加加减减
这里我们已经上篇文章讲解过了,直接进行代码的实现
Date& Date::operator++()
{_day += 1;return *this;
}
Date Date::operator++(int)
{Date tmp(*this);_day += 1;return tmp;
}
Date& Date::operator--()
{_day -= 1;return *this;
}
Date Date::operator--(int)
{Date tmp(*this);_day -= 1;return tmp;
}
6.两个对象直接相减
两个对象直接相减得到相差的日期天数:
int Date::operator-(const Date& d)
{int flag = 1;Date max = *this;Date min = d;if (*this < d){int flag = -1;max = d;min = *this;}int n = 0;while (min != max){++min;++n;}return n * flag;
}
这个实现逻辑首先确定哪个日期较大,然后不断将较小的日期递增,直到它与较大的日期相等,过程中累计递增的天数,最终返回这个天数。如果初始的第一个日期小于第二个日期,返回的天数会是负值
让我们分析一下代码的关键部分:
-
确定日期大小:代码首先比较两个日期,确保
max总是较大的日期,而min是较小的日期。flag变量用于记录原始日期的相对顺序,如果需要反转(即第一个日期小于第二个日期),flag会被设置为-1 -
计算天数差:通过一个循环,每次将
min日期递增一天(使用operator++),直到min等于max。每次递增都会将n加1,n用于记录两个日期之间相差的天数 -
返回结果:最后,返回累计的天数
n乘以flag。如果flag为-1,表示第一个日期实际上是小于第二个日期的,因此返回负值
本节内容到此结束,感谢大家阅读!
相关文章:
【c++】简单的日期计算器
🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好啊,在我们学习了默认成员函数后,我们本节内容来完成知识的实践,来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…...
基于easyx库的C/C++游戏编程实例-飞机大战
飞机大战游戏设计 首先创建飞机/子弹结构: struct Plane {int x;int y;bool live;int width;int height;int type;int hp; }player,bul[BUL_NUM],enemy[ENE_NUM];你需要加载图片: void ImageLoad() {//背景loadimage(&bg[0], "./image/飞机大…...
stitcher类实现多图自动拼接
效果展示 第一组: 第二组: 第三组: 第四组: 运行代码 import os import sys import cv2 import numpy as npdef Stitch(imgs,savePath): stitcher cv2.Stitcher.create(cv2.Stitcher_PANORAMA)(result, pano) stitcher.st…...
Ubuntu下udp通信
一、知识准备阶段 socket是什么?套接字是什么? https://blog.csdn.net/m0_37925202/article/details/80286946 Socket程序从Windows移植到Linux下的一些注意事项 sockaddr和sockaddr_in详解 bzero和memset函数 函数原型:void bzero&…...
拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)
前言: 实战开整 目前而言对于整个拌合楼管理软件开发,因为公司对这个项目还处于讨论中,包括个人对其中的商业逻辑也存在一些质疑,都是在做一些技术上的储备.很早就写好了串口与地磅对接获取代码,也大概知道真个逻辑,这次刚好跟库区沟通,远程连接到磅房电脑,开始实操一下. 一、地…...
FastAPI+React全栈开发10 MongoDB聚合查询
Chapter02 Setting Up the Document Store with MongoDB 10 Aggregation framework FastAPIReact全栈开发10 MongoDB聚合查询 In the following pages, we will try to provide a brief introducton to the MongoDB aggregation framework, what it is, what benefits it of…...
python 报错问题汇总
error: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: d:\\anaconda\\envs\\yolov5\\lib\\site-packages\\ISR-2.2.0-py3.7.egg 解决方法:重启pycharm python-contrib 无法安装 opencv-contrib-python 安装包网址:安装包下载链接…...
6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)
90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f LCD使用 简介 AIO-3399J开发板外置了两个LCD屏接口,一个是EDP,一个是LVDS,接口对应板…...
「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K
C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是()。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…...
【算法】基数排序
简介 基数排序(*Radix sort)是一种非比较排序算法(non-comparative sorting algorithm)。现代计算机的基数排序算法由 计数排序 算法的开发人哈罗德H西华德(Harold H. Seward)于1954年于麻省理工大学开发。…...
2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月
腾讯云2核2G服务器多少钱一年?轻量服务器61元一年,CVM 2核2G S5服务器313.2元15个月,轻量2核2G3M带宽、40系统盘,云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图:…...
不同Python版本和wxPython版本用pyinstaller打包文件大小对比
1、确定wxPython和Python版本的对应关系 在这里可以找到Python支持的所有wxPython版本:https://pypi.tuna.tsinghua.edu.cn/simple/wxpython/ 由于Python从3.6版本开始支持f字符串、从3.9版本开始不支持Windows7操作系统,所以我仅筛选3.6-3.8之间的版本…...
【C语言】结构体详解(一)
目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问(两种方式) 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明(匿…...
AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)
AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion) 前言1、基础对比Stable Diffusion(SD)SD界面安装与使用SD Midjouney(MJ) 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…...
【蓝桥杯】矩阵快速幂
一.快速幂概述 1.引例 1)题目描述: 求A^B的最后三位数表示的整数,A^B表示:A的B次方。 2)思路: 一般的思路是:求出A的B次幂,再取结果的最后三位数。但是由于计算机能够表示的数字…...
C语言使用STM32开发板手搓高端家居洗衣机
目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…...
【Hello,PyQt】QTextEdit和QSplider
PyQt5 是一个强大的Python库,用于创建图形用户界面(GUI)。其中,QTextEdit 控件作为一个灵活多用的组件,常用于显示和编辑多行文本内容,支持丰富的格式设置和文本操作功能。另外,QSlider 控件是一…...
【力扣】191.位 1 的个数、485.最大连续 1 的个数
191.位 1 的个数 题目描述 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。 示例 1: 输入:n 11 输出࿱…...
蓝桥杯 java 承压计算
题目: 思路: 1:其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2:假设每块原料的重量都十分精确地平均落在下方的两个金属块上,最后,所有的金属块的重量都严格精确地平分落在最底层的电子…...
leetcode268-Missing Number
这道题目要求缺失的数字,一般解决数组的问题,要么往排序数组,要么往双指针遍历这些方向上靠,要么往异或方向上靠,总之落点无非就只有这几个。我们要求缺失的数字,可以依次让1~n和数组元素进行异…...
Linux Ubuntu 24.04 Server 超简单部署 Fast GPT(新手零踩坑)
前言: Fast GPT 是一款基于大语言模型的知识型平台,支持数据处理、RAG检索、可视化AI工作流编排,能快速搭建专属问答系统,无需复杂开发配置。本文针对 Ubuntu 24.04 Server 系统,用最简洁的步骤完成部署,全…...
极简OpenClaw技能开发:给Qwen3-32B-Chat扩展Excel处理能力
极简OpenClaw技能开发:给Qwen3-32B-Chat扩展Excel处理能力 1. 为什么需要自定义Excel处理技能 去年我接手了一个数据分析项目,每天需要处理几十份Excel报表。手动操作不仅耗时,还容易出错。当我尝试用OpenClaw自动化这个流程时,…...
智能工单管理系统 2026 怎么挑?五款热门平台对比,适配企业各类业务场景
工单智能化应用:帮您告别工单苦海 传统工单系统的痛点,本质是信息处理效率与用户体验的矛盾。随着AI 的发展,工单智能化应用的核心逻辑转变为,通过AI技术将“人找信息”转变为“信息找人”,甚至“预测需求”。 工单管…...
CGAL-6.0.1在Win11与VS2019环境下的高效编译与配置指南
1. 环境准备:搭建Win11VS2019开发环境 在开始编译CGAL-6.0.1之前,我们需要确保开发环境配置正确。我实测发现,Win11系统与VS2019的组合存在一些特殊配置需求,这里分享几个关键检查点: 首先确认VS2019的安装组件。打开V…...
别再只盯着IoU了!用Python手把手教你计算语义分割的95% Hausdorff距离(附完整代码)
超越IoU:用Python实战95% Hausdorff距离的医学影像分割评估 当我们在医院看到CT扫描图像上肿瘤边缘被红色轮廓线精准勾勒时,很少有人会思考这背后的算法是如何评估自己分割结果的准确性的。传统指标如IoU(交并比)和Dice系数固然流…...
避坑指南:用ESP32驱动LD2420毫米波雷达时,串口数据丢失和自动开机卡死的那些事儿
ESP32与LD2420毫米波雷达深度避坑实战:从数据丢失到系统卡死的全链路解决方案 当你在凌晨三点盯着逻辑分析仪上那些残缺的串口波形时,就会明白为什么LD2420毫米波雷达被称为"最熟悉的陌生人"。这个能穿透墙壁感知呼吸的24GHz传感器,…...
OpenClaw内存优化:GLM-4.7-Flash大任务处理的资源调配技巧
OpenClaw内存优化:GLM-4.7-Flash大任务处理的资源调配技巧 1. 当OpenClaw遇上大任务:我的内存崩溃现场 那是个周五的深夜,我正尝试用OpenClaw自动处理一批技术文档的归档和摘要生成。任务看似简单:读取200多个Markdown文件&…...
说说你对spring的IOC的理解
面试 IOC指的就是控制反转,指的就是创建对象的控制权的转移,简单来说,由之前的手动new对象,转换成了由spring自动生产,spring利用java的反射机制,根据配置文件或注解在运行时动态创建并管理对象。...
避开这3个坑!用Solidworks链阵列做皮带挡板时90%人会犯的错误
避开这3个坑!用Solidworks链阵列做皮带挡板时90%人会犯的错误 在机械设计领域,Solidworks的链阵列功能是创建皮带挡板这类重复性结构的利器。但看似简单的操作背后,却隐藏着几个容易导致失败的陷阱。很多中级用户在使用链阵列功能时ÿ…...
STM32上如何用串口BREAK中断优雅处理DMX与RDM协议(附完整代码)
STM32串口BREAK中断实现DMX/RDM协议双模通信实战指南 舞台灯光控制系统对实时性和可靠性有着近乎苛刻的要求。作为行业标准的DMX512协议及其扩展协议RDM,承载着数以万计舞台灯具的控制指令。传统基于STM32的软件轮询检测方案常面临响应延迟、误触发等问题࿰…...
