c++----日期类

news2025/1/14 0:54:02

       今天这篇博客是对我们上面的两篇博客的一个小小的检验。我们今天来实现一下我们手机上的一个小功能。对日期的实现。那么如何实现以及使用哪些知识,我们马上来看看吧。

思想概括

        其实实现日期类并不是什么难事。如果用c语言的话大家可能会觉得很简单,主要是我们现在初学c++对于c++的一些使用和逻辑还不是很熟悉,所以会感觉很难搞。

       那么言归正传我们实现日期类,无非就是输入日期,然后进行一些加减乘除的运算,然后的醋结果再打印出来就可以了。虽然这么讲是很简单,但是实施起来却还是有点小麻烦的。就不如说我们想想我们的日期类哪些功能是不用写的。什么功能在我们手机上是一体的,但是实际实施起来却是要分开的,这就与我们上一篇博客中提及过的需要思考重载的运算符是否有意义一样。好了那么接下里我们就一步一步的实现一下。

实现日期类

创建项目

        我们依据以往的经验来看,实现一个稍微大一点的项目肯定是先分别建立几个项目的。那么我们在c++中同样适用的。只是我们现在是c++了,所以我们的后缀名不在是.c而是.cpp了。

头文件内容 

         当我们创建好了项目后我们就要思考我们实现日期类的前提了。我们想想我们实现日期类,那么肯定得有日期吧,那么日期就是年月日。这个我们得定义。然后就是一些其他的功能了是吧。毕竟我们只是一个简单的日期类实现,并不会造成更多的项目成果。然后大家思考一下,我们居然在c+加里面,我们在头文件里面定义,那么我们肯定会用c++的相关知识吧?那么我们是像以前一样直接定义出来呢还是用其他的方法呢?

        这个答案肯定显而易见了,我们肯定要使用我们在c加加里面的知识,那么我们不可采水,如果进行类的定义,这些也刚刚好方便我们使用,因为我们可以在里面直接定义了变量之后,然后再在公开的定义出我们的项目名称,然后一些其他的需要的功能

        大家先看一下,上面的图片最下面是我们的变量定义, 然后最上面的我们的初始化,但是大家也看到了,我们这里使用的全却省参数,大家还记得吧。就是当我们不主动传参的话,我们的日期就会是这个了。然后上面也解释过,我们为什么将日期的比较分卡。这是因为我们这个日期比较结果又很多,如果堆在一个函数里面的话,就太臃肿了。所以我们分开来写。接下里的一部分就是我们日期对天数的修改。最好一个函数就是我们的日期减日期。最后的结果的两个日期的结果所以这是由必要的。那么我为什么会用有必要这个词咧。这是因为大家想想日期加日期有意义嘛?有啥意义啊。我们有日期加天数啊。再说了我们日期加日期,我前面还要写年份啊。这么一节不是好多个世纪过去了,就没有呀了,是吧。这也就是开始讲的我们重载要有意义。

       随后就是我们看看+=和-=,前置++以及前置--。这些为什么有一个&啊。这是什么意思啊。

