当前位置: 首页 > news >正文

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

Alt

🔥个人主页Quitecoder

🔥专栏c++笔记仓

Alt

朋友们大家好啊,在我们学习了默认成员函数后,我们本节内容来完成知识的实践,来实现一个简易的日期计算器

目录

  • 头文件声明函数
  • 函数的实现
      • 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;
}

这个实现逻辑首先确定哪个日期较大,然后不断将较小的日期递增,直到它与较大的日期相等,过程中累计递增的天数,最终返回这个天数。如果初始的第一个日期小于第二个日期,返回的天数会是负值

让我们分析一下代码的关键部分:

  1. 确定日期大小:代码首先比较两个日期,确保max总是较大的日期,而min是较小的日期。flag变量用于记录原始日期的相对顺序,如果需要反转(即第一个日期小于第二个日期),flag会被设置为-1

  2. 计算天数差:通过一个循环,每次将min日期递增一天(使用operator++),直到min等于max。每次递增都会将n加1,n用于记录两个日期之间相差的天数

  3. 返回结果:最后,返回累计的天数n乘以flag。如果flag-1,表示第一个日期实际上是小于第二个日期的,因此返回负值

本节内容到此结束,感谢大家阅读!

相关文章:

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

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们本节内容来完成知识的实践&#xff0c;来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…...

基于easyx库的C/C++游戏编程实例-飞机大战

飞机大战游戏设计 首先创建飞机/子弹结构&#xff1a; struct Plane {int x;int y;bool live;int width;int height;int type;int hp; }player,bul[BUL_NUM],enemy[ENE_NUM];你需要加载图片&#xff1a; void ImageLoad() {//背景loadimage(&bg[0], "./image/飞机大…...

stitcher类实现多图自动拼接

效果展示 第一组&#xff1a; 第二组&#xff1a; 第三组&#xff1a; 第四组&#xff1a; 运行代码 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是什么&#xff1f;套接字是什么&#xff1f; https://blog.csdn.net/m0_37925202/article/details/80286946 Socket程序从Windows移植到Linux下的一些注意事项 sockaddr和sockaddr_in详解 bzero和memset函数 函数原型&#xff1a;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] 另一个程序正在使用此文件&#xff0c;进程无法访问。: d:\\anaconda\\envs\\yolov5\\lib\\site-packages\\ISR-2.2.0-py3.7.egg 解决方法&#xff1a;重启pycharm python-contrib 无法安装 opencv-contrib-python 安装包网址&#xff1a;安装包下载链接…...

6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f LCD使用 简介 AIO-3399J开发板外置了两个LCD屏接口&#xff0c;一个是EDP&#xff0c;一个是LVDS&#xff0c;接口对应板…...

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是&#xff08;&#xff09;。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…...

【算法】基数排序

简介 基数排序&#xff08;*Radix sort&#xff09;是一种非比较排序算法&#xff08;non-comparative sorting algorithm&#xff09;。现代计算机的基数排序算法由 计数排序 算法的开发人哈罗德H西华德&#xff08;Harold H. Seward&#xff09;于1954年于麻省理工大学开发。…...

2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月

腾讯云2核2G服务器多少钱一年&#xff1f;轻量服务器61元一年&#xff0c;CVM 2核2G S5服务器313.2元15个月&#xff0c;轻量2核2G3M带宽、40系统盘&#xff0c;云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图&#xff1a;…...

不同Python版本和wxPython版本用pyinstaller打包文件大小对比

1、确定wxPython和Python版本的对应关系 在这里可以找到Python支持的所有wxPython版本&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/wxpython/ 由于Python从3.6版本开始支持f字符串、从3.9版本开始不支持Windows7操作系统&#xff0c;所以我仅筛选3.6-3.8之间的版本…...

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问&#xff08;两种方式&#xff09; 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明&#xff08;匿…...

AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)

AI时代-普通人的AI绘画工具对比&#xff08;Midjouney与Stable Diffusion&#xff09; 前言1、基础对比Stable Diffusion&#xff08;SD&#xff09;SD界面安装与使用SD Midjouney&#xff08;MJ&#xff09; 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…...

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1&#xff09;题目描述&#xff1a; 求A^B的最后三位数表示的整数&#xff0c;A^B表示&#xff1a;A的B次方。 2&#xff09;思路&#xff1a; 一般的思路是&#xff1a;求出A的B次幂&#xff0c;再取结果的最后三位数。但是由于计算机能够表示的数字…...

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…...

【Hello,PyQt】QTextEdit和QSplider

PyQt5 是一个强大的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。其中&#xff0c;QTextEdit 控件作为一个灵活多用的组件&#xff0c;常用于显示和编辑多行文本内容&#xff0c;支持丰富的格式设置和文本操作功能。另外&#xff0c;QSlider 控件是一…...

