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

news2024/12/24 16:48:08

文章目录

  • 日期类的设计
  • 日期计算相关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 处理多个 case
        cin >> 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.coloradmin.cn/o/1205687.html

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

相关文章

[工业自动化-18]:西门子S7-15xxx编程 - 软件编程 - PLC用于工业领域的嵌入式系统:硬件原理图、指令系统、系统软件架构、开发架构等

目录 前言&#xff1a; 一、PLC的硬件电路原理 1.1 硬件框图 1.2 硬件模块详解 &#xff08;1&#xff09;CPU &#xff08;2&#xff09;存储器 &#xff08;3&#xff09;输入/输出&#xff08;I/O&#xff09;模块 &#xff08;4&#xff09;编程器 &#xff08;5&a…

(只需三步)Vmvare tools安装教程,实现与windows互通复制粘贴与文件拖拽

首先确保Ubuntu是联网的&#xff0c;如果连不上网可以参考我的这个联网教程&#xff0c;也很简单 &#xff08;只需三步&#xff09;虚拟机上vm的ubuntu不能联上网怎么办-CSDN博客 第一步&#xff1a;卸载之前的tools,确保没有残留 sudo apt-get autoremove open-vm-tools 第…

第2关:计算二叉树的深度和节点个数

任务描述相关知识 二叉树深度概念二叉树节点二叉树叶子节点概念编程要求测试说明 任务描述 本关任务&#xff1a;给定一棵二叉树&#xff0c;计算该二叉树的深度、总节点个数和叶子节点个数。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.二叉树深度概念…

Linux高级编程:IPC之管道

一、无名管道 1.1 无名管道的概述 管道(pipe)又称无名管道。 无名管道是一种特殊类型的文件&#xff0c;在应用层体现为两个打开的文件描述符。 任何一个进程在创建的时候&#xff0c;系统都会 给他分配4G的虚拟内存&#xff0c;分为3G的用户空间和1G 的内核空间&#xff0c;内…

SOME/IP学习笔记2

1. SOME/IP 协议 SOME/IP目前支持UDP&#xff08;用户传输协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;&#xff0c; PS:UDP和TCP区别如下 TCP面向连接的&#xff0c;可靠的数据传输服务&#xff1b;UDP面向无连接的&#xff0c;尽最大努力的数据传输服务&…

springboot容器

1.主要指的是servlet容器 servlet组件由sevlet Filter Listener等 2.自动配置原理 通过ServletWebServerFactoryAutoConfiguration 配置这些内容 (自动配置类开始分析功能) conditionalOnclass开启条件 ServletRequest类 import导入嵌入式的tomcat Jetty等 这些是配置类&…

鸿蒙原生应用开发-DevEco Studio中HarmonyOS与OpenHarmony项目的切换

一、找到该目录 二、修改操作系统类型 三、分别进行开发&#xff0c;一些常规的应用功能实现后&#xff0c;相互切换后都可以正常运行的。前期OpenHarmony项目如果连接开发板比较困难的化&#xff0c;开发完成后&#xff0c;切换成为HarmonyOS后就可以比较详细地看看效果了。

接口开放太麻烦?试试阿里云API网关吧

前言 我在多方合作时&#xff0c;系统间的交互是怎么做的&#xff1f;这篇文章中写过一些多方合作时接口的调用规则和例子&#xff0c;然而&#xff0c;接口开放所涉及的安全、权限、监控、流量控制等问题&#xff0c;可不是简简单单就可以解决的&#xff0c;这一般需要专业的…

高防IP可以抵御哪些恶意攻击

高防IP协议可以隐藏用户的站点&#xff0c;使得攻击者无法发现恶意攻击的目标网络资源&#xff0c;从而提高了源站的安全性。能够有效抵御常见的恶意攻击类型ICMPFlood、UDPFlood、 TCPFlood、SYNFlood、ACKFlood等&#xff0c;帮助游戏、金 融、电子商务、互联网、政企等行业抵…

套接字的多种可选项

