C++解决三天打鱼两天晒网问题(华为面试上机题库)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值