函数实现

        那么当我们实现了前置条件后,我们就来实现函数了。首先我们来写第一个函数是对参数初始化,这个简单吧,不就是接收的日期给我们要改变的日期嘛。但是大家可能会问,那你这个定义的时候,怎么没有接收的参数啊。如果大家有这个疑问的话,大家可能需要回去看看我的c++入门的博客了,因为我在里面写过this指针啊。这个包含了一个隐形的this指针,在这里this指针就指向我们的接收参数。

       大家看看,这个写法大家是否理解。因为我们这里是函数实现项目,没在类里面所以我们需要确定我们来源正确,就用上我们以前学习的引用表示::并且我们需要在前面写出出自类的名字。 

       但大家想想我们只需要库库一顿写就可以了吗?我们正常情况下,是不会乱写的,但是架不住有些时候啊。我们来写个2023,11,35。这不明显的有问题吗?哪个月有35天啊。所以我们是不是还要在前面写一个判断日期是否合理的函数啊。那么我们就要在头文件中定义一个判断日期正确性的函数。

       这里我就不写出来了,反正大家思考一下,我们这里只是判断一下他的日期是否正确,所以说呢我们只需要段月份和日份就可以了。如果要传值呢,因为我们前面也说过,隐含的我们this指针写不出来,所以我们只需要一个括号就可以了,那样就定义好了。

       同时我们也牵扯出了另外一个问题,我们说在这前面说我们需要获取他这个月的日期有多少天。我们知道我们大部分日期是确定好了的,但唯独一个二月他有平闰年的区分。所以这个我们需要单独分出来写,那么这就是我们接下来要写的第三个函数获取每个月的天数。

        但是大家想一想,我们这个获取每个月的天数是不是很多呀?要调用很多次啊。们加加减减和加多少天减多少天都需要用到这个,那么如果我们再写在函数实现的项目里面是不是就有一点很烦呀?因为我们每次都要调在这里面调用。那么我们要不我直接写在头文件里面,因为我们直接在全局定义了,这相当于我们直接在这里面,而且我们在那里面写的话,这样会调用更加方便快捷。

       大家可以看到我们这里在头文件里面,这样我们获得每个月的日期写出来了。前我们在定义这个日期的时候,我们想一想,我们写了一个static它定义为静态变量。那这样他就可以大家一起使用了。大家可以看到我们这个数组为什么是初始化的为13个月的。我们思考一下我们这月份没有零月吧,所以但是我们数组下标是从零开始的呀,所以我们这里就将零用随便的一个值代替,然后后面我们判断的时候就刻意避开下边为零的这个下标数就可以了。最后就是我们需要判断2月的准确天数,我们在c前面也写过。判断闰年就是看他是否被四整除和被100整除为不为零,或者被400整除为零。这样就可以判断二月要准确天数了。然后当每次调用之后,我们就将这个数组的值返回给他就可以了。

        其次是我们看d1是否<d2那么我们思考一下。我们日期比较吧。是不是应该先比较年份啊,大家看看嘛,如果我们的年份都比你大,那么你后面怎么都会比我们小是吧。然后依次比较下去。

        并且我们在前面已经写过了获得每天的日期。那么我们就以此来比较,首先我们需要判断年份。如果连很得出结果,那么我们就可以不再判断了。我们年份无法区分大小的时候,在区分月份,然后月份之后再判断多少号。但这里我们还需要再区分一下的就是只有当年份相同的时候,我们再判断月份,当月份相同的时候再判断多少号。并且因为我们这是分开的,所以这是必须要有的步骤。

日期对比

 

         我们前面写过了是否<,接下来的是写是否<=,因为我们是区分开来的吧,如果我们小于等于的话,可以简单的理解为就是小于或者等于这个就相当于是两个式子。大家思考一下,是不是这个道理?我们小于等于嘛?区分开来就是小于和等于并且因为我们前面已经写过了小于的式子那我再补一个是否相等的式子就可以了呀,大家思考一下,是不是这个道理?所以我们就暂时先不写小于等于我们就先来写判断他们是否相等。判断相等的话就很简单了,是吧?需要用我们的隐含指针的年月份与我们传递过去的年月份相比较就可以了。我们也不用在函数里面一个一个对比,我们只需要在返回值那里直接比较就可以了。

       好,那我们写过了判断小于和判断相等有两个函数之后,我们再来实现小于等于不是就很简单了吗?因为我们小于等于嘛就只是需要判断他们两个其中一个成立,那么这个事情就成立了。记住大家千万不要用和有或。因为如果用核的话,那么是两个都成立才成立

        那么以此类推。实现大于的话就是小于等于的相反数,大家思考一下是不是这样的?我们就不需要像开始的判断小于那样写出来完了。

        然后就是大于等于的话,那岂不是就是小于的相反数了?大家思考一下,不要乱了,这个很简单,很容易理解的,大家只需要将每个试纸的符号写出来,然后思考一下就可以得出这个很简单的理论了。

        最后一个呢就是判断是否不等。那么这个就是显而易见的是判断是否相等的取反了

