【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.mzph.cn/bicheng/11069.shtml

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

相关文章

【数据结构】环状链表OJ题

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 一、OJ 环形链表&#xff1a; 快慢指针即可解决问题: 2情况&#xff1a; 快指针走到结尾&#xff08;不是环&#xff09;快指针和尾指针相遇&#xff08;是环的&#xff09; …

(CVE-2012-1823)PHP-CGI远程代码执行漏洞(80端口)

&#xff08;CVE-2012-1823&#xff09;PHP-CGI远程代码执行漏洞&#xff08;80端口&#xff09; 一、介绍二、漏洞影响三、原理四、漏洞复现 一、介绍 php-cgi是一个类似于消息的“传递者”&#xff0c;它接收web容器收到的http数据包&#xff0c;并把里面的数据交给PHP解释器…

清华发布Temporal Scaling Law,解释时间尺度对大模型表现的影响

众所周知&#xff0c; 语言模型调参&#xff01; 预训练语言模型调参&#xff01;&#xff01; 预训练大语言模型调参&#xff01;&#xff01;&#xff01; 简直就是一个指数级递增令人炸毛的事情&#xff0c;小编也常常在做梦&#xff0c;要是只训练几步就知道现在的超参…

python选修课期末考试复习

目录 记住输出小数的格式文件条件判断随想循环小星星计算金额猜数字折纸 函数找最大值 基础知识总结 记住输出小数的格式 输出a&#xff0c;保留两位小数 %.2f%a打开文件有点儿难&#xff0c;多记几遍格式吧 文件的格式后面有冒号&#xff0c;谨慎一点&#xff0c;都用双引号…

基于C++和Python基础的Golang学习笔记

文章目录 一、基础1.DOS命令2.变量&#xff08;1&#xff09;局部变量&#xff08;2&#xff09;全局变量&#xff08;3&#xff09;数据类型&#xff08;4&#xff09;指针&#xff08;5&#xff09;运算符&#xff08;6&#xff09;自定义数据类型 3.语句&#xff08;1&#…

第十四篇:数据库设计精粹:规范化与性能优化的艺术

数据库设计精粹&#xff1a;规范化与性能优化的艺术 1. 引言 1.1 数据库设计在现代应用中的核心地位 在数字化的浪潮中&#xff0c;数据库设计如同建筑师手中的蓝图&#xff0c;是构建信息大厦的基石。它不仅关乎数据的存储与检索&#xff0c;更是现代应用流畅运行的生命线。…

【SpringBoot】解锁后端测试新境界:学习Mockito与MockMvc的单元测试魔法

文章目录 前言&#xff1a;Java常见的单元测试框架一.Junit5基础二.SpringBoot项目单元测试1.添加依赖2.SpringBoot单元测试标准结构3.SpringBoot单元测试常用注解 三.单元测试中如何注入依赖对象1.真实注入&#xff08;AutoWired、 Resource&#xff09;2.Mock注入2.1.前言2.2…

资料总结分享:瀑布图,GESA,生存曲线

目录 瀑布图 GESA 生存曲线 瀑布图 肿瘤的瀑布图是一种常用的数据可视化方式&#xff0c;用于展示个体患者或研究样本的肿瘤基因组学数据&#xff0c;通常包括基因突变、基因拷贝数变异、染色体重排等信息。 颜色编码&#xff1a; 柱状图通常会使用颜色编码来表示不同类型…

Redis的数据淘汰策略——Java全栈知识(19)

Redis的数据淘汰策略 什么是数据淘汰策略 数据过期策略是 redis 中设置了 TTL 的数据过期的时候 Redis 的处理策略。数据淘汰策略是 Redis 内存不够的时候&#xff0c; 数据的淘汰策略&#xff1a;当 Redis 中的内存不够用时&#xff0c;此时在向 Redis 中添加新的 key, 那么…

IEEE 802.11标准

在IEEE 802.11标准中使用了扩频通信技术&#xff0c;主要作用是使得抗干扰性更强。 IEEE 802.11在MAC层采用了CSMA/CA协议。 IEEE 802.1x是一种基于端口认证协议。

