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了,可以的话,请您参考添加页面,与大家一起分享你的题解!