日期加减

       我们上面的一些函数实现都是判断两个日期的大小。接下来就是我们的日期的加减了。但是在实现这些函数之前,我们要现实考虑一下。为什么我们在定义的时候有一些定义是有取地址符号的,而有一些是没有的?

        因为我们这几个函数都会改变我们的实参啊。是吧,其他的都不会立马改变实参,比如后置++,先使用后加,我都已经把值传回来了,虽然都是要改变的,但是我并不会立马使用啊,而且,对于我们来说,后置++是不是没啥用太大的用啊。但是我们为了区分开来还是写出来。

        好,接下来我们就按照上面的顺序来依次实现一下日期加减天数的函数了。首先呢就是我们最常见的加日期加天数。对于我们的加呢我们很简单。因为我们加等是要改变原值的,并且马上返回所以我们需要使用取地址符。

          但是我们还需要留意一下的就是我们首先要判断这个日期他是不是乱写,是吧?明明加的话我们要是写一个负的话,那是不是就有问题?怎么能加一个负数呢?对吧?我们就将这个值改为正值。或者将他送给减。这里我们就是将这个值送给减等。

       然后就是我们去判断一下我们这个家的话不可能永远不超过这个月吧。如果没超过这个月很简单,我们只需要加就可以了,但是如果超的话,我们就需要往前月份加一。甚至我们的年也要向上加一。是吧?这个就是简单的,如果我们家的超出了月份或者年份就要向上加一。

       那我们写了加等之后就是该我们写加了。但是我们需要思考一下,我们如果只是加的话会改变我们的原值吗?不会吧?那么我们这儿就只需要写一个临时变量。,然后把这个临时变量返回出来。

     

        然后就是我们的减这样反倒很简单,那么我们减肯定就是依葫芦画瓢。 

         那么对于减来说,我们的减等就是至关重要的了。我们前面写过加等的减等就也很简单了。我们还是需要判断它输入的天数是否正确,然后将它送给加等。然后就是呢如果我们的这个天数它小于零是一个负数的话,那么我们是不是要借月,给这个号数相加啊,因为我们现在谁都没见过,都为负多少多少号的吧。

       Ok,我们现在写了加减和加等减等的。现在就剩一些前置加加和前置减减,后置加加减减了,以及日期减日期了。我们先来写后置加加。那如果看到我刚刚的那篇博客中的话,就应该知道这家为了区分前置加加和后置加加,专门规定在后置加加的括号中写一个int。尽管我们这里是不需要传参数的,因为我们加加嘛就只是加一就可以了。你在这个括号的参数里面你可以写任何数无所谓,反正你必须是int,你才能表明这是后置加加。而且我们也说过这里面有隐含的this指针,所以我们写的参数无所谓是没问题的。

       相较于后置加加,前置加加就简单很多了。也就只是加一,但只是前置加,因为我们需要将加加号的值返回过去,所以我们这里需要他的实际值 

       然后就是我们依葫芦画瓢的前减减和前后减减。

      最后一个就是我们这里稍微有一点的难度的日期减日期了。首先呢我们日期减日期我们可以先区分出哪个大,哪个小,然后用小的一直加加加加到与大的相同,并且在途中我们在建立一个变量来记录他们相加的次数,那么这个次数不就是他们两个相差之间的天数了吗? 

        还有一点就是如果只遇见这个情况来讲的话,我们只能得出一个正数。如果d1小于d2的话,我们减出的数为一个负数啊,所以我们需要再确立一个判断它为正为负的值。也可以用到我们c中学到的假设法。我们假设d1是最大的,d2是小的,然后再判断是否假设正确。如果我们假设正确的话,那么他们得出的值就是正数,这个没问题,但如果他们假设错误的话,那么他们的最后的值为负。再用我们中途创建的变量的结果乘以一个-1,那么就可以得出正确的天数了。

