// WorkOrRest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define RefYear 2012
int MouthDay[13] = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
class Date
{
public:
Date()
{
year = 0;
mouth = 0;
day = 0;
IsCanUse = false;
}
//构造函数
Date(string iString)
{
vector<int> DateVect;
DateVect.clear();
if (ConverStringToDate(iString, "-", DateVect))
{
year = DateVect[0];
mouth = DateVect[1];
day = DateVect[2];
IsCanUse = true;
}
else
{
year = 0;
mouth = 0;
day = 0;
IsCanUse = false;
}
}
//将string转化为日期格式
bool ConverStringToDate(string iString, string isplit, vector<int> &ioDateVect);
//判断传入的字符串是否都是数字
bool JugeStringIsNum(string iStringNum );
//判断输入的日期是否符合规范
bool JugeEffectiveDate();
//判断是否是闰年
bool JugeLeapYear( int iYear);
//计算距离日期的天数总和
int CalculateSumDay();
//得出结果 true为working
bool JugeWorkOrRest(int iSumday);
private:
int year;
int mouth;
int day;
bool IsCanUse;
};
//将string转化为日期格式
bool Date::ConverStringToDate(string iString, string isplit, vector<int> &ioDateVect)
{
bool bIsConverOk = false;
if (iString == "")
return bIsConverOk;
if (iString != "")
{
vector<string> stringVect;
int iSubTenp = 0;
int length = iString.length();
size_t start = 0, end = 0;
while ( end < length -1)
{
end = iString.find_first_of(isplit,start);
if (end == string::npos)
{
end = length;
}
string sSubTemp = iString.substr(start, end - start);
//需要判断 不为空 并且都是数字才可以调用下面这个转化函数
if (JugeStringIsNum(sSubTemp))
{
iSubTenp = stoi(sSubTemp);
ioDateVect.push_back(iSubTenp);
}
start = end + 1;
}
}
if (ioDateVect.size() == 3)
{
bIsConverOk = true;
}
else
{
cout << "请按照给定的模板输入数据!" << endl;
}
return bIsConverOk;
}
//判断传入的字符串是否都是数字
bool Date::JugeStringIsNum(string iStringNum)
{
int iLen = iStringNum.length();
if (iLen < 1)
{
return false;
}
for (int i = 0; i < iLen; i++)
{
char a = iStringNum.at(i);
if (iStringNum.at(i) < '0' || iStringNum.at(i) > '9')
{
return false;
}
}
return true;
}
//判断输入的日期是否符合规范
bool Date::JugeEffectiveDate()
{
if (!IsCanUse)
return false;
if (year < RefYear)
{
cout << "输入的年份应不小于计算的开始日期!" << endl;
return false;
}
if (mouth > 12 || mouth < 1)
{
cout << "输入的月份应该在1月-12月之间!" << endl;
return false;
}
if (JugeLeapYear(year) && mouth == 2)
{
if (day < 1 || day > MouthDay[0])
{
cout << "闰年的二月应为1-29天!" << endl;
return false;
}
}
else
{
if (day < 1 || day > MouthDay[mouth])
{
string scout = to_string(MouthDay[mouth]);
cout << "当月输入的日期应为1- "+ scout +"天!" << endl;
return false;
}
}
return true;
}
//判断是否是闰年
bool Date::JugeLeapYear(int iyear)
{
bool bIsLeap = false;
if ((iyear % 400 == 0) || (iyear % 4 == 0 && iyear % 100 != 0))
{
bIsLeap = true;
}
return bIsLeap;
}
//计算距离日期的天数总和
int Date::CalculateSumDay()
{
int sumday = 0;
for (int yearStart = RefYear; yearStart < year; yearStart++)
{
if (JugeLeapYear(yearStart))
{
sumday += 366;
}
else
{
sumday += 365;
}
}
for (int mouthstart = 1; mouthstart < mouth; mouthstart++)
{
if (JugeLeapYear(year) && mouthstart ==2)
{
sumday += MouthDay[0];
}
else
{
sumday += MouthDay[mouthstart];
}
}
sumday += day;
return sumday;
}
//得出结果 true为working
bool Date::JugeWorkOrRest(int iSumday)
{
bool bisWorking = false;
if ( 0< iSumday % 5 && iSumday < 4) //余数为123
{
bisWorking = true;
}
return bisWorking;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "请输入需要计算的日期,形如:2012-09-10,退出输 按 # 键" << endl;
string sCinString;
while (cin >> sCinString )
{
if (sCinString.at(0) == '#')
{
return 0;
}
Date DateCin(sCinString);
//判断输入的日期是否符合规范
if (DateCin.JugeEffectiveDate())
{
//计算距离日期的天数总和
int icountSum = DateCin.CalculateSumDay();
//得出结果 true为working
if (DateCin.JugeWorkOrRest(icountSum))
cout << "He is working!" << endl;
else
cout << "He is resting!" << endl;
}
}
return 0;
}