开源web在线数据库设计软件 —— 筑梦之路

GitHub - drawdb-io/drawdb: Free, simple, and intuitive online database design tool and SQL generator. 简介 DrawDB是一款多功能且用户友好的在线工具&#xff0c;允许用户轻松设计数据库实体关系。通过简单直观的界面&#xff0c;DrawDB使用户能够创建图表、导出SQL脚本…

kettle经验篇:MongoDB-delete插件问题

目录 项目场景 问题分析 解决方案 MongoDB Delete插件使用总结 项目场景 项目使用的ODS层数据库是MongoDB&#xff1b;在数据中心从DB层向ODS层同步数据过程中&#xff0c;发现有张ODS表在同步过程中&#xff0c;数据突然发生锐减&#xff0c;甚至于该ODS表数据清0。 同步…

算法设计与分析 例题 绘制Huffman树、循环赛、分治、最短路与动态规划

1.考虑用哈夫曼算法来找字符a,b,c,d,e,f 的最优编码。这些字符出现在文件中 的频数之比为 20:10:6:4:44:16。要求&#xff1a; &#xff08;1&#xff09;&#xff08;4 分&#xff09;简述使用哈夫曼算法构造最优编码的基本步骤&#xff1b; &#xff08;2&#xff09;&…

Oracle 流stream数据的复制

Oracle 流stream数据的复制 --实验的目的是捕获scott.emp1表的变化&#xff0c;将变化应用到远程数据库scott.emp1表中。 --设置初始化参数 AQ_TM_PROCESSES1 COMPATIBLE9.2.0 LOG_PARALLELISM1 GLOBAL_NAMEStrue JOB_QUEUE_PROCESSES2 --查看数据库的名称&#xff0c;我的为o…

2024中国(重庆)机器人展览会8月举办

2024中国(重庆)机器人展览会8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 2024中国重庆机器人展会将汇聚机器人全产业链知名企业&#xff0c;世界科技领先的生产制造企业与来自多个国家和地区…

蓝桥杯-网络安全比赛(6) 模拟实验 Metasploit 控制并获取Windows 登录HASH、LM Hash和NTLM Hash密文解析

窃取WINDOWS账号密码 系统环境&#xff1a;主机&#xff08;Windows系统 IP&#xff1a;192.168.126.129)&#xff0c;虚拟机&#xff08;KALI系统 IP&#xff1a;192.168.126.3&#xff09;&#xff0c;两者需要能通过本地网络互通互连。 攻击工具&#xff1a;Metasploit是一…

改变浏览器大小,图片(img)内容居中显示img标签,不是背景图

改变浏览器大小,图片&#xff08;img&#xff09;内容居中显示&#xff0c;img标签&#xff0c;不是背景图 效果直接上图&#xff1a; 上代码&#xff1a; <!DOCTYPE html> <html> <head><title>测试图片居中显示&#xff0c;高度不变只变宽度<…

Electron学习笔记(五)

文章目录 相关笔记笔记说明 七、系统1、系统对话框2、自定义窗口菜单3、系统右键菜单4、快捷键(1)、监听网页按键事件 &#xff08;窗口需处于激活状态&#xff09;(2)、监听全局按键事件 &#xff08;窗口无需处于激活状态&#xff09;(3)、补充&#xff1a;自定义窗口菜单快捷…

异常处理/ROS2异常处理模块源码解读与浅析

文章目录 概述ros2/rcutils/src/error_handling模块自身异常处理错误状态结构与存储本模块初始化错误状态的设置错误状态的获取错误状态的清理不丢失旧错误状态把手段还原为目的其他 概述 本文从如下几个方面对 ROS2.0 中 rcutils 库 error_handling 错误处理模块的源码进行解…

花了24小时做的采购、库存、进销存excel模板,真心好用,免费分享

花了24小时做的采购、库存、进销存excel模板&#xff0c;真心好用 在企业的日常运营中&#xff0c;进销存管理是一项至关重要的任务。它不仅涉及到商品的采购、销售和库存管理&#xff0c;还直接影响到企业的财务状况和市场竞争力。为了提高管理效率&#xff0c;许多企业选择使…