判断天数和星期
*(大佬勿进,跳过即可。)
任务:
当判断天数没有传说中的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++的初学者,收到你的点赞会给我很大的鼓励。喜欢的可以点个赞哦!!!!