一道c++面向对象程序与设计的习题
我们已经知道,公元 1年1月1日是星期四,知道了这个事实,我们就可以编程计算任意一个日期是星期几,但需要注意的是,罗马教皇格里戈八世在1582年2月24日颁布法令,永远抹去了1582年10月5日到1582年10月14日。历史上从来不曾有过这10天。也就是说,1582年10月4日是星期四,它的第二天是1582年10月15日星期五。
运行结果如下:
代码:
#include <iostream>
#include <string>
using namespace std;
string week[] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
struct Calendar
{
int year;
int month;
int day;
int weekday;//星期天为0,星期一为1
int fromInitDays()
{
int i;
int sum = 0;
int a[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
for (i = 1; i < year; i++)
{
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
sum += 366;
else
sum += 365;
}
//
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
a[2] = 29;
for (i = 1; i < month; i++)
sum += a[i];
//
sum += day;
//判断是否包含1582年10月15
if (year > 1582)
sum -= 10;
else if (year == 1582)
{
if (month > 10)
sum -= 10;
else if (month == 10 && day >= 15)
sum -= 10;
}
sum -= 1; //减去第1天
//计算星期
weekday = (sum % 7 + 4) % 7;
return sum;
}
void setValue(int y, int m, int d)
{
if (y < 1) year = 1;
else year = y;
if (m < 1) month = 1;
else if (m > 12) month = 12;
else month = m;
if (d < 1) day = 1;
else if (d > 31) day = 31;
else day = d;
}
void show()
{
cout << year << "年" << month << "月" << day << "日:" << week[weekday] << endl;
}
};
int main()
{
struct Calendar ca;
int y, m, d;
cin >> y >> m >> d;
ca.setValue(y, m, d);
cout << ca.fromInitDays() << endl;
ca.show();
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!