首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【c++】简单的日期计算器

【c++】简单的日期计算器

作者头像
用户11029103
发布于 2024-04-02 02:00:23
发布于 2024-04-02 02:00:23
27700
代码可运行
举报
文章被收录于专栏:技术学习技术学习
运行总次数:0
代码可运行

头文件声明函数

头文件声明所有函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma once
#include<iostream>

using namespace std;

class Date
{
public:
	int GetMonthDay(int year, int month)
	{
		static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };
		int day = days[month];
		if (month == 2
			&& ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
		{
			day += 1;
		}
		return day;
	}
	// 全缺省的构造函数
	Date(int year = 1, int month = 1, int day = 1);
	// 拷贝构造函数
 // d2(d1)
	Date(const Date& d);

	// 赋值运算符重载
    // d2 = d3 -> d2.operator=(&d2, d3)
	Date& operator=(const Date& d);
	// 析构函数
	~Date();
	// 日期+=天数
	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);
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

函数的实现

第一个函数,获取某月天数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Date
{
public:
	int GetMonthDay(int year, int month)
	{
		static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };
		int day = days[month];
		if (month == 2
			&& ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
		{
			day += 1;
		}
		return day;
	}

为了按照月的月份直接访问数组,我们设置大小为13,由于要进行多次访问,我们可以将数组变量设置在全局

如果是闰年,则二月为29天,返回某个月的天数

1.全缺省默认构造函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date::Date(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}

在头文件进行缺省,源文件不需要

2.拷贝构造函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date::Date(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
}
3.七个个运算符重载

这里总共有七个运算符,除了赋值运算符外,我们只需要得到特殊的两个就可以简单的写出另外四个函数

首先,的重载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool Date::operator==(const Date& d)
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}

我们再写一个<的重载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool Date::operator<(const Date& d)
{
	if (_year < d._year)
	{
		return true;
	}
	else if (_year == d._year)
	{
		if (_month < d._month)
		{
			return true;
		}
		else if (_month == d._month)
		{
			if (_day < d._day)
			{
				return true;
			}
		}
	}

	return false;
}

按照年月日逐次判断

上面两个完成后,其余的就很简单了

小于等于,就是小于或者等于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool Date::operator <= (const Date& d)
{
	return *this < d || *this == d;
}

直接使用小于和等于的重载

大于,即为不小于等于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool Date::operator>(const Date& d)
{
	return !(*this <= d);
}

大于等于,即为不小于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool Date::operator >= (const Date& d)
{
	return !(*this < d);
}

最后一个不等于也十分简单了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool Date::operator != (const Date& d)
{
	return !(*this == d);
}

赋值运算符重载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date& Date::operator=(const Date& d)
{
	if (this != &d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	return *this;
}
4.日期计算函数

自身增加天数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date& Date::operator+=(int day)
{
	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		++_month;
		if (_month == 13)
		{
			++_year;
			_month = 1;
		}
	}

	return *this;
}

如果天数超过某个月,则天数减去当前这个月,让月份增加,如果月数等于13了,则年进一,月份重置为1月

有了加等,实现加就很简单了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date Date::operator+(int day)
{
	Date tmp = *this;
	tmp += day;

	return tmp;
}

这两个有什么区别呢??

这两个函数都是Date类的成员函数,用于对日期进行增加天数的操作,但它们在用法和效果上有所不同。

Date& Date::operator+=(int day)

这个函数重载了+=运算符,允许你直接在当前对象上增加天数。它会修改调用它的对象本身,并返回修改后对象的引用。

特点

  • 直接修改:它修改调用对象的状态,即增加的天数直接反映在原对象上
  • 返回引用:返回调用它的对象的引用,允许链式操作

用法示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date d1(2020, 3, 30); // 假设是2020年3月30日
d1 += 3; // 在d1上增加3天
// d1现在是2020年4月2日

Date Date::operator+(int day)

这个函数重载了+运算符,允许你在一个临时对象上增加天数,而不改变原始对象。它通过创建一个当前对象的副本,然后在这个副本上应用+=操作,最后返回这个修改后的副本

特点

  • 不直接修改:它不会修改原始调用对象的状态,而是返回一个新的修改后的对象。
  • 返回对象:返回一个新的Date对象,这个对象是在原对象基础上增加天数后的结果。

用法示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date d2(2020, 3, 30); // 假设是2020年3月30日
Date d3 = d2 + 3; // 在d2的基础上增加3天,但d2本身不变
// d2仍然是2020年3月30日
// d3是2020年4月2日
  • operator+=是一个修改原对象并返回其引用的成员函数,用于实现“就地修改”。
  • operator+是一个返回新对象的成员函数,它在不修改原对象的情况下返回增加天数后的新日期对象。

我们现在是加等嵌套在加里面,如果反过来呢?