【力扣】191.位 1 的个数、485.最大连续 1 的个数

191.位 1 的个数 题目描述 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1…...

蓝桥杯 java 承压计算

题目: 思路&#xff1a; 1&#xff1a;其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2&#xff1a;假设每块原料的重量都十分精确地平均落在下方的两个金属块上&#xff0c;最后&#xff0c;所有的金属块的重量都严格精确地平分落在最底层的电子…...

leetcode268-Missing Number

这道题目要求缺失的数字&#xff0c;一般解决数组的问题&#xff0c;要么往排序数组&#xff0c;要么往双指针遍历这些方向上靠&#xff0c;要么往异或方向上靠&#xff0c;总之落点无非就只有这几个。我们要求缺失的数字&#xff0c;可以依次让1&#xff5e;n和数组元素进行异…...

Rails AI上下文模块设计:领域驱动与AI服务集成实践

1. 项目概述&#xff1a;当植物病理学遇上AI代码助手最近在整理一个老项目时&#xff0c;我遇到了一个非常有意思的命名&#xff1a;“Peronosporaceaevenography165/rails-ai-context”。乍一看&#xff0c;这像是一个典型的GitHub仓库命名风格&#xff0c;前半部分是极其专业…...

如何高效使用Windows键盘记录工具:开源监控解决方案

如何高效使用Windows键盘记录工具&#xff1a;开源监控解决方案 【免费下载链接】keylogger Keylogger for Windows. 项目地址: https://gitcode.com/gh_mirrors/keylogg/keylogger Windows键盘记录工具Keylogger for Windows是一款专为系统管理员和安全研究人员设计的开…...

【限时解密】Google内部测试版Gemini插件Beta通道开放倒计时——附3个已验证的早期功能入口及Token获取密钥

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini Chrome浏览器插件的演进脉络与Beta通道战略意义 Gemini Chrome 插件自 2023 年底首次公开测试以来&#xff0c;已历经三次重大架构重构&#xff1a;从初始的轻量级内容注入脚本&#xff0c;演进…...

Fillinger智能填充算法深度解析:从三角剖分到工程化实现

Fillinger智能填充算法深度解析&#xff1a;从三角剖分到工程化实现 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 在矢量图形设计领域&#xff0c;复杂形状内的元素填充是一个常见…...

芯片行业变革:开源硬件、可重构芯片与商业模式创新

1. 行业拐点&#xff1a;传统芯片商业模式为何难以为继&#xff1f;干了十几年芯片设计&#xff0c;从流片工程师到项目负责人&#xff0c;我亲眼见证了行业从“黄金时代”到如今“卷成本、卷工艺”的艰难转型。最近和几个老同事聊天&#xff0c;大家不约而同地提到一个词&…...

Adobe-GenP 3.0:Adobe CC通用补丁工具终极完整指南

Adobe-GenP 3.0&#xff1a;Adobe CC通用补丁工具终极完整指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款功能强大的Adobe CC通用补丁工具…...

TrguiNG汉化版:三招彻底改变你的Transmission远程管理体验

TrguiNG汉化版&#xff1a;三招彻底改变你的Transmission远程管理体验 【免费下载链接】TrguiNG Transmission WebUI 基于 openscopeproject/TrguiNG 汉化和改进 项目地址: https://gitcode.com/gh_mirrors/tr/TrguiNG 你是否还在忍受Transmission原生的简陋Web界面&…...

从NOIP真题到日常刷题:手把手教你用C++分离数字并统计(以‘数字统计’题为例)

从竞赛真题到实战技巧&#xff1a;C数字分离与统计的深度解析 在信息学竞赛的入门阶段&#xff0c;很多初学者面对"数字统计"这类题目时&#xff0c;往往陷入两个极端&#xff1a;要么死记硬背标准答案&#xff0c;要么被看似复杂的循环结构吓退。实际上&#xff0c;…...

从DICOM到NIfTI:3D Slicer中医学图像坐标转换的完整避坑指南(附Python代码片段)

从DICOM到NIfTI&#xff1a;3D Slicer中医学图像坐标转换的完整避坑指南&#xff08;附Python代码片段&#xff09; 医学影像处理中&#xff0c;数据格式和坐标系的差异常常成为工程师和研究员们的"隐形杀手"。想象一下&#xff0c;你花了三天三夜训练的深度学习模型…...

如何快速掌握WarcraftHelper:魔兽争霸III终极辅助工具完整指南

如何快速掌握WarcraftHelper&#xff1a;魔兽争霸III终极辅助工具完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III的画面拉…...