套接字可选项和I/O缓冲大小 套接字的多种可选项 套接字可选项分为 IPPROTO_IP、IPPROTO_TCP、SOL_SOCKET 三层&#xff0c;各层的含义为&#xff1a; IPPROTO_IP&#xff1a;IP 协议相关事项&#xff1b; IPPROTO_TCP&#xff1a;TCP 协议相关事项&#xff1b; SOL_SOCKET&am…

HCIE-灾备技术和安全服务

灾备技术 灾备包含两个概念&#xff1a;容灾、备份 备份是为了保证数据的完整性&#xff0c;数据不丢失。全量备份、增量备份&#xff0c;备份数据还原。 容灾是为了保证业务的连续性&#xff0c;尽可能不断业务。 快照&#xff1a;保存的不是底层块数据&#xff0c;保存的是逻…

算法笔记—第五章-最大公约数与最小公倍数

算法笔记-最大公约数与最小公倍数 最大公约数最小公倍数最大公约数 2最小公倍数2互质互质2 最大公约数 //最大公约数与最小公倍数#include <cstdio> int gcd(int a, int b) {if (b 0) //截止的条件{return a; }else {return gcd(b, a % b);//这里是a与b和b&#xff…

车载通信与DDS标准解读系列(1):DDS-RPC

▎RPC & DDS-RPC RPC&#xff1a;Remote Procedure Call&#xff0c;远程过程调用。 远程过程调用是一种进程间通信&#xff0c;它允许计算机程序在另一个地址空间中执行子程序&#xff0c;就好像用别人的东西像用自己的一样&#xff0c;常用于分布式系统。 远程过程调用…

GCN代码讲解

这里写的有点抽象&#xff0c;所以具体的可以参照下面代码块中的注释&#xff1a; def load_data(path"../data/cora/", dataset"cora"):"""Load citation network dataset (cora only for now)"""print(Loading {} datase…

Spark数据倾斜优化

1 数据倾斜现象 1、现象 绝大多数task任务运行速度很快&#xff0c;但是就是有那么几个task任务运行极其缓慢&#xff0c;慢慢的可能就接着报内存溢出的问题。 2、原因 数据倾斜一般是发生在shuffle类的算子&#xff0c;比如distinct、groupByKey、reduceByKey、aggregateByKey…

U-Mail邮件中继有效解决海外邮件发送不畅难题

相信不少企业都经历过类似的问题&#xff0c;在跟国外客户发送电子邮件的过程中&#xff0c;经常会遇到邮件发不过去、邮件隔了很久对方才收到&#xff0c;或者是邮件退信等情况出现。对此&#xff0c;U-Mail技术专家李工解释到&#xff0c;导致海外通邮不畅主要有以下三个原因…

ubuntu18.04安装google浏览器

下载google安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 安装google浏览器 sudo dpkg -i google-chrome-stable_current_amd64.deb 执行安装 sudo apt-get -f install 启动浏览器 在应用程序中找到google图标点击运行

密钥安全存储方案探讨与实践

随着信息技术的迅猛发展和应用范围的不断扩大&#xff0c;我们日常生活中的许多方面已经与信息技术密不可分。而在信息安全领域中&#xff0c;密钥的安全存储显得尤为重要。本文将探讨密钥安全存储的必要性、相关技术和实践方案&#xff0c;并提出一些解决方案。 一、密钥安全存…

11-13 spring整合web

spring注解 把properties文件中的key注入到属性当中去 xml配置文件拆分 -> import标签 注解开发中 import 实现 搞一个主配置类&#xff0c;其他配置类全部导入进来这个这个主配置类 而且其他配置类不需要 加上configuration注解 之前这个注解用于表示这是一个配置文件 …

Vmware虚拟机重装 虚拟机能ping通主机,而主机不能ping通虚拟机的问题

CClean&#xff0c;用它把你电脑上已经卸载的软件但是注册表还没删干净的把注册表删干净&#xff0c;之前说的那种情况&#xff08;虚拟网络编辑器打不上勾&#xff09;就迎刃而解了。 Ps&#xff1a;CClean&#xff1a;再网上百度就可以查到&#xff0c;软件对用户也很友好&a…