总结

       那么上面呢就是我们的这些结果了。其实仔细思考一下其实是不难的,无非就是大家刚开始对c++的知识不熟悉,所以有时候会思考很多。其中对于天数对比的有快捷方式的时候,大家需要多思考一下,在我们实现快捷方式之前至少要写出两个式子才能进行快捷方法,你至少要写一个等于和一个大于或者小于,这样才能快捷的写出其他的。大家如果想要我的博客代码的话,可以点击下面的链接。

7月29号博客: 博客的代码以及日常练习

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

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

相关文章

【VS Code】我用到的一些VS Code插件和命令

【命令】 打开终端&#xff1a; Ctrl ~ 【插件】 材质图标主题插件&#xff1a;Material Icon Theme 让文件图标看起来更美丽

yandex图标点选验证码YOLOV8识别案例

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 某yandex图标点选验证码如下: 使用过yolov8的小伙伴可能都知道,这种直接打个标注,基本上就可以了,至于问题图片由于不能很好的切割做分类,所以干脆也做成目标…

还在用JVM跑你的Java代码吗?太慢了,试试Oracle的GraalVM吧

前言 对于Java开发者们来说&#xff0c;几乎每天都在和JVM打交道&#xff0c;然而JVM即将过时了。那些对新技术保持敏锐洞察力的开发者&#xff0c;可能已经在生产环境中部署GraalVM生成的二进制程序了&#xff0c;小伙伴们&#xff0c;你们已经用起来了吗&#xff1f; Graal…

AOP~面向切面编程介绍

AOP基础 概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;面向特定方法的编程。 动态代理是面向切面编程最主流的实现。 SpringAOP是Spring框架的高级技术&#xff0c;旨在管理bean对象的过程中&#xff0c…

【基础篇】Docker 架构与组件 TWO

嗨&#xff0c;小伙伴们&#xff01;我是小竹笋&#xff0c;一名热爱创作的工程师。上一篇我们聊了聊 Docker 的历史与发展、与虚拟机的对比以及它在行业中的应用。今天&#xff0c;让我们更进一步&#xff0c;深入探讨 Docker 的架构与关键组件。 欢迎订阅公众号&#xff1a;…

Fantastic-admin:Vue 中后台管理系统

Fantastic-admin&#xff1a;Vue 中后台管理系统 在当今的前端开发世界里&#xff0c;fantastic-admin 作为一款功能强大的 Vue 中后台管理系统框架&#xff0c;简直是开发者的福音。本文将介绍 fantastic-admin 的基本信息、特点&#xff0c;以及如何快速上手和使用。 项目简介…

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践

7月12日&#xff0c;第13届PostgreSQL中国技术大会在杭州顺利举办&#xff0c;亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上&#xff0c;亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲&#xf…

AWS资源购买和使用:亚马逊云显示配额不足怎么解决

亚马逊云显示配额不足是许多AWS用户在使用云服务时可能遇到的常见问题。这种情况通常发生在用户试图启动新的EC2实例或扩展现有资源时&#xff0c;系统提示已达到特定资源类型的限制。本文中九河云将跟你们一起探讨这一问题的原因及其解决方案。 首先&#xff0c;了解AWS配额的…

最便宜的iPhone SE 4要来,配置爆炸但砍了灵魂

前几天乐视刚刚发布了「低配青春 AIR 版 iPhone SE 4」&#xff0c;电友们就坐不住了&#xff0c;纷纷问真 iPhone SE 4 究竟什么时候才能来。 阿红也去挖了一下情报&#xff0c;别说&#xff0c;还真在路上了。 众所周知&#xff0c;最近一代&#xff0c;也就是第三代 iPhone…

