判断天数和星期

*(大佬勿进,跳过即可。)


任务:

当判断天数没有传说中的Linux年(1970年1月1时0时0分),没有基姆拉尔森计算公式(Week=(d+2m+3(m+1)/5+y+y/4-y/100+y/400)%7),即作为一个小白,在没有在网上搜思路的情况下,你会怎样用c++完成一个可以计算任意日期的代码。以下是我的思路:


.用数组保存每月的天数,判断是否为闰年,若为闰年,二月的天数为29天,否则为28天,从而计算一年的天数(期间要提醒用户输入合格的日期);
.计算输入的日期是现在年份的天数(切记是当前月份减一得到的天数加上当前天数);
.以2019年3月13日星期三(2019年的第72天)为基准,进行星期的判断。但是这里要区分你判断的日期是基准日期的前面、后面还是同一年。
1.若是基准年的后面:所有天数=通过for循环计算期间的闰年的个数,乘以366,用年份之差减去闰年个数减一,乘以365,加上2019年3月13日到年末的天数,再加上你所判断日期是那一年的第几天。
2.若与基准年是同一年:所有天数=2019年3月13日到年末的天数
*以上两种情况都可以调用**After** 函数,即除以7天,余0是星期三,余1就是星期四,以此类推。
3.若是基准年的前面:(这又要分为两种情况:
  I. 若判断的年份为闰年时,for循环得来的闰年个数需要减一,乘以366,用年份之差减去闰年个数,乘以365,加上366,减去你所判断日期是那一年的第几天,加上72)
  II.若判断的年份为平年时,for循环得来的闰年个数,乘以366,用年份之差减去闰年个数,乘以365,加上365,减去你所判断日期是那一年的第几天,加上72)
  *这种情况就直接调用那个switch(before % 7)的那个语句了,既往前面推,余0是星期三,余1是星期二,以此类推。

是不是思路挺简单的????QAQ,我也只能是这个水平了。
在这里我贴出完整代码:

#include <iostream>

using namespace std;
void After(int & after);

int main()
{
    int Days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int year,month,day;
    int summary = 0;
    int counts = 0;
    int x = 0;//用x计算输出的i的个数;
    int after = 0;//当输入的年份大于2019时;
    int before = 0;//当输入的年份小于2019时;
    int length = 365;
label:
    cout << "Input a Date: " << endl;
    cin >> year >> month >> day ;

    //计算输入的是一年中的第几天;
    if(year >= 0 &&(month >= 1 && month <= 12))       //判断年份大于1,月份大于一小于12;
    {
        if( ( 0==year%400 ) || ( 0==year%4 && 0!=year%100 ) )  //判断是否为闰年
        {
            cout << year << "  is a leap year! " << endl;
            Days[2] += 1;
            length = 366;
            //如果是闰年,就把二月加一;
        }
        if(day <= 0 || day > Days[month])
        {
            cout << "Date illegal,reput again!" << endl;
            goto label;                               //重新执行label段语句;
        }
    }
    else
    {
        cout << "Date ill,reput again!" << endl;
        goto label;
    }
    for(int i = 0; i < month; i++)
    {
        summary += Days[i];
        counts = summary + day;                //从开始到输入的日期的天数;
    }
    cout << "Today is " << year << " 's " << counts << " day" << endl;

    //判断输入的year是星期几;
    //是从2019年3月13日星期三开始算起的;
    if(year < 2019)
    {
        for(int i = 2019; i >= year; i--)
        {
            if(( 0==i%400 ) || ( 0==i%4 && 0!=i%100 ))    //累加从2019年开始到输入的那一年中是闰年的个数;
            {
                x += 1;
            }
            if(( 0==year%400 ) || ( 0==year%4 && 0!=year%100 ))
            {
                before = 72 + (2018 - year - x)*365 + (x-1) * 366 + length - counts + 1;  //当那一年是闰年时;
            }
            else
            {
                before = 72 + (2018 - year - x)*365 + x * 366 + length - counts; // 当那一年不是闰年时;
            }
        }
        switch( before % 7)
        {
        case 0:
            cout << "Today is Wednesday"<<endl;
            break;
        case 1:
            cout << "Today is Tuesday"<<endl;
            break;
        case 2:
            cout << "Today is Monday"<< endl;
            break;
        case 3:
            cout << "Today is sunny"<<endl;
            break;
        case 4:
            cout << "Today is Saturday"<<endl;
            break;
        case 5:
            cout << "Today is Friday"<<endl;
            break;
        case 6:
            cout << "Today is Thursday"<<endl;
            break;
        }

    }
    else if( year > 2019)
    {
        for (int i = 2019; i < year; i++)
        {
            if(( 0==i%400 ) || ( 0==i%4 && 0!=i%100 ))    //累加从2019年开始到输入的那一年中是闰年的个数;
            {
                x += 1;
                after = (365 - 72) + (year - 2020 - x)*365 + x *366  + counts;
            }
        }
        After(after);
    }
    else
    {
        after = counts -72;
        After(after);
    }

    return 0;
}

void After(int & after)
{
    switch(after % 7)
    {
    case 0:
        cout << "Today is Wednesday"<<endl;
        break;
    case 1:
        cout << "Today is Thursday"<<endl;
        break;
    case 2:
        cout << "Today is Friday"<< endl;
        break;
    case 3:
        cout << "Today is Saturday"<<endl;
        break;
    case 4:
        cout << "Today is sunny"<<endl;
        break;
    case 5:
        cout << "Today is Monday"<<endl;
        break;
    case 6:
        cout << "Today is Tuesday"<<endl;
        break;
    }
}

虽然代码看起来很多,但是其实思路特别简单,以我目前的状态,基姆拉尔森计算公式是自然理解不了的,但只要自己慢慢静下心来推倒,其实还是能想出来的。我认为刚开始学c++最重要不是图代码的简洁,而是要有自己的独立思维,不要一想到写代码就去网上差思路,搜代码。

同是c++的初学者,收到你的点赞会给我很大的鼓励。喜欢的可以点个赞哦!!!!

判断天数和星期

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-09
  • 2022-02-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-18
  • 2022-12-23
  • 2022-12-23
  • 2022-01-17
  • 2021-11-21
  • 2022-12-23
相关资源
相似解决方案