对比我们能发现,两种加法都要创建一个新的变量,效果相同,但是加等,右边复用加的时候又创建对象,对比左边效率降低,所以用加复用加等效果更好

同理完成日期的减等和减

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date& Date::operator-=(int day)
{
	_day -= day;
	while (_day <= 0)
	{
		--_month;
		if (_month == 0)
		{
			--_year;
			_month = 12;
		}

		_day += GetMonthDay(_year, _month);
	}

	return *this;
}
Date Date::operator-(int day)
{
	Date tmp = *this;
	tmp -= day;

	return tmp;
}
5.前后置加加减减

这里我们已经上篇文章讲解过了,直接进行代码的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date& Date::operator++()
{
	_day += 1;
	return *this;
}
Date Date::operator++(int)
{
	Date tmp(*this);
	_day += 1;
	return tmp;
}
Date& Date::operator--()
{
	_day -= 1;
	return *this;
}
Date Date::operator--(int)
{
	Date tmp(*this);
	_day -= 1;
	return tmp;
}
6.两个对象直接相减

两个对象直接相减得到相差的日期天数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int Date::operator-(const Date& d)
{
	int flag = 1;
	Date max = *this;
	Date min = d;

	if (*this < d)
	{
		int flag = -1;
		max = d;
		min = *this;
	}

	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}

	return n * flag;
}

这个实现逻辑首先确定哪个日期较大,然后不断将较小的日期递增,直到它与较大的日期相等,过程中累计递增的天数,最终返回这个天数。如果初始的第一个日期小于第二个日期,返回的天数会是负值

让我们分析一下代码的关键部分:

  1. 确定日期大小:代码首先比较两个日期,确保max总是较大的日期,而min是较小的日期。flag变量用于记录原始日期的相对顺序,如果需要反转(即第一个日期小于第二个日期),flag会被设置为-1
  2. 计算天数差:通过一个循环,每次将min日期递增一天(使用operator++),直到min等于max。每次递增都会将n加1,n用于记录两个日期之间相差的天数
  3. 返回结果:最后,返回累计的天数n乘以flag。如果flag-1,表示第一个日期实际上是小于第二个日期的,因此返回负值

