【C++】用C++实现一个日期计算器

欢迎来到CILMY23的博客

本篇主题为: 用C++实现一个日期计算器

个人主页:CILMY23-CSDN博客

系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux

感谢观看,支持的可以给个一键三连,点赞关注+收藏。


写在前头:

知识所需:构造函数,运算符重载类和对象,类的声明和定义分离,内联函数,拷贝构造

额外知识: 友元声明

文件Date.h Date.cpp test.cpp

注意日期类的拷贝构造和析构都是不需要写的


目录

一、功能逻辑图

二、Date.cpp代码实现 

2.1 日期比较  

2.2 日期加天数 

2.3 日期减天数 

2.4 日期前置++和后置++

2.5 日期前置--和后置--

2.6 日期与日期相差的天数

2.7 日期显示 

2.8 流输出

2.9 流提取

2.10 日期类输入的检查和日期的初始化

三、Date.h中的声明 


一、功能逻辑图

日期计算器的功能如下,我们要考虑日期的增加和减少自增和自减,以及两个日期类的比较,以及当前日期类的日期显示和用户的输入输出

二、Date.cpp代码实现 

2.1 日期比较  

日期比较主要实现以下六种比较,因为日期的比较是自定义类型,所以我们需要用到运算符重载来进行比较,先通过实现等于和小于,其余的功能复用就可以了。 

 代码如下:

//日期比较
//小于
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 _day < d._day;}}}return false;
}
//小于等于
bool Date::operator<=(const Date& d)
{return (*this < d) || (*this == d);
}
//大于
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 _year == d._year &&_month == d._month&& _day == d._day;
}
//不等于
bool Date::operator!=(const Date& d)
{return !(*this == d);
}

2.2 日期加天数 

日期增加天数我们所用到的运算符是 + +=,日期增加有两种方式,一种是+复用+=,一种是+=复用+,我们实现的是+复用+=,另外一种会创建新对象造成效率降低。

Date& Date::operator+=(int day)
{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);_month++;if (_month == 13){_month = 1;_year += 1;}}return *this;
}Date Date::operator+(int day)
{Date tmp = *this;//拷贝构造tmp += day;return tmp;
}

2.3 日期减天数 

日期减去天数也同理日期增加天数,先实现 -= 然后再去实现

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

2.4 日期前置++和后置++

日期前置++和后置++ 主要区别在于,C++中用一个形参类型区分前置和后置。在编译器传参的时候会传一个整型,然后表示这是一个后置++。 

//日期自增
//前置++
Date& Date::operator++()
{*this += 1;return *this;
}
//后置++
Date Date::operator++(int)
{Date tmp = *this;*this += 1;return tmp;
}

2.5 日期前置--和后置--

日期前置--和后置--也同理日期前置++和后置++。 

//日期自减少
//前置--
Date& Date::operator--()
{*this -= 1;return *this;
}
//后置--
Date Date::operator--(int)
{Date tmp = *this;*this -= 1;return tmp;
}

2.6 日期与日期相差的天数

日期与日期的相减,是运算符 -重载函数。 主要思路是,通过把最小的日期自增到最大的日期,计算次数就是它们之间相差的天数。

//日期与日期的相减
int Date::operator-(const Date& d)
{int flag = -1;int n = 0;Date min = d;Date max = *this;if (*this < d){flag = 1;min = *this;max = d;}while (min != max){++min;++n;}return flag * n;
}

2.7 日期显示 

当前日期显示则较为容易,主要是让用户知道自己输入的两个日期是什么样的。

void Date::Print()
{cout << "当前日期:"<< _year << "/"<< _month << "/"<< _day<< endl;
}

2.8 流输出

流输出主要是方便我们对日期类的输出,用上流运算符方便打印。 

ostream& operator<<(ostream& out, const Date& d)
{out << d._year << "年" << d._month << "月" << d._day << "天" << endl;return out;
}

2.9 流提取

 流提取也同理流输出。但是注意在对日期的输入前,需要我们对日期进行检查。

istream& operator>>(istream& in, Date& d)
{while (1){cout << "请输入对应的年月日" << endl;in >> d._year>> d._month>> d._day;if (!d.CheckInvalid()){cout << "日期输入错误,请重新输入" << endl;}else{break;}}return in;
}

2.10 日期类输入的检查和日期的初始化

 日期类的检查:

//日期检查
bool Date::CheckInvalid()
{if (_year <= 0|| _month < 1 || _month >12|| _day < 1 || _day > GetMonthDay(_year, _month)){return false;}elsereturn true;
}

日期类的初始化:

//日期初始化
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;if (!CheckInvalid()){cout << "构造日期非法" << endl;}
}

三、Date.h中的声明 

