Hello,一只爱学习的鱼

  大学学习C++运算符重载的时候,老师出了一道“运算符重载+类”的综合练习题,让我们来一起看看吧!

  题目:  

  设计一个日期类Date,包括年、月、日等私有成员;

  要求实现基本运算:如一个日期加上天数,一个日期减去天数、两个日期相差天数。

  基本设计思路及要求:

  1.在Date类中设计如下重载运算符函数:

  Date operator+(int days); 返回一个日期加上一个天数得到的日期;

  Date operator-(int days); 返回一个日期减去一个天数得到的日期;

  int operator-(Date &b); 返回两日期相差的天数。

  2.在实现这些重载运算符函数调用以下私有成员函数:

  leap(int); 判断指定的年份是否为闰年;

  transDate(Date &); 将指定日期转换为从0年0月0日起的天数;

  transDay(int); 将指定的0年0月0日起的天数转换为对应的日期。

  3.在main( )中,实现日期的基本运算:

  (1).闰年与非闰年的判断,以及各月的天数的获得问题,解决办法可设置并引用二维数组;

  (2).日期基本问题的实现问题,解决办法是在Date类中设计重载运算符函数:Date operator+(int days)、Date operator-(int days)、int operator-(Date &b),同时调用以下私有成员函数leap(int)、transDate (Date &)、transDay (int)得以实现;

  (3).如何使输入的日期有效,如2011 13 34为无效日期,解决办法是在input()中设置判断条件if(month>12||month<1||day>day_tab[leap(year)][month-1]||year<=0),判断日期是否为有效日期。

  流程图:

  

  根据要求先写出类:

 1 #include <iostream>
2 using namespace std;  
3 bool datetime(int, int, int);    //使用自定义函数datetime判断输入的日期是否合法,合法返回1,不合法返回0
4 class Date {
5 public:
6 void input();
7 void output();
8 Date operator+(int days);
9 Date operator-(int days);
10 int operator-(Date& b);
11 private:
12 int leap(int);
13 int transDate(Date&);
14 int year, month, day;
15 }; 

  然后,完整代码,我写了317行。鉴于篇幅,我讲解重载运算符函数Date operator+(int days),获取完整代码请关注我的公众号(一只爱学习的鲤鱼),回复:1207运算符重载,即可。

 1 Date Date::operator+(int days) {
2 int y = this->year, m = this->month, d = this->day;
3 while ((leap(y) == 1 && transDate(*this) + days > 366 && days > 366) || (leap(!y) == 1 && transDate(*this) + days > 365) && days > 365)    //简化运算,当days>=365天,直接操作年份,没必要操作月份
4 {
5 y++;
6 if (leap(y) == 1)
7 days = days - 366;
8 else if (!leap(y) == 1)
9 days = days - 365;
10 }
11 continue_: while (((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) && (days > 31))    //使用了goto语句,当days<365天,操作月份,每轮对月份运算一次,直至days小于当月天数
12 || ((m == 4 || m == 6 || m == 9 || m == 11) && (days > 30))
13 || (m == 2 && days > 29 && leap(y)) || (m == 2 && days > 28 && !leap(y))) {
14 if (m == 1) {
15 m = 2; days = days - 31;    //月份自增,days减去当月的天数
16 goto continue_;
17 }
18 if (m == 2) {
19 if (leap(y)) { m = 3; days = days - 29; }
20 else { m = 3; days = days - 28; }
21 goto continue_;
22 }
23 if (m == 3) {
24 m = 4; days = days - 31;
25 goto continue_;
26 }
27 if (m == 4) {
28 m = 5; days = days - 30;
29 goto continue_;
30 }
31 if (m == 5) {
32 m = 6; days = days - 31;
33 goto continue_;
34 }
35 if (m == 6) {
36 m = 7; days = days - 30;
37 goto continue_;
38 }
39 if (m == 7) {
40 m = 8; days = days - 31;
41 goto continue_;
42 }
43 if (m == 8) {
44 m = 9; days = days - 31;
45 goto continue_;
46 }
47 if (m == 9) {
48 m = 10; days = days - 30;
49 goto continue_;
50 }
51 if (m == 10) {
52 m = 11; days = days - 31;
53 goto continue_;
54 }
55 if (m == 11) {
56 m = 12; days = days - 30;
57 goto continue_;
58 }
59 if (m == 12) {
60 y++; m = 1; days = days - 31;
61 goto continue_;
62 }
63 }
64 if (m == 1 && d + days > 31) { m = 2; d = d + days - 31; }    //最后,操作号数
65 else if (m == 2 && d + days > 29 && leap(y)) { m = 3; d = d + days - 29; }
66 else if (m == 2 && d + days > 28 && !leap(y)) { m = 3; d = d + days - 28; }
67 else if (m == 3 && d + days > 31) { m = 4; d = d + days - 31; }
68 else if (m == 4 && d + days > 30) { m = 5; d = d + days - 30; }
69 else if (m == 5 && d + days > 31) { m = 6; d = d + days - 31; }
70 else if (m == 6 && d + days > 30) { m = 7; d = d + days - 30; }
71 else if (m == 7 && d + days > 31) { m = 8; d = d + days - 31; }
72 else if (m == 8 && d + days > 31) { m = 9; d = d + days - 31; }
73 else if (m == 9 && d + days > 30) { m = 10; d = d + days - 30; }
74 else if (m == 10 && d + days > 31) { m = 11; d = d + days - 31; }
75 else if (m == 11 && d + days > 30) { m = 12; d = d + days - 30; }
76 else if (m == 12 && d + days > 31) { y++; m = 1; d = d + days - 31; }    //注意!this->day加days超过了31,年份要自增
77 else d = d + days;
78 this->month = m;
79 this->year = y;
80 this->day = d;
81 return *this;    //返回this对象
82 }

  代码注释,写明我的编程思路和在编程中遇到的坑。(附:养成写代码注释,也是一种好习惯哦!)

  下面是我在Visual Studio 2019的运行结果:

  

  关注我的公众号(一只爱学习的鲤鱼)

  

  回复:1207运算符重载。即可得到运算符重载+日期类Date.cpp文件

  

  最后,也欢迎C++大佬,在评论区或公众号提出其他的解题思路,我们下期再见。

