【C++】日期类实现,与日期计算相关OJ题

文章目录

  • 日期类的设计
  • 日期计算相关OJ题
    • HJ73 计算日期到天数转换
    • KY111 日期差值
    • KY222 打印日期
    • KY258 日期累加

在软件开发中,处理日期是一项常见的任务。为了方便地操作日期,我们可以使用C++编程语言来创建一个简单的日期类。在本文中,我们将介绍如何使用C++实现一个基本的日期类,包括日期的加减、大小比较等功能。

日期类的设计

下面是日期类的基本实现代码:

#pragma once
#include<iostream>
using namespace std;class Date {
public:// 获取某年某月的天数int GetMonthDay(const int year, const int month);// 构造函数Date(int year = 1900, int month = 1, int day = 1);// 拷贝构造函数Date(const Date& d);// 析构函数~Date();// 打印日期void print()const;// 赋值运算符重载Date& operator=(const Date& d);// +=运算符重载Date& operator+=(const int day);// +运算符重载Date operator+(const int day);// -=运算符重载Date& operator-=(int day);// -运算符重载Date operator-(int day);// 计算两个日期之间的天数差int operator-(const Date& d) const;// ++前置运算符重载Date& operator++();// ++后置运算符重载Date operator++(int);// --前置运算符重载Date& operator--();// --后置运算符重载Date operator--(int);// 大于运算符重载bool operator>(const Date& d) const;// 等于运算符重载bool operator==(const Date& d) const;// 大于等于运算符重载bool operator >= (const Date& d) const;// 小于运算符重载bool operator < (const Date& d) const;// 小于等于运算符重载bool operator <= (const Date& d) const;// 不等于运算符重载bool operator != (const Date& d) const;// 地址运算符重载const Date* operator & () const;// 输出流运算符重载friend ostream& operator << (ostream& out, const Date& d);// 输入流运算符重载friend istream& operator >> (istream& in, Date& d);private:int _year;  // 年int _month;  // 月int _day;  // 日
};// 获取某年某月的天数
int Date::GetMonthDay(const int year, const int month) {int monthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (2 == month && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) {return 29;}return monthDay[month];
}// 构造函数
Date::Date(int year, int month, int day) {if ((year < 1) || (month < 1) || (month > 12) || (day < 1) || (day > GetMonthDay(year, month))) {cout << "非法日期:" << endl;}_year = year;_month = month;_day = day;
}// 拷贝构造函数
Date::Date(const Date& d) {_year = d._year;_month = d._month;_day = d._day;
}// 析构函数
Date::~Date() {_year = 1900;_month = 1;_day = 1;
}// 打印日期
void Date::print()const {cout << _year << "/" << _month << "/" << _day << endl;
}// 赋值运算符重载
Date& Date::operator=(const Date& d) {if (this != &d) {_day = d._day;_month = d._month;_year = d._year;}return *this;
}// +=运算符重载
Date& Date::operator+=(const int day) {_day += day;while (_day > GetMonthDay(_year, _month)) {_day -= GetMonthDay(_year, _month);++_month;if (_month == 13) {++_year;_month = 1;}}return *this;
}// +运算符重载
Date Date::operator+(const int day) {Date tmp(*this);tmp += day;return tmp;
}// -=运算符重载
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;
}// 计算两个日期之间的天数差
int Date::operator-(const Date& d) const {Date BigDate = *this;Date SmallDate = d;if (SmallDate > BigDate) {BigDate = d;SmallDate = *this;}int count = 0;while (SmallDate != BigDate) {++SmallDate;++count;}return count;
}// ++前置运算符重载
Date& Date::operator++() {*this += 1;return *this;
}// ++后置运算符重载
Date Date::operator++(int) {Date tmp(*this);*this += 1;return tmp;
}// --前置运算符重载
Date& Date::operator--() {*this -= 1;return *this;
}// --后置运算符重载
Date Date::operator--(int) {Date tmp(*this);*this -= 1;return tmp;
}// 大于运算符重载
bool Date::operator>(const Date& d) const {if (_year > d._year || (_year == d._year && _month > d._month) || (_year == d._year && _month == d._month && _day > d._day)) {return true;}return false;
}// 等于运算符重载
bool Date::operator==(const Date& d) const {return _year == d._year && _month == d._month && _day == d._day;
}// 大于等于运算符重载
bool Date::operator >= (const Date& d) const {return (*this > d) || (*this == d);
}// 小于运算符重载
bool Date::operator < (const Date& d) const {return !(*this >= d);
}// 小于等于运算符重载
bool Date::operator <= (const Date& d) const {return !(*this > d);
}// 不等于运算符重载
bool Date::operator != (const Date& d) const {return !(*this == d);
}// 地址运算符重载
const Date* Date::operator & () const {return this;
}// 输出流运算符重载
ostream& operator << (ostream& out, const Date& d) {out << d._year << "/" << d._month << "/" << d._day;return out;
}// 输入流运算符重载
istream& operator >> (istream& in, Date& d) {in >> d._year;in >> d._month;in >> d._day;return in;
}

