首页 > 编程语言 >打卡 C++类与对象定义一个日期类 N天以后 - C/C++ 操作符重载

打卡 C++类与对象定义一个日期类 N天以后 - C/C++ 操作符重载

时间:2023-04-27 23:55:16浏览次数:37  
标签:return int days C++ month Date curMonth 重载 打卡

改造练习13-1(日复一日)中的Date类并提交,使其可以与一个整数n相加或相减,得到该日期N天后/前的日期。

提示:

  1. 请参考题目(日复一日)中的Date类实现;
  2. 注意考虑闰月;
  3. 整数n的取值范围为[1,10000]。

裁判测试程序样例:

 
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;

//在此处补充Date类的定义

int main()
{
    int y, m, d;
    cin >> y >> m >> d;
    Date d1(y,m,d);

    int n;
    cin >> n;

    cout << d1.toText() << " + " << n << " = " << (d1 + n).toText() << endl;
    cout << d1.toText() << " - " << n << " = " << (d1 - n).toText() << endl;
    return 0;
}
 

输入样例:

2022 8 31
2
 

说明:意为求2022年8月31日的后两天和前两天的日期。

输出样例:

2022-8-31 + 2 = 2022-9-2
2022-8-31 - 2 = 2022-8-29

思路:需要设置错误检测,闰年判断,与获取并修改日期系统。

代码实现:

class Date {
public:
Date(int y, int m, int d) : year(y), month(m), day(d) {
assert(month >= 1 && month <= 12 && day >= 1 && day <= getDays());
}

Date operator+(int n) {

if(n<1||n>10000)  break;
int days = day + n;
int curYear = year;
int curMonth = month;
while (days > getDays()) {
days -= getDays();
curMonth++;
if (curMonth > 12) {
curMonth = 1;
curYear++;
}
}
return Date(curYear, curMonth, days);
}

Date operator-(int n) {

if(n<1||n>10000)  break;
int days = day - n;
int curYear = year;
int curMonth = month;
while (days <= 0) {
curMonth--;
if (curMonth == 0) {
curMonth = 12;
curYear--;
}
days += getDays(curYear, curMonth);
}
return Date(curYear, curMonth, days);
}
string toText(){
return to_string(year) + "-" + to_string(month) + "-" + to_string(day); //输出运算符重载
}

int getDays(int y = 0, int m = 0) {
if (y == 0) y = year;
if (m == 0) m = month;
if (m == 2) {
if (isLeapYear(y)) return 29;
else return 28;
} else if (m <= 7) {
if (m % 2 == 1) return 31;
else return 30;
} else {
if (m % 2 == 0) return 31;
else return 30;
}
}
bool isLeapYear(int y) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) return true;
else return false;
}
private:
int year,month,day;
};

标签:return,int,days,C++,month,Date,curMonth,重载,打卡
From: https://www.cnblogs.com/qmz-znv2/p/17360727.html

相关文章

  • c/c++零基础坐牢第九天
    c/c++从入门到入土(9)开始时间2023-04-27 19:27:23结束时间2023-04-27 23:27:35前言:哈哈,今天是五一假期前的狂欢了?不少明天没课的同学都飞奔回家咯。咳咳,都来玩星穹铁道,不玩星穹铁道都是轨子,我铁道兵要来打轨子啦!经过几天的沉淀,对函数多少有些理解,咱们今天就来进行函数编程的相......
  • C++实现一个简单的生产者-消费者队列
    本文的代码都是ChatGPT生成,我只是做了微小的调整和整合,AI提示词如下:设计一个C++类,支持生产者-消费者模型,可以通过size函数获取剩余数量可能第一次生成的不一定合适,多刷新几次。生成的ProducerConsumerQueue.h代码如下:#ifndefPRODUCER_CONSUMER_QUEUE_H#definePRODUCER_CON......
  • C++黑马程序员——P143-146. 文件操作
    P143.C++文件操作——文本文件——写文件P144.C++文件操作——文本文件——读文件P143.写文件   示例:1#include<iostream>2#include<string>3usingnamespacestd;4#include<fstream>56//文本文件写文件78voidtes......
  • C/C++会员管理系统[2023-04-27]
    C/C++会员管理系统[2023-04-27]综合设计实例四课题名称:会员管理系统I、题目的目的和要求(2-3人组)随着社会的进步,人们生活水平的提高,各种各样的会员应运而生。各种便民服务的地方为了提高服务粘性,留住顾客往往采用会员制,例如便利店、健身房,生鲜超市、美容美发店等等不一而足......
  • 第十二天打卡
    问题: 算法设计:根据问题可以计算出每个颜色球的取值范围红球为M<3,白球为N<3,黑球为8-M-N<6流程图: 源代码:#include<stdio.h>intmain(){ intm,n,number=0; for(m=0;m<=3;m++) for(n=0;n<=3;n++) if(8-m-n<=6) printf("%2d:%d%d%d\n",++number,m,n,8-m-n); return0;......
  • 第十一天打卡
    一、问题描述编写一个计算个人所得税的程序,要求输入收入金额后,能够输出应缴的个人所得税。二、设计思路1.利用结构体记录不同起始征税点、结束点和税率;2.利用函数计算各个阶段的税;3.输出结果。三、四、代码实现 ......
  • 打卡10
    位反序数设N是一个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数。例如:1234的反序数是4321。#include<stdio.h>intmain(){ inti; for(i=1002;i<1111;i++)/*穷举四位数可能的值*/ if(i%10*1000+i/10%10*100+i/100%10*10+i/1000==i*9)/*判断反序数......
  • 打卡11
    一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?#include<stdio.h>intmain(){ intt,a[5];/*数组a存放分解的数字位*......
  • 每日打卡-15
    一.问题描述该铁路经过N个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。第i段铁路连接了城市i和城市i+1(1<=i<N)。如果搭乘的比较远,需要购买多张车票。第i段铁路购买纸质单程票需要Ai博艾元。虽......
  • 打卡
    #include<iostream>#include<string>usingnamespacestd;intmain(){stringa[10]={"ling","yi","er","san","si","wu","liu","qi","ba",&qu......