C嘎嘎实现日期计算器

本篇文章带大家实现项目:日期计算器,文章内容可能会偏多请耐心观看

建一个Date类

现在点h的文件中建类

class Date

{

public:

//略

private:

int _year;

int _month;

int _day;

}

那么以上就是本篇文章所要讲的项目的类,当然这是最简单的部分,相信大家都可以做到。那么我们来看下面的部分。

初始化部分

首先是初始化,我们现在类中声明一下初始化

Date(int year = 1900, int month = 1, int day = 1);

然后来到点cpp文件中写初始化的部分

Date ::Date(int year = 1900, int month = 1, int day = 1)

{
      _year = year;

      _month = month;

      _day = day;

}

那么,我现在这里解释一下为什么是_变量名 = 变量名,因为一会我们会在test.cpp文件中实例化一个对象,而实例化的对象里的年月日就是类中声明的_year、_month、_day,而year,month, day是形参,用于接收实参,假设没有实参传过来时,那么会将形参的值(缺省值)给到_year、_month、_day完成初始化

接下来我们要来安排一下每个月的天数,除了二月外其他几个月的天数不是30天就是31天,而这个二月是个特殊月,闰年的二月是29天,平年是28天。那么闰年这里我们只需要用上条件分支即可,那么就是除二月外的其他几个月该怎么做?也许,已经有小伙伴已经想到了方法——switch语句或if -else if语句,那么能想到这两个的小伙伴很不错,但是以上这两种方法比较麻烦,这里我给大家介绍一种新方法

int monthday[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

我给大家讲一下这个思路,首先我们一年有12个月,而数组的下标是从0开始计数并且数组的最后一个元素的下标为n - 1(也就是12),,因此我们只需要定义长度为13 的数组即可,并且用-1填充monthday[0]的空位,剩下的下标就与我们的月份对上了,我们往数组里存放包含一年所有月的天数,并且使用分支判断是否为闰年,month 为 2,且为闰年则返回29,反之直接返回数组的元素即可。

那么基本工作已经做完了,我们来做一下一些和日期相关的加减操作

与日期相关的部分操作

首先日期相加无意义,但是日期+天数是有意的,也许这里会有小伙伴感到疑惑,日期相加有时候不是会超出当前这个月的最大天数吗?是的,但是别忘了我们还有月呀,超出当前月的最大天数时可以向月进一。反之,相减也是如此。但是日期与日期相乘/除或日期与天数相乘/除是无意义的。

日期与天数相加操作

思路分析07/18

日期加上天数后进行循环往复地判断大于该月天数后month进1,加完后判断month是否为13,如果是则年份进1,并且月份为下一年的一月,跳出判断后进行_day减去当前月份的天数,反之,则直接进行_day与月份天数相减

那么这个是+=部分,+的部分逻辑与+=的部分相同,一会大家看源代码即可

日期与天数相减操作

思路分析1603

那么这里也是一样,在日期与天数相减后小于0进入循环,向月份借一,注意应先判断月份是否为零的情况,如果为0则年份减减,且month为前一年的12月。那么这里我也解释一下为什么要先判断月份为零而不是先_day+=GetMonthDay,那么我们可以假设month此刻是1减后为0,那么_day+=GetMonthDay的时候会从该函数中的数组里找到下标为0的元素(也就是-1),从而导致程序可能会出现一些bug

那么这个是-=部分,-的部分逻辑与-=的部分相同,一会大家看源代码即可

前置加加与后置加加

那么这里的代码大家看一下就好,没什么难度

日期与日期的相减

那么首先这里有几个参数?大家先思考一下

答案是两个参数,由于我们先前已经做好了相减部分的代码,那么这里的两个参数谁大谁小我们无法确定,那么我们可以先使用假设法,当我们的假设不成立时再切换。 那么也许会有同学问这个flag有何用呢?这个flag适用于解决两个日期相减后可能会出现的负数情况,而这个n则是插值

日期与日期之间的大小关系比较部分

那么这里大家也看到了,数量有些多,但是代码部分却都是很简单的那种,因此我不会细讲,相信在看这篇文章的同学都是有水平的,当然如果有不懂的依旧可以私信问我。

那么这段代码相信大家都可以看得懂,那么这里的话我就不进行讲解了

那么剩下的几个大家复用一下即可

项目的修整部分

以上的代码,可以说,大体上已经可以了,但是还缺少了输入输出部分

那么这两个是输入和输出部分的声明

cout是在ostream中,因此使用的类型应该是ostream,同理,cin在istream中,因此使用istream即可

注意此处的输入和输出还需要在类中加入friend声明

此外,当我们输入时可能会手滑,从而输入一些非法日期,那么如何判断呢?

那么这里就不介绍了因为都比较简单。

文章总结

1.整个项目的思路梳理:创建类----->初始化类中声明的变量------>每个月的天数以及是否论年的二月的天数--------->日期与天数上的加减和日期的大小比较------->日期减日期-------->输入输出(多次)------->代码修整:判断是否存在什么输入非法情况

2.本篇文章与c语言中的项目制作类似,多处通过类去调用点h和点cpp文件中的函数

3.函数复用:通过已经利用存在的函数,对其进行取反等操作

源代码获取地址

my warehouse: 一个程序小白的成长经历

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值