PTA c++你的生日是星期几?

一道c++面向对象程序与设计的习题
我们已经知道,公元 1年1月1日是星期四,知道了这个事实,我们就可以编程计算任意一个日期是星期几,但需要注意的是,罗马教皇格里戈八世在1582年2月24日颁布法令,永远抹去了1582年10月5日到1582年10月14日。历史上从来不曾有过这10天。也就是说,1582年10月4日是星期四,它的第二天是1582年10月15日星期五。

img

img

img

img

运行结果如下:

img

代码:

#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;
}


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632