Liquibase 增加一列主键,自动生成 UUID:最佳实践与深度解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 自动生成 UUID UUID 是一种全局唯一的标识符&#xff0c;通常由 32 个十六进制数字组成&#xff0c;分为五组&#xff0c;形式如下&#xff1a; 123e4567-e89b-12d3-a456-426614174000在 Java 中&#xff0c;可以使…

从零开始写 Docker(十九)---增加 cgroup v2 支持

本文为从零开始写 Docker 系列第十九篇&#xff0c;添加对 cgroup v2 的支持。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#xff1a;深入理解 Docker 核心原理&#xff1a…

解锁未来安全:WT2003HP8芯片如何重塑智能电子锁的安全性与智能化体验

WT2003HP8混音芯片&#xff1a;智能电子锁的声音守护者 在当今这个追求智能化、便捷化的时代&#xff0c;智能电子锁作为智能家居的重要组成部分&#xff0c;正逐步改变着我们的生活方式。而WT2003HP8混音芯片&#xff0c;凭借其卓越的性能和广泛的应用潜力&#xff0c;在智能…

AFSim 仿真系统--任务处理器入门指南

任务处理器 任务处理器&#xff08;WSF_TASK_PROCESSOR&#xff09;是一个WSF处理器&#xff0c;它提供了检查轨迹管理器中的数据&#xff08;轨迹&#xff09;并对其采取行动的能力。这些行动包括&#xff1a; *向下属分配任务 *激活或停用传感器或干扰器 *开火武器 *操纵平台…

德国航空航天中心(DLR)利用元数据整理归纳Confluence

对于大型企业&#xff0c;在广阔的Confluence空间内找到信息&#xff0c;如同迷失在迷宫中。多年来&#xff0c;德国航空航天中心&#xff08;DLR&#xff09;依赖电子邮件和传统文件管理系统。在知识经理Andr Pliewischkies的领导下&#xff0c;公司引入了Confluence以减少信息…

Layui修改表格分页为英文

Layui修改表格分页为英文 1.前言2.Laypage属性 1.前言 主要记录初次使用Layui没有好好看官方文档踩坑&#xff0c;修改了源码才发现可以自定义 使用的Layui版本2.9.14 2.Laypage属性 Laypage属性中带的有自定义文本的属性 示例代码 table.render({.......page: {skipText: …

[米联客-安路飞龙DR1-FPSOC] SDK入门篇连载-09 PL AXI-GPIO实验

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

buu做题(9)

[MRCTF2020]PYWebsite 有个二维码 扫了一下啊二维码 function enc(code){hash hex_md5(code);return hash;}function validate(){var code document.getElementById("vcode").value;if (code ! ""){if(hex_md5(code) "0cd4da0223c0b280829dc3ea4…

【C语言报错已解决】“Undefined Reference”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在开发过程中&#xff0c;我们经常会遇到各种编译错误或运行时错误。其中&#xff0c;“Undefined Referenc…

JavaFX布局-AnchorPane

JavaFX布局-AnchorPane 常用属性padding 实现方式Javafxml 将子节点锚定到容器的边界上&#xff0c;指定子节点相对于 AnchorPane 的四个边界&#xff08;上、下、左、右&#xff09;的距离适合宽高固定的一些表单如果允许最大化&#xff0c;拖动大小&#xff0c;需要自己计算子…

(面试必看!)一些和多线程相关的面试考点

文章导读 引言考点1. CAS 指令&#xff08;重点&#xff09;一、什么是CAS二、CAS 的优点三、CAS 的缺点四、ABA问题五、相关面试题 考点2. 信号量&#xff08;semaphore&#xff09;一、基本概念二、信号量的主要操作三、信号量的应用四、相关面试题 考点3、CountDownLatch 类…