运算符重载+日期类Date的更多相关文章

  1. C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...

  2. 日期类 Date

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  3. C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  5. C# 类型运算符重载在类继承中的调用测试

    这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA { } class CB : CA{ } class CC : CB{ } } void Test(CA oa){//CATest ...

  6. C++学习6-面向对象编程基础(运算符重载、类的派生与继承、命名空间)

    运算符重载 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.重载的运算符是遵循函数重载的选择原则,根据不同类型或不同参数来选择不同的重载运算符. 运 ...

  7. 日期类Date

    Java在日期类中封装了有关日期和时间的信息,用户可以通过调用相应的方法来获取系统时间或设置日期和时间.Date类中有很多方法在JDK1.0公布后已经过时了,在8.3中我们将介绍JDK1.0中新加的用 ...

  8. Java基础——日期类Date

    一.概述 date代表一个特定的时间,精确到毫秒 二.构造方法 方法名 说明 public Date() 分配一个Date对象,并初始化,以便它代表被分配的时间,精确到毫秒 public Date(l ...

  9. Java:日期类Date与Calendar

    Timestamp类型与日期类型之间的转化? Timestamp timestamp = Timestamp.valueOf("2017-03-17 07:00:00"); Dat ...

随机推荐

  1. 洛谷 P4555 [国家集训队]最长双回文串

    链接: P4555 题意: 在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大. 分析: 直接使用马拉车算法求出每个点扩展的回文串.如果枚举两个回文串显然会超时,我们考虑切割一个长串 ...

  2. 并发编程从零开始(十二)-Lock与Condition

    并发编程从零开始(十二)-Lock与Condition 8 Lock与Condition 8.1 互斥锁 8.1.1 锁的可重入性 "可重入锁"是指当一个线程调用 object.l ...

  3. 平分的直线 牛客网 程序员面试金典 C++ Python

    平分的直线 牛客网 程序员面试金典 C++ Python 题目描述 在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分.假定正方形的上下两条边与x轴平行. 给定两个vecotrA和B ...

  4. Device /dev/sdb excluded by a filter

    原因是添加的磁盘是在另一个虚拟机中新建的,已经有了分区表,现在的虚拟机并不能识别磁盘的分区表,运行parted命令重做分区表,中途需要输入三次命令(mklabel msdos -> yes-&g ...

  5. BugKu之备份是个好习惯

    题目:备份是个好习惯 思路分析 打开题目,看到一个字符串. 联系到题目,就猜到肯定是源代码泄露,用工具扫一下,发现了index.php.bak,验证了我的猜想,下载下来看看. <?php /** ...

  6. 八. Go并发编程--errGroup

    一. 前言 了解 sync.WaitGroup的用法都知道 一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问 ...

  7. 电脑变WIFI:建立虚拟共享WIFI热点可查看WIFI密码windows中使用bat批处理命令提示符cmd创建教程含工具

    台式机也可支持移动热点,Win10却提示"我们无法设置移动热点",今天我们就另辟蹊径来调教它. ​​建立和开启虚拟WIFI共享网络 Windows 7操作系统及以后支持承载网络,可 ...

  8. sql sever 约束

    SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束 1.Primary Key约束在表中常有一列或多列的组合, ...

  9. 【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)

    问题描述 PowerShell 脚本调用Azure REST API, 但是所有的API都需要进行权限验证.要在请求的Header部分带上Authorization参数,并用来对List Resour ...

  10. java:字符串与数字的转换

    各种数字类型转换成字符串型 int i =8; String s =Integer.toString(i);// String g =String.valueOf(i); // 其中 value 为任 ...