c++----日期类

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

思想概括

        其实实现日期类并不是什么难事。如果用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号博客: 博客的代码以及日常练习

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值