c++类和对象重要巩固练习-------日期类对象

news2024/11/16 9:35:18

这是对于类和对象的练习篇,用c++来模拟完成日期计算器。

这其中需要我们完成:

  1. 日期 +- 天数后  得到的新日期 
  2. 日期 - 日期  得到相差的天数
  3. 比较日期的大小
  4. 等 .....
  5. 具体如下头文件类中的成员函数
    #pragma once
    #include<iostream>
    using namespace std;
    #include<assert.h>
    #include<math.h>
    
    
    class Date
    
    {
    
    public:
    
    	// 获取某年某月的天数
    
    	int GetMonthDay(int year, int month);
    
    	// 全缺省的  构造函数
    
    	Date(int year = 1900, int month = 1, int day = 1)
    	{
    		if (month <= 12 && month > 0 && day <= GetMonthDay(year, month))
    		{
    			_year = year;
    			_month = month;
    			_day = day;
    		}
    		else
    		{
    			cout << "非法日期" << endl;
    			assert(0);
    		}
    	}
    	// 拷贝构造函数  // d2(d1)
    
    	Date(const Date& d)
    	{
    		_year = d._year;
    		_month = d._month;
    		_day = d._day;
    	}
    	
    	void Print()
    	{
    		cout << _year << ' ' << _month << ' ' << _day << endl;
    	}
    
    	// 赋值运算符重载  // d2 = d3 -> d2.operator=(&d2, d3)
    
    
    	Date& operator=(const Date& d)
    	{
    		if (this != &d)//比较地址(比较地址比较简单),减少 d1=d1 这种赋值情况
    		{
    			_year = d._year;
    			_month = d._month;
    			_day = d._day;
    		}
    
    		return *this;
    	}
    
    
    	// 日期+=天数
    
    	Date& operator+=(int day);
    
    	// 日期+天数
    
    	Date operator+(int day);
    
    	// 日期-天数
    
    	Date operator-(int day);
    
    	// 日期-=天数
    
    	Date& operator-=(int day);
    
    	// 前置++
    
    	Date& operator++();
    
    	// 后置++
    
    	Date operator++(int);
    
    	// 后置--
    
    	Date operator--(int);
    
    
    	// 前置--
    
    	Date& operator--();
    
    
    	// >运算符重载
    
    	bool operator>(const Date& d);
    
    	// ==运算符重载
    
    	bool operator==(const Date& d);
    
    
    
    	// >=运算符重载
    
    	bool operator >= (const Date& d);
    
    
    
    	// <运算符重载
    
    	bool operator < (const Date& d);
    
    
    
    	// <=运算符重载
    
    	bool operator <= (const Date& d);
    
    
    
    	// !=运算符重载
    
    	bool operator != (const Date& d);
    
    
    
    	// 日期-日期 返回天数
    
    	int operator-(const Date& d);
    
    private:
    
    	int _year;
    
    	int _month;
    
    	int _day;
    
    };

实现过程  (一些实现的细节已经注释):

  1.  日期类的 += 日期  
    int Date::GetMonthDay(int year, int month)
    {
    
    	static int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//因为该数组会被经常的调用所以可以直接放到静态区
    	if (month == 2 && year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//对2月闰年单独讨论
    	{
    		return 29;
    	}
    	else
    	{
    		return arr[month];
    	}
    }
    
    
    //返回 引用可以减少拷贝的损耗
    //其中返回 Date 类型还能帮助我们实现连续操作
    Date& Date::operator+=(int day)
    {
    	if (day < 0)//为了当传进来是-的天数也能使用
    	{
    		*this -= (-day);//-= 在后面实现
    		return *this;
    	}
    	_day += day;//用进位的方法来算,先加上天数
    	while(_day > GetMonthDay(_year,_month))//如果天数大于该月的月数就进位
    	{
    		_day -= GetMonthDay(_year, _month);//在进位后就需要把上月的天数剪掉
    
    		//注意这些应该写在后面
    		_month++;
    		if (_month > 12)//当月到了12时也要进位
    		{
    			_month = 1;
    			_year++;
    		}
    	}
    	return *this;
    }
  2. 日期类的 + 日期
    Date Date::operator+(int day)
    {
    	//我们在使用 + 时有时是不需要去改变值的 如  a + 2 ; a 并没有改变
    	Date tmp(*this);//创建一个临时变量
    	tmp += day;//对临时变量 += 
    	return tmp;//返回临时变量即可
    
    	//下面其实是一些重复的动作我们可以通过再次调用+=
    	//tmp._day += day;
    	//while (tmp._day > GetMonthDay(_year, _month))
    	//{
    	//	tmp._day -= GetMonthDay(_year, _month);
    
    	//	//注意这些应该写在后面
    	//	tmp._month++;
    	//	if (tmp._month > 12)
    	//	{
    	//		tmp._month = 1;
    	//		tmp._year++;
    	//	}
    	//}
    	//return tmp;
    }
    
  3. 日期类的 -= 日期

    Date& Date::operator-=(int day)
    {
    	if (day < 0)//同理当day < 0 时就相当于 += 
    	{
    		*this += (-day);
    		return *this;
    	}
    	_day -= day;//先减去一定的天数
    	while (_day <= 0)//不断的借位,只到借到正常的天数
    	{
    		_month--;
    		if (_month < 1)
    		{
    			_month = 12;
    			_year--;
    		}
    		//注意此时day += 应该写在后面 因为是要向前借位
    		_day += GetMonthDay(_year, _month);//加上前一个月的月份,接一位
    	}
    	return *this;
    }
  4. 日期类的-天数

    Date Date::operator-(int day)//和 + 一样直接通过临时变量的传递即可
    {
    
    	Date tmp(*this);
    	tmp -= day;
    	return tmp;
    
    }
  5. 日期类的 ++

    1. 注意此时是要分 前置 和 后置

    2. 对于前置来说 我们就正常的写 运算符重载函数即可

    3. 而 对于 后置来说 写运算符重载函数时 需要一个参数来占位(与前置形成重载函数)

    4. 具体源码如下 

      Date& Date::operator++()//前置 ++ 
      {
      	*this += 1;//直接++即可
      	return *this;
      }
      
      
      Date Date::operator++(int) // 后置 ++ 通过一个参数来占位 构成函数重载来区分
      {
      	Date tmp(*this);// 因为是后置 ++ 所以用临时变量传回去之前前的值
      	*this += 1;//实则已经改变了
      	return tmp;
      }
  6. 日期类的 --

    1. 同样分前置和后置

    2. 就不过多赘述了,和++一样

    3. 具体如下:

      Date& Date::operator--()//前置
      {
      	*this -= 1;
      	return *this;
      }
      
      Date Date::operator--(int)//后置
      {
      	Date tmp(*this);
      	*this -= 1;
      	return tmp;
      }
  7. 日期类的比较 >   >=  ==   !=     <    < =  (总体来说较为简单

    1. 对于这类比较性的我们其实可以先写出 < 、==  /  >、==   其余的复用即可

    2. 具体如下

      ​
      bool Date::operator>(const Date& d)
      {
      	if (_year < d._year)//先判断是否小于,若否则是  等于(继续判断)或 大于(直接结束)
      	{
      		return false;
      	}
      	else if (_year == d._year && _month < d._month)//同理
      	{
      		return false;
      	}
      	else if (_year == d._year && _month == d._month && _day < d._day)
      	{
      		return false;
      	}
      	else
      	{
      		return true;
      	}
      }
      
      bool Date::operator==(const Date& d)//简单的判断
      {
      	return (_year == d._year && _month == d._month && _day == d._day);
      }
      
      
      bool Date::operator>=(const Date& d)//复用即可
      {
      	return *this > d || *this == d;
      
          //可以直接引用 > 和 ==
      	//if (_year < d._year)
      	//{
      	//	return false;
      	//}
      	//else if (_year == d._year && _month < d._month)
      	//{
      	//	return false;
      	//}
      	//else if (_year == d._year && _month == d._month && _day < d._day)
      	//{
      	//	return false;
      	//}
      	//else
      	//{
      	//	return true;
      	//}
      }
      
      bool Date::operator <= (const Date& d)
      {
      	return !(*this > d);
      }
      
      bool Date::operator < (const Date& d)
      {
      	return !(*this >= d);
      }
      
      bool Date::operator != (const Date& d)
      {
      	return !(*this == d);
      }
      
      ​
  8. 日期 - 日期

    1. 对于日期 - 日期 我们用遍历法来实现

    2. 具体如下

      int Date::operator-(const Date& d)
      {
      	int tag = 1;
      	Date Max(*this);//先确立大的为*this
      	Date Min(d);//把 d 看成小的
      	if (Max < Min)//如果 Max < Min 就交换
      	{
      		Min = *this;
      		Max = d;
      		tag = -1;// 交换后表示前面的值要小于后面的值 , 所以把 tag 置为负的
      	}
      	int count = 0;
      	while (Min < Max)//看看相差多少 ,逐一相加
      	{
      		count++;
      		++Min;
      	}
      	return count * tag;
      }

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

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

相关文章

【UE】简单实现屏幕UI定位

【UE】简单实现屏幕UI定位三维坐标方法 实现效果 屏幕空间定位 场景空间定位 一般实现兴趣点&#xff08;POI&#xff09;有两种实现方法&#xff0c;场景空间UI定位和屏幕空间UI定位。 场景空间定位&#xff1a;UI类似实例模型&#xff0c;位置和尺寸是相对于场景不变。大多…

Laravel 知识整合 1 路由

Laravel是一种基于php的MVC web开发框架 php artisan make:controller NAME//创建一个名字为name的controller路由&#xff1a;routes/web.php Route::get(/students,StudentControllerindex); 控制器&#xff1a;app/HTTP/Controllers&#xff08;可以直接用命令行生成&…

SSM框架学习-依赖注入、自动装配、暴力反射

1. 依赖注入 1.1 引用类型 注入引用类型 一种是默认按照类型装配 一种是如果有相同类型的bean采用按bean名称装配 但是在写的过程中Qualifier前面必须写上Autowired 也就是必须依赖Autowired //Autowired&#xff1a;注入引用类型&#xff0c;自动装配模式&#xff0c;默认按类…

一场面试下来,狂飙 Framework底层原理

近期有位Android 开发的朋友在吐槽说&#xff1a;现在的招聘信息网站是假的吧&#xff0c;我都怀疑一些公司的人事在冲他们的KPI&#xff0c;三个月了&#xff0c;简历投了上百份&#xff0c;结果收到回应的才个位数&#xff0c;去面试还一套Framework底层原理面试题狂炸…… 面…

178_技巧_Power BI 动态排名多项展示

178_技巧_Power BI 动态排名多项展示 一、背景 在 Power BI 中做排名矩阵时&#xff0c;我们经常遇到同一维度下&#xff0c;多项展示排名的问题。类似这样的排名矩阵&#xff0c;排名的名次不会太多&#xff0c;但是同一维度下会有多项同时展示排名&#xff0c;并且还要满足…

树结构 数据可视化

这边有个 树结构数据&#xff0c;想做一个可视化展示的需求&#xff1b;首先想到的是 python pyecharts, 一直传说 python 做数据可视化 一把梭&#xff1b; pyecharts 在线实例展示 pyecharts 官网 当看到上面的 示例 后&#xff0c;这不就我想找的嘛&#xff01;哈哈 随后 找…

web前端 --- CSS(02) -- 样式修饰

CSS本质是用来修饰HTML标签的 常用CSS属性 &#xff08;1&#xff09;字体及文本属性 文字相关效果 属性含义font字体及其属性&#xff08;复合属性&#xff0c;不建议直接使用&#xff09;font-family设置文本字体&#xff0c;电脑中存在字体font-size字体大小font-weight字…

PPT如何使用基础功能?

文章目录 0.引言1.菜单栏 0.引言 因科研办公等多场景需要进行汇报展示&#xff0c;笔者对PPT进行了学习&#xff0c;通过《PPT 2016高效办公实战应用与技巧大全666招》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对软件界面基础功能进行阐述。    1.菜单…

[光源频闪] Basler相机光源频闪设置操作说明

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

2019年下半年软件设计师下午试题

【试题四】0-1背包问题 阅读下列说明和C代码&#xff0c;回答问题1至问题3。 【说明】 0-1背包问题定义为:给定i个物品的价值v[1…i]、小重量w[1...i]和背包容量T&#xff0c;每个物品装到背包里或者不装到背包里。求最优的装包方案&#xff0c;使得所得到的价值最大。 0-1…

程序进制换算

进制数介绍 一、进制介绍 二进制 &#xff1a;0或1&#xff0c;满2进1&#xff0c;以0B或者0b开头&#xff0c;如 0b1101 八进制&#xff1a;0-7&#xff0c;满8进1&#xff0c;&#xff0c;以0开头&#xff0c;如0234 十进制&#xff1a;0-9&#xff0c;满10进1&#xff0c;…

MVC分部视图的使用:Html.Partial/RenderPartial,Html.Action/RenderAction,RenderPage

ASP.NET MVC 里的部分视图&#xff0c;相当于 Web Form 里的 User Control。我们的页面往往会有许多重用的地方&#xff0c;可以进行封装重用。 使用部分视图有以下优点&#xff1a; 1. 可以简写代码。 2. 页面代码更加清晰、更好维护。 在视图里有多种方法可以 加载部分视图&a…

运营-10.算法分发

定义&#xff1a; 通过对信息的自动过滤和分流&#xff0c;从而实现对不同用户的个性化推荐 算法分发三要素 算法的前提 算法分发的前提&#xff1a;了解用户的喜好&#xff0c;给用户做画像。 用户画像是根据用户 基本属性 、 社会属性 、 行为属性 和 消费属性 等真实数 据信…

流式作业如何保证真正的精准一次消费

checkpoint 两阶段提交和WAL 真的是神&#xff01;&#xff01;&#xff01;&#xff01; 彻底解决了重复消费问题!! 状态一致性 当在分布式系统中引入状态时&#xff0c;自然也引入了一致性问题。一致性实际上是"正确性级别"的另一种说法&#xff0c;也就是说在成功…

【美化命令行教程】

目录 下载字体打开Teminal设置 美化powershell注意&#xff1a;主题路径powershell 自动提示看效果 美化git看效果 下载字体 防止乱码一定要下载下面的字体并安装 下载作者推荐MesloLGM NF字体&#xff0c;点此下载 打开Teminal设置 修改Teminal配置文件json "font&q…

数组存储与指针学习笔记(二)枚举类型、常量与变量

嵌入式C语言学习进阶系列文章 GUN C编译器拓展语法学习笔记(一&#xff09;GNU C特殊语法部分详解 GUN C编译器拓展语法学习笔记(二&#xff09;属性声明 GUN C编译器拓展语法学习笔记(三&#xff09;内联函数、内建函数与可变参数宏 数组存储与指针学习笔记(一&#xff09;数…

听劝 千万不要盲目自学网络安全

听劝 不要什么盲目的学网络安全。 一&#xff0c;怎么入门&#xff1f; 1、Web 安全相关概念&#xff08;2 周&#xff09; 了解网络安全相关法律法规 熟悉基本概念&#xff08;SQL 注入、上传、XSS、CSRF、一句话木马等&#xff09;。 通过关键字&#xff08;SQL 注入、…

人工智能简历-计算机视觉简历

前言 很多粉丝私我&#xff0c;说面试的事情。 这玩意我不理解&#xff0c;因为如果是计算机科班出身&#xff0c;计算机行业我觉得闭着眼睛找。 简历这玩意我真不会。。。 分享2个东西给大家。 第一个是 出国/在国外找实习/外企的英文简历。 比较流行的是一页。 第二个…

高速动车组全谱系图解

很多人认为中国高速铁路起源于2004年以来的技术引进&#xff0c;却不知道中国第一条高铁是1999年开工、2003年建成的秦沈客专&#xff1b;动车组的研制则更早&#xff0c;“蓝箭”、“中原之星”、“中华之星”都是鼎鼎大名。毫无疑问&#xff0c;2004年以来的引进技术&#xf…

SPI配置

I/O配置 主输出、从输入&#xff08;MOSI&#xff09; 主出从入&#xff08;MOSI &#xff09;引脚是主器件的输出和从器件的输入&#xff0c;用于主器件到从器件的串行数据传输。当SPI 配置为主器件时&#xff0c;该引脚为输出&#xff0c;当 SPI 配置为从器件时&#xff0c;该…