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. 『学了就忘』Linux基础 — 8、虚拟机网络模式说明

    目录 1.虚拟机网卡 2.网络连接模式对应工作的网卡 3.桥接模式说明 4.补充说明 这篇主要总结一下虚拟机网络配置中桥接模式.NAT模式和仅主机模式的区别. 打开VMware,选中虚拟机,点击网络适 ...

  2. CSS学习(三)特指度和层叠

    一.特指度 特制度的一般形式是0,0,0,0 行内样式,第一位的特指度加一 id选择符,第二位的特指度加一 类选择符.属性选择符.伪类,第三位的特指度加一 元素选择符.伪元素,第四位的特指度加一 特指 ...

  3. sqlalchemy insert on duplicate update

    sqlalchemy insert on duplicate update from sqlalchemy.dialects.mysql import insert insert_stmt = ins ...

  4. celery kill task

    from celery.task.control import revokerevoke(task_id, terminate=True) https://stackoverflow.com/ques ...

  5. django improperly configured

    ImproperlyConfigured: You must either define the environment variable DJANGO_SETTINGS_MODULE or call ...

  6. 分布式链路追踪之Spring Cloud Sleuth+Zipkin最全教程!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第九篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  7. 搜索系统核心技术概述【1.5w字长文】

    前排提示:本文为综述性文章,梳理搜索相关技术,如寻求前沿应用可简读或略过 搜索引擎介绍 搜索引擎(Search Engine),狭义来讲是基于软件技术开发的互联网数据查询系统,用户通过搜索引擎查询所需 ...

  8. [luogu1390]公约数的和

    1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 2000005 4 long long n,ans,f[N],vi ...

  9. [atAGC048E]Strange Relation

    考虑对于$\{a_{i+1},...,a_{n}\}$,在其前面插入$a_{i}$对$x_{i}$的影响(不考虑$a_{1}$到$a_{i-1}$): 1.$x_{i}=0$,因为其前面没有数字了 2 ...

  10. [bzoj1677]求和

    dp,用f[i]表示i划分的方案,直接枚举最后一个数是错误的,因为会导致c重复计数,然后正解十分神奇--当i为奇数,那么分解中一定有1,因此f[i]=f[i-1]当i为偶数若有1,同样转移到f[i-1 ...