代码如下: 

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
//日期计算器的声明#include<iostream>
#include<assert.h>
using namespace std;class Date
{
public://日期初始化//全缺省构造函数//声明给缺省值,定义不给缺省值Date(int year = 1, int month = 1, int day = 1);//日期比较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);//日期增加天数Date& operator+=(int day);Date operator+(int day);//inline 不写:本质就是内联,不声明和定义分离int GetMonthDay(int year, int month){assert(month > 0 && month < 13);static int MonthDay[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 MonthDay[month];}//日期减少Date& operator-=(int day);Date operator-(int day);//日期自增//前置++Date& operator++();//后置++Date operator++(int);//日期自减//前置--Date& operator--();//后置++Date operator--(int);//日期与日期的相减int operator-(const Date& d);//用户输出friend ostream& operator<<(ostream& out, const Date& d);//用户输入friend istream& operator>>(istream& in, Date& d);//日期检查bool CheckInvalid();//日期打印void Print();private:int _year;int _month;int _day;
};//用户输出
ostream& operator<<(ostream& out,const Date& d);
//用户输入
istream& operator>>(istream& in, Date& d);

后文: 

日期计算器的大致功能如上,主要还是对运算符重载的应用和之前类和对象的知识掌握。有很多地方也不够完善,当然还有很多地方需要改进,在实际应用中还需要调用以上的接口,那日期计算器的界面我也写了一点,大家可以尽情发挥。