上面的代码实现了日期类的基本功能,包括构造函数、加减运算符重载、比较运算符重载、输入输出流运算符重载等。
下面是主函数用于测试代码功能:

int main() {// 创建日期对象并打印Date d1(2023, 11, 13);cout << "日期1:";d1.print();// 拷贝构造函数测试Date d2(d1);cout << "日期2(拷贝构造):";d2.print();// 赋值运算符重载测试Date d3 = d1;cout << "日期3(赋值运算符重载):";d3.print();// += 运算符重载测试d1 += 10;cout << "日期1(+=运算符重载后):";d1.print();// + 运算符重载测试Date d4 = d2 + 5;cout << "日期4(+运算符重载):";d4.print();// -= 运算符重载测试d2 -= 3;cout << "日期2(-=运算符重载后):";d2.print();// - 运算符重载测试Date d5 = d3 - 7;cout << "日期5(-运算符重载):";d5.print();// - 运算符重载测试int diff = d5 - d4;cout << "日期4和日期5之间的天数差:" << diff << endl;// ++ 前置运算符重载测试++d1;cout << "日期1(++前置运算符重载后):";d1.print();// ++ 后置运算符重载测试Date d6 = d2++;cout << "日期6(++后置运算符重载):";d6.print();cout << "日期2(++后置运算符重载后):";d2.print();// -- 前置运算符重载测试--d3;cout << "日期3(--前置运算符重载后):";d3.print();// -- 后置运算符重载测试Date d7 = d4--;cout << "日期7(--后置运算符重载):";d7.print();cout << "日期4(--后置运算符重载后):";d4.print();// 大于运算符重载测试cout << "日期5大于日期6吗?" << (d5 > d6 ? "是" : "否") << endl;// 等于运算符重载测试cout << "日期1等于日期2吗?" << (d1 == d2 ? "是" : "否") << endl;// 不等于运算符重载测试cout << "日期3不等于日期4吗?" << (d3 != d4 ? "是" : "否") << endl;// 输出流运算符重载测试cout << "日期1的输出流运算符重载:" << d1 << endl;// 输入流运算符重载测试Date d8;cout << "请输入一个日期(年 月 日):";cin >> d8;cout << "您输入的日期为:" << d8 << endl;return 0;
}

在这里插入图片描述
C++实现一个简单的日期类,包括日期的加减、大小比较等功能。日期类的实现可以帮助我们更方便地处理日期,提高代码的可读性和可维护性。

日期计算相关OJ题

HJ73 计算日期到天数转换

https://www.nowcoder.com/practice/769d45d455fe40b385ba32f97e7bcded?tpId=37&&tqId=21296&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking
在这里插入图片描述

#include <iostream>
using namespace std;int main() {int month[13] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};int y, m, d;cin >> y >> m >> d;int day = d;if (2 < m && ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))){day += 1;}day += month[m];cout << day << endl;
}

KY111 日期差值

https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c?tpId=62&&tqId=29468&rp=1&ru=/activity/oj&qru=/ta/sju-kaoyan/question-ranking
在这里插入图片描述

#include <iostream>
#include <string>
using namespace std;// 判断是否为闰年
bool isLeapYear(int year) 
{return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}// 获取某年某月的天数
int getDaysOfMonth(int year, int month) 
{int daysOfMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (month == 2 && isLeapYear(year)) {return 29;}return daysOfMonth[month];
}// 计算日期距离公元0年的天数
int getDaysFromZero(int year, int month, int day) 
{int days = 0;for (int y = 1; y < year; ++y) {days += isLeapYear(y) ? 366 : 365;}for (int m = 1; m < month; ++m) {days += getDaysOfMonth(year, m);}days += day;return days;
}// 计算两个日期之间的天数差值
int getDaysDiff(const string& date1, const string& date2) 
{int year1, month1, day1, year2, month2, day2;sscanf(date1.c_str(), "%4d%2d%2d", &year1, &month1, &day1);sscanf(date2.c_str(), "%4d%2d%2d", &year2, &month2, &day2);int days1 = getDaysFromZero(year1, month1, day1);int days2 = getDaysFromZero(year2, month2, day2);return abs(days2 - days1) + 1;
}int main() 
{string date1, date2;while (cin >> date1 >> date2) {int daysDiff = getDaysDiff(date1, date2);cout << daysDiff << endl;}return 0;
}

