Skip to content

1292: 日历类

题目

题目描述

完成Calendar类(输出要求与现行公历相同,需要实现闰年,闰年机制与公历相同,不考虑历史上出现过的儒略历纪年法),要求完成以下重载运算符:

  • 比较运算符 == , != , > , < , >= , <= ,比较两个Calendar,返回bool。

  • 前缀 ++ , 后缀 ++ , 前缀 -- , 后缀 -- 相当于+1天或-1天。

  • += int , -= int ,返回对象本身。

  • +int , -int ( int 可为负数或零) 返回Calendar。

  • operator = 赋值运算符,返回对象本身。

  • Calendar - Calendar , 返回 int 。

  • Calendar() , Calendar(string) , Calendar(int year, int month, int day) 三个构造函数

  • operator string() 以及 operator << , operator >> 读入读出和与字符串转换的格式都是 "yyyy-mm-dd" (不换行)。 如 "0001-01-01" 或 "9999-12-31" 。

  • 成员函数 int getday () ,返回星期几,如星期日返回 0 ,星期一返回 1 …… 星期六返回 6 。

  • 后缀为 _C 的字符串字面量重载(全局函数): const Calendar operator "" _C( const char *col, size_t n) 如:cout << "2010-01-01"_C - 365; 输出 2009-01-01

(关于这个特性的学习指路(4条消息) C++11新特性之用户字面量操作符_姜的理想国-CSDN博客_c++ 字面量操作符) https://en.cppreference.com/w/cpp/language/user_literal (附注:字符串字面量重载后缀当然不一定重载成_C ,也可以重载成其它任意的字符串)

支持的日期范围为 0001-01-01 至 9999-12-31。 已知 0001-01-01为星期一。

善用函数的互相调用,消除重复代码吧! 这是指,你可以复用已定义的函数,示例如下: bool operator>(const Calendar &rhs) const { return rhs < *this; }

完成这些函数时,请加入适当的 const 以及其它,以获得最好的针对 const 和其它语法的兼容性

以上的函数签名仅为示意,不代表真正的签名和举例一样有 const 或无 const ,是传值还是传引用

请注意函数的返回值

下面是5个点的测试函数: //1 using namespace std; int main() { Calendar c; }

//2 using namespace std; int main() { Calendar c(1,1,1); cin >> c; cout << (c+=0)+0 << endl; cout << c.getday() << endl; cin >> c; cout << c << endl; cout << c.getday() << endl; }

//3 using namespace std; int main() { Calendar c; c = Calendar("2010-01-01"); cout << c.getday() << endl; cout << c << endl; cout << c.getday() << endl; cout << ++c << endl; cout << c.getday() << endl; cout << (c += 1) << endl; cout << c.getday() << endl; cout << (c -= 1) << endl; cout << c.getday() << endl; cout << --c << endl; cout << (c+=1)-(c-=1) << endl; cout << c-c << endl; cout << (c-=1) - (c+=1) << endl; }

//4 using namespace std; int main() { ios::sync_with_stdio(false); Calendar cend = Calendar("1005-12-31"); Calendar c(1000,1,1); Calendar startc; startc = c; for (; c < cend; c+=2) { cout << string(c++) << endl; cout << (++c).getday() << endl; } for (; c >= startc; c-=10) { cout << string(c--) << endl; cout << (--c).getday() << endl; } c = Calendar("0001-01-01")+1400; Calendar cc = c - 1400; for (; cc < c + 1400; ++cc) { cout << (cc > c) << (cc == c) << (cc < c) << (cc == c) << (cc != c); cout << (cc-c); } }

//5 using namespace std; int main() { Calendar c(400,2,29); c+=((c+2650000)-c); c-=((c+2650000)-c); c++; c-=(c-(c+1)); --c; c+=(c-(c+1)); cout << c+(c-c) << endl; cout << c.getday() << endl; cout << "2009-01-01"_C - 365; }

输入格式

输出格式

样例输入

样例输出

数据范围

性能要求: ++,--为 O(1) 。

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!