//日期界面
//显示日期计算器界面
void CalculatorInterface()
{int n = 1;cout << "欢迎使用日期计算器!" << endl;cout << "请选择您想要执行的操作:" << endl;cout << "1. 计算两个日期之间的天数差" << endl;cout << "2. 计算某个日期之后或之前的日期" << endl;cout << "0. 退出" << endl;cout << "请输入选项数字: ";cin >> n;if (n == 0){exit(1);}else if(n == 1){//....}else{cout << "无效的选项,请重新输入。" << endl;}
}

为了简便,也可以使用转移表,或者使用switch case 来进行选择对应的功能…… 


 感谢各位同伴的支持,本期日期计算器篇就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。 


http://www.ppmy.cn/ops/36188.html

相关文章

MySQL:多表查询练习

#1.出版社信息 与 图书信息 交叉连接 select * from 出版社信息 cross join 图书信息; #2.从“客户信息”和“订单信息”两张数据表中查询购买了商品的客户信息&#xff0c;要求查询结果显示客户姓名、订单编号、订单状态。 select 客户信息.客户姓名,订单信息.订单编号,订单…

远程服务器 docker XRDP 桌面访问 记录

需求描述: 我现在在远程连接 一台服务器&#xff0c;由于需要实验环境需要GUI 和 桌面系统&#xff0c;但是又想在 docker 中运行。因此&#xff0c;我现在首先需要通过 ssh 连接服务器&#xff0c;然后再服务器中连接 docker. REF: https://github.com/danielguerra69/ubuntu-…

26_Scala集合常用API汇总

文章目录 1.mkString2.size&#xff0c;length&#xff0c;isEmpty,contains3.reverse ,length,distinct4.获取数据相关4.1数据准备4.2准确获取尾部last4.3 除了最后一个元素不要其他都要4.4从集合获取部分数据 5.删除数据5.1删除3个从左边5.2删除3个右边 6.切分数据splitAt(n:…

python - rst file to html

文章目录 python - rst file to html概述笔记下载安装PyCharm最新的学习版新建虚拟环境为Conda的工程添加docutils库新建python文件&#xff0c;添加转换代码运行自己写的python文件&#xff0c;执行转换转换结果END python - rst file to html 概述 开源工程中有一个.rst文件…

【LLM】动手部署个人知识库助手

文章目录 动手部署个人知识库助手环境依赖项目运行总结 动手部署个人知识库助手 经过前面章节的学习&#xff0c;理解了LLM、向量知识库等知识&#xff0c;本章节开始实践部署个人知识库助手。 本次部署的项目github地址个人知识库助手项目 环境依赖 技术资源要求 CPU: Int…

PHP基础教程

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;PHP &#x1f4da;参考教程&#xff1a;菜鸟\编程网❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、PHP语法 基本的 PHP 语法 PHP 注释 PHP空白不敏…

uniapp 自定义App UrlSchemes

需求&#xff1a;外部浏览器H5页面&#xff0c;跳转到uniapp开发的原生app内部。 1、uniapp内部的配置&#xff1a; &#xff08;1&#xff09;打开manifest->App常用其他设置&#xff0c;如下&#xff0c;按照提示输入您要设置的urlSchemes&#xff1a; &#xff08;2&am…

STC89C52驱动XPT2046AD转换

目录 简介封装接线&#xff08;单端&#xff09;时序以及命令字SPI时序命令字 程序XPT2046.CXPT2046.hmain.c测试 简介 XPT2046是一款4线电阻式触摸屏控制器&#xff0c;采用12位125 kHz采样SAR类型A / D转换器。XPT2046工作电压低至2.2V&#xff0c;支持1.5V至VCC的数字I/O接…

【Osek网络管理测试】[TG4_TC2]Normal状态下的睡眠中断_应用报文

🙋‍♂️ 【Osek网络管理测试】系列💁‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果1.环境搭建 硬件:VN1630 软件:CANoe 2.测试目的 验证DUT在normal状态下的睡眠中断是否正确 分析:在常规运行状态下,满足睡眠条件后,进入到等待…

Android Binder服务的获取与使用

{ sp sm defaultServiceManager(); sp binder sm->getService(String16(“IHello”)); sp<com::hello::IHe llo> hello interface_cast(binder); hello->hello(); int ret 0; hello->sum(1, 2, &ret); } interface IHello{ void hello(); int sum(int …

ComfyUI搭建和注意事项for WIN[笔记]

下载ComfyUI(GitHub - comfyanonymous/ComfyUI: The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface.) 从源码上搭建比较麻烦&#xff0c;一般不推荐&#xff0c;所以跑到release里面找一个下载。我的显卡是GeFore GTX 1050 …

揭秘APP广告收益新策略:如何通过观看广告变现赚钱?

在数字时代&#xff0c;手机应用程序&#xff08;APP&#xff09;已成为我们生活中不可或缺的一部分。它们为我们的日常生活提供便利&#xff0c;同时也为企业提供了一种创新的盈利模式——通过展示广告来变现。近期&#xff0c;这种通过看广告来实现盈利的方式引起了公众的广泛…

ArkTS开发原生鸿蒙HarmonyOS短视频应用

HarmonyOS实战课程“2024鸿蒙零基础快速实战-仿抖音App开发&#xff08;ArkTS版&#xff09;”已经于今日上线至慕课网&#xff08;https://coding.imooc.com/class/843.html&#xff09;&#xff0c;有致力于鸿蒙生态开发的同学们可以关注一下。 课程简介 本课程以原生鸿蒙Ha…

C# do...while循环

do...while循环它与 for 循环和 while 循环不同&#xff0c;for 循环和 while 循环会在循环开始之前先判断表达式的结果&#xff0c;只有表达式结果为真时才会开始循环&#xff0c;而 do while 循环会先执行一遍循环主体中的代码&#xff0c;然后再判断表达式的结果。也就是说&…

缓存一致性

缓存数据一致性 双写模式失效模式 都会导致缓存不一致问题。 解决方案-Canal 更新 DB 会产生的 binlog&#xff0c;Canal 订阅 binlog&#xff0c;监测到数据库的更新&#xff0c;从而更新缓存。 解决方案-分布式读写锁 适用于读多写少的情况

亚马逊关键字搜索商品列表API接口:探索海量商品的利器

亚马逊关键字搜索商品列表API接口允许开发者通过输入关键字或特定参数&#xff0c;在亚马逊平台上进行商品搜索&#xff0c;并返回符合搜索条件的商品列表信息。这些信息包括商品的标题、图片、价格、评价等&#xff0c;为商家、开发者以及市场分析师提供了丰富的商品数据支持。…

【三维重建】摄像机标定(张正友相机标定法)

摄像机标定的目的是为了求解摄像机的内、外参数 求解投影矩阵M 通过建立特殊的场景&#xff0c;我们能过得到多对世界坐标和对应图像坐标 根据摄像机几何可知 &#xff1a; &#xff0c;M是一个3*4的矩阵&#xff0c;令 通过一对点可以得到两个方程组&#xff0c;M中一共有11…

Java简介超详细整理,适合新手入门

目录 一、Java 简介 二、Oracle 公司 三、Java平台体系 四、Java语言主要特点 1、Java 语言是简单的 2、Java 语言是面向对象的 3、Java语言是分布式的 4、Java 语言是健壮的 5、Java语言是安全的 6、Java 语言是体系结构中立的 7、Java 语言是可移植的 8、Java 语言是解释型的…

场景文本检测识别学习 day08(无监督的Loss Function、代理任务、特征金字塔)

无监督的Loss Function&#xff08;无监督的目标函数&#xff09; 根据有无标签&#xff0c;可以将模型的学习方法分为&#xff1a;无监督、有监督两种。而自监督是无监督的一种无监督的目标函数可以分为以下几种&#xff1a; 生成式网络的做法&#xff0c;衡量模型的输出和固…

在网站源码后台增加响应式布局

一本教材上的网站源码&#xff0c;后台在手机上查看还是按照电脑的页面样式&#xff0c;不方便查看和发布新内容。教材上讲了响应式布局。对于页面结构简单的网站&#xff0c;可以利用响应式&#xff0c;使页面自动适用各种屏幕的分辨率。 今天在一个网站源码的后台使用了响应…