题目:

小陆每天要写一份工作日报,日报标准是“入职第X天-小陆-XXX”,对于“入职第几天”,小陆现在每次需要对上次写的日报标题里的天数+1, 遇到周末还要多加2天等等。请你写一段程序,帮小陆自动完成这件事,提供写日期当天的年月日,算出已入职的天数(假定小陆的入职时间是 2014年8月18日)。要求:不能使用时间,日期相关的库函数。

分析:

先将时间封装成类,对于内部的操作采用private方法或者重载运算符的方式封装。计算时间差的时候,先计算年的天数;再加上该年的天数;再减去初始年的天数。

算法代码:

class Time
{
private:
    int _Year;
    int _Month;
    int _Day;
    const int LEAPYEARDAYS = 366;
    const int NONLEAPYEARDAYS = 365;
    bool isLeapYear(int year) const;
    int daysOfMonth(int month, int year) const;
public:
    Time() {}
    Time(int y, int m, int d) : _Year(y), _Month(m), _Day(d) {}
    ~Time() {}
    int operator-(const Time & beginTime);
    friend istream & operator>>(istream & is, Time & inputTime);
};

bool Time::isLeapYear(int year) const
{
    if ((0 == year % 4) && (0 != year % 100)) {
        return true;
    }
    else {
        return false;
    }
}

int Time::daysOfMonth(int month, int year) const
{
    switch (month) {
        case 2:
            if (isLeapYear(year)) {
                return 29;
            } else {
                return 28;
            }
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        default:
            return 31;
    }
}

int Time::operator-(const Time & beginTime)
{
    int continueDays = 0;
    
    //days between two years
    for (int i = 0; i < (this->_Year - beginTime._Year); ++i) {
        if (isLeapYear(this->_Year - i)) {
            continueDays += LEAPYEARDAYS;
        }
        else {
            continueDays += NONLEAPYEARDAYS;
        }
    }
    
    //days of this year
    for (int i = 1; i < this->_Month; ++i) {
        continueDays += daysOfMonth(i, this->_Year);
    }
    continueDays += this->_Day;
    
    //subtract days of beginTime
    for (int i = 1; i < beginTime._Month; ++i) {
        continueDays -= daysOfMonth(i, beginTime._Year);
    }
    continueDays -= beginTime._Day;
    
    return continueDays;
}

istream & operator>>(istream & is, Time & inputTime)
{
    is >> inputTime._Year >> inputTime._Month >> inputTime._Day;
    return is;
}

测试代码:

//
//  main.cpp
//  calculateDays
//
//  Created by Jiajie Zhuo on 2017/4/5.
//  Copyright © 2017年 Jiajie Zhuo. All rights reserved.
//

#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {
    Time beginTime(2014, 8, 18);
    
    Time currentTime;
    cout << "Please input the current time(year, month, day): ";
    cin >> currentTime;
    
    int continueDays;
    
    continueDays = currentTime - beginTime;
    
    cout << "He has been entered for " << continueDays << endl;
    
    return 0;
}

总结:

利用了OOP的思想将时间类封装,计算天数时分别计算年月日能够简化思维的复杂度。对判断平年闰年以及不同月份的天数操作进行方法封装。