KY222 打印日期

https://www.nowcoder.com/practice/b1f7a77416194fd3abd63737cdfcf82b?tpId=69&&tqId=29669&rp=1&ru=/activity/oj&qru=/ta/hust-kaoyan/question-ranking
在这里插入图片描述

#include <iostream>
using namespace std;bool isLeapYear(int year)
{return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}int getMonthDay(int year, int month)
{int daysOfMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (month == 2 && isLeapYear(year)) {return 29;}return daysOfMonth[month];
}int main() {int year, day;while (cin >> year >> day) { int month = 1;while (day > getMonthDay(year, month)){day -= getMonthDay(year, month);++month;}printf("%4d-%02d-%02d\n",  year, month, day);}
}

KY258 日期累加

https://www.nowcoder.com/practice/eebb2983b7bf40408a1360efb33f9e5d?tpId=40&&tqId=31013&rp=1&ru=/activity/oj&qru=/ta/kaoyan/question-ranking
在这里插入图片描述

#include <iostream>
using namespace std;bool isLeapYear(int year)
{return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}int getMonthDay(int year, int month)
{int daysOfMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (month == 2 && isLeapYear(year)) {return 29;}return daysOfMonth[month];
}
int main() {int t, year, month, day, add;cin >> t;while (t--) { // 注意 while 处理多个 casecin >> year >> month >> day >> add;day += add;while (day > getMonthDay(year, month)){day -= getMonthDay(year, month);++month;if (13 == month){month = 1;++year;}}printf("%4d-%02d-%02d\n",  year, month, day);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0到0.01入门 Webpack| 001.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

四川竹哲电子商务有限公司怎么样?是真的吗

在当今数字化时代&#xff0c;抖音电商服务逐渐成为了企业营销的重要手段。在这个充满机遇与挑战的领域&#xff0c;四川竹哲电子商务有限公司以其卓越的服务质量&#xff0c;成为了行业内的佼佼者。本文将详细介绍四川竹哲电子商务有限公司的抖音电商服务&#xff0c;帮助您了…

vue离线地图(瓦片)

最近公司要弄一个这样的离线地图&#xff0c;要求在图上打点画线之类的。折腾了几天&#xff0c;学习了三种方式&#xff1a; 1.拿到各省市区的经纬度json&#xff0c;通过echarts来制作&#xff0c;再套一个卫星图的地图背景 2.下载地图瓦片&#xff0c;再通过百度/高德的离线…

Java学习之路 —— 异常、集合、Stream

文章目录 1. 异常2. 集合2.1 遍历2.1.1 迭代器2.1.2 增强for循环2.1.3 Lambda 2.2 List2.3 Set2.3.1 HashSet2.3.2 LinkedHashSet2.3.3 TreeSet 2.4 Map 3. Stream 1. 异常 Exception&#xff1a;叫异常&#xff0c;是程序员可以捕捉的。异常又分为了2类&#xff1a; 运行时异…

数据结构:红黑树的原理和实现

文章目录 红黑树的概念红黑树的性质红黑树的模拟实现红黑树的平衡问题 整体实现和测试 本篇用于进行红黑树的拆解和模拟实现&#xff0c;为之后的map和set的封装奠定基础 红黑树的概念 红黑树也是一种二叉搜索树&#xff0c;但是在每一个节点的内部新增了一个用以表示该节点颜…

pytorch框架学习(tensorboard的使用)

什么是tensorboard&#xff1f; tensorboard是一个可视化工具&#xff0c;它可以把训练过程中的数据变化以图像的形式绘制出来&#xff0c;或者记录训练过程中使用的图片 tensorboard的安装&#xff1a; 在pycharm的终端中输出安装命令后自动安装—— pip install tensorbo…

IP地址查询在社交行业中的崭新应用

在社交媒体蓬勃发展的今天&#xff0c;IP地址查询技术IP66_ip归属地在线查询_免费ip查询_ip精准定位平台正在成为社交行业中的一项强大工具。这项技术不仅为社交平台提供了更多个性化服务的可能&#xff0c;还在用户安全和内容管理等方面发挥了关键作用。本文将深入探讨IP地址查…

什么是集成测试?集成的方法有哪些?

前言 综合测试整合测试非常复杂&#xff0c;需要一些开发和逻辑技能。的确如此&#xff01;那么把这个测试整合到我们的测试策略中的目的是什么呢&#xff1f;这个问题我们先不着急回答&#xff0c;让我们一步步往下看你就知道了。 为什么要进行集成测试&#xff1f; 以下是一…

UE4动作游戏实例RPG Action解析四:装备系统

导语: 以加血道具为例,详细分析拆解ActionRPG的装备系统,包含装备系统需求和数据结构设计,以及实现 一、装备系统需求: 装备槽: 已获取装备和未获取装备: 当已经装备一个道具时,再次捡到道具,会把道具放在装备库,不会放在装备槽中, 当没有装备道具时,会拾取道具…

算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好&#xff0c;我是怒码少年小码。 从本篇开始&#xff0c;我们就要开始算法的新篇章了——四大思想&#xff1a;滑动窗口、贪心、回溯、动态规划。现在&#xff0c;向我们迎面走来的是——滑动窗口思想&#xff01;&#x1f61d; 滑动窗口思想 概念 在数组双指针里&am…

别试错了,是该关注一下软件内在质量了

太多这种例子了&#xff0c;老板们早上出的新想法&#xff0c;恨不得第二天就能上线。。每个互联网公司都试图突破固定领地&#xff0c;不断地尝试新的业务&#xff0c;一旦发现不行&#xff0c;就立刻砍掉&#xff0c;名曰“试错”。 研发部门&#xff0c;为了应对压力&#…

vue中通过.style.animationDuration属性,根据数据长度动态设定元素的纵向滚动时长的demo

根据数据长度动态设定元素的animation 先看看效果&#xff0c;是一个纯原生div标签加上css实现的表格纵向滚动动画&#xff1a; 目录 根据数据长度动态设定元素的animationHTMLjs逻辑1、判断是数据长度是否达到滚动要求2、根据数据长度设置滚动速度 Demo完整代码 HTML 1、确…

【机试题】LazyIterator迭代器懒加载问题

将下面这个未完成的Java工具类补充完成&#xff0c;实现懒加载的功能&#xff0c;该类需要实现Iterable接口&#xff0c;能够遍历所有数据。具体要求如下&#xff1a; 工具类提供了一个ValueLoader接口&#xff0c;用于获取数据&#xff0c;其中ValueLoader的接口定义为&#x…

【Python】一文带你掌握数据容器之集合,字典

目录&#xff1a; 一、集合 思考&#xff1a;我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景为何又需要学习新的集合类型呢? 通过特性来分析: &#xff08;1&#xff09;列表可修改、支持重复元素且有序 &#xff08;2&#xff09;元组、字符…

asp.net图书管理系统

asp.net图书管理系统 基本操作图书管理 读者管理 借书 修改资料 修改密码 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#winform架构和sql server数据库 功能模块&#xff1a; 图书管理 读者管理 借书 修改资料 修改…

JavaScript概述

一、JavaScript简介&#xff1a; JavaScript是互联网上流行的脚本语言&#xff0c;可用于HTML和web&#xff0c;可广泛应用于服务器、PC、笔记本、平板电脑和智能手机等设备。 JavaScript是一种轻量级的编程语言&#xff0c;可插入HTML页面的编程代码&#xff0c;插入HTML页面后…

千兆路由只有200M,原来是模式选择不对,也找到了内网不能通过动态域名访问内部服务的原因

本来1000M的宽带接入的&#xff0c;但是一测试发现只有200M&#xff0c;把电信叼了过来&#xff0c; 一测试发现宽带没问题&#xff0c;网线正常&#xff0c;网卡正常&#xff0c;只有可能是路由器的问题了&#xff0c;尴尬了&#xff0c;赶紧给满意好评放他走。回头好好研究一…

Springboot项目返回数据统一封装

Springboot项目返回数据统一封装,支持swagger。 正常swagger会根据数据库表的注释显示对应的参数释义等。但当我们使用统一接口返回map时&#xff0c;部分注释等信息会被掩盖消失。在此提供三个java类即可满足统一封装返回接口&#xff0c;也可显示对应的swagger释义等。 1.Er…

包教包会:Mysql主从复制搭建

笑小枫的专属目录 一、无聊的理论知识1. 主从复制原理2. 主从复制的工作过程3. MySQL四种同步方式 二、docker下安装、启动mysql1. 安装主库2. 安装从库 三、配置Master(主)四、配置Slave(从)五、链接Master(主)和Slave(从)六、主从复制排错1. 错误&#xff1a;error connectin…

链表的逆置

方法1&#xff1a; 依次将指针反向&#xff0c;最后令头指针指向尾元素。 逆置过程如下&#xff1a; 当q指针为空时&#xff0c;循环结束。 //试写一算法&#xff0c;对单链表实现就地逆置&#xff0c; void Reverse1(List plist)//太复杂,不用掌握 {assert(plist ! NULL);i…