本节内容到此结束,感谢大家阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
MySQL 基础知识笔记 第04期:分组查询和聚集函数
这一节内容,来通过一张测试表,进行 MySQL 分组查询和聚集函数的练习。 1 数据准备 建表及数据准备,以便后面 SQL 练习: use yzl; /* 使用yzl这个database */ drop table if exists student_info; /* 如果表student_info存在则删除表student_info */ CREATE TABLE `student_info` ( /* 创建表student_info */ `id` int(11) NOT NULL auto_i
数据库交流
2022/04/25
4820
MySQL 基础知识笔记 第04期:分组查询和聚集函数
懒办法1篇文10分钟快速入门MySQL增删查改
作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,InfoQ签约作者,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。
1_bit
2022/01/06
3000
懒办法1篇文10分钟快速入门MySQL增删查改
Mysql增删改查sql语句练习
Mysql增删改查sql语句练习 关于数据库的一些操作: 进入mysql 命令行: mysql -uroot –p 查看所有数据库: show databases; 创建数据库: create database wg charset utf8; 删除数据库: drop database wg; 选择数据库: use databases; 查看所有表: show tables; 查看创建数据库的语句:show create database databasename; 查看创建表的语句:show create table tablename; 查看表结构:desc tablename; 增: mysql> use wg; mysql> create table students( id int auto_increment primary key,name varchar(10) not null,sex varchar(12),address varchar(50),phone int not null unique); #自增长 auto_increment #非空 not null #默认值 default ‘xx’ #唯一 unique #指定字符集 charset #主键 primary key mysql> create table scores(id int auto_increment primary key,s_id int not null,grade float not null); 数据: mysql> insert into student (id,name,sex,phone) values(122,’wg’,’男’,’110’); mysql> insert into students values(111,’wg’,’121’,’dd’) ; 删: mysql> drop table tablename; mysql> truncate tablename; 快速删除表数据,自增长id从头在来,快速,从磁盘直接删除,不可恢复 mysql> delete from student; 删除整个表的数据,自增长继续 改: mysql> alter table oldtable rename newtable; 改表名 mysql> alter table scores modify s_id varchar(20);
全栈程序员站长
2022/07/25
2.3K0
Mysql增删改查sql语句练习
Mysql介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。 MySQL使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。 提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。 MySQL 是开源的,所以不需要支付费用。 原生JSON支持(5.7 新增) 企业级的应用支持。
全栈程序员站长
2022/08/04
6520
Mysql介绍
MySQL 基础知识笔记 第03期:子查询和关联查询
在练习左连接和右连接之前,为了显示出两者的区别,这里再在每张表中新增一条记录,两张表中的这两条记录 stu_id 不相等。
数据库交流
2022/04/25
5160
MySQL 基础知识笔记 第03期:子查询和关联查询
MySQL 常用基础知识,多学一门技能,不求人
外键约束:是指在主键关联的外键上强制加上一个约束,如果违反该约束,则不允许该条数据的修改。
微芒不朽
2022/09/13
5740
MySql数据库增删改查常用语句命令「建议收藏」
创建数据库表: 创建一个表名为:employee,该表中含有id、name、sex、birthday、job字段
全栈程序员站长
2022/09/02
1.3K0
mysql 练习题
)DEFAULT CHARSET=UTF8; create table grade( s_id char(4) not null, c_id char(4) not null, g_score int , primary key(s_id,c_id) )default charset=utf8; 表1 student_info表结构 列名 数据类型 允许NULL值 主键 学号 char(4) 否 是 姓名 char(8) 否 否 性别 char(2) 是 否 出生日期 date 是 否 家族住址 varchar(50) 是 否 表2 curriculum表结构 列名 数据类型 允许NULL值 主键 课程编号 char(4) 否 是 课程名称 varchar(50) 是 否 学分 int 是 否
全栈程序员站长
2022/10/02
1.2K0
MySQL表的增删查改
values左侧为表中属性,右侧为自定义插入的内容,左右两侧安装顺序是一一对应的,如果顺序不同就会导致类型不同而出错。
每天都要进步呀
2023/10/16
8940
MySQL表的增删查改
Mysql常用sql语句(2)- 操作数据表
https://www.cnblogs.com/poloyy/category/1683347.html
小菠萝测试笔记
2020/06/09
5890
Mysql常用sql语句(2)- 操作数据表
mysql基本操作命令汇总
作用:提高表中数据的查询速度 1.普通索引 2.唯一性索引 3.全文索引 4.单列索引 5.多列索引 6.空间索引
崔笑颜
2020/06/08
1.1K0
mysql基本操作命令汇总
关于MySQL库表名大小写问题
一般在数据库使用规范中,我们都会看到这么一条:库名及表名一律使用小写英文。你有没有思考过,为什么推荐使用小写呢?库表名是否应该区分大小写呢?带着这些疑问,我们一起来看下本篇文章。
MySQL技术
2021/07/05
8.2K0
MySQL表的增删查改(二)
创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键,classes_id为外键,关联班级表id:
海盗船长
2020/08/27
2.8K0
数据库-表的操作
**语法一:**create table 新表 select 字段 from 旧表
cwl_java
2020/03/27
7090
02 . Mysql基础操作及增删改查
SQL(Structured Query Language 即结构化查询语言) SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。
iginkgo18
2020/09/27
2K0
haue数据库原理第一次实验
(1)学会使用MySQL 图形界面工具进行数据库相关操作。 (2)掌握使用SQL语句创建、选择、删除数据库。 (3)掌握使用SQL语句创建、修改、删除表。 (4)掌握使用SQL语句对表进行插入、修改和删除数据操作。 (5)学会使用SQL命令进行数据库备份的操作方法。 (6)学会使用SQL命令进行数据库恢复的操作方法。
南桥
2024/11/02
1570
haue数据库原理第一次实验
MySQL基础篇(DDL,DML,DQL,DCL详细讲解)
pojie方式:https://www.jb51.net/database/710931.html
用户4919348
2022/04/13
1.7K0
MySQL基础篇(DDL,DML,DQL,DCL详细讲解)
软件测试从业者必备SQL合集V1.0(21天搞定)
这是,IDO老徐最近在进行的21天SQL打卡的作业 & 参考答案的合集,提供给所有软件测试从业者 ;
IDO老徐
2020/04/26
8010
mysql必知必会2
语法:delete from {1} where {2} 第一对大括号替换为表名,第二对大括号替换为查询条件。 注意:删除语句一定要写删除条件,否则整张表删除。 例如:delete from commodity 这个SQL语句删除commodity表中的所有数据。 例如:delete from commodity where id = 5 这个SQL语句删除commodity表中的id=5的数据
潇洒坤
2018/09/10
7890
mysql必知必会2
MySQL入门,问题不大【增删改查极速上手】
当你登录你的QQ账号和别人吹水的时候,当你期末交作业去度娘复制的时候,当你在工作中登录一些网站的时候,再比如当你查看自己几乎没有什么余额的银行卡的时候(捂脸),或许自己也没注意,(非需要,大部分人也不想注意哈哈哈)我们一直都在以某种方式与数据库打交道,或许你是一个开发人员,也或许你也只是一个普通的用户,数据库与我们的生活息息相关,作为一名程序员,现在学习 MySQL 和 Oracle 的会多一些,像微软的 SQL Server 以前配合 asp 的时候用的还是挺多的,不过现在就没那么流行了,
BWH_Steven
2020/06/03
8140
推荐阅读
相关推荐
MySQL 基础知识笔记 第04期:分组查询和聚集函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档