C++面向对象编程-日期类的实现与日期对象的线性表的实现

功能描述

  • 定义一个日期类,这个类可以进行日期的加减以及日期间隔计算。

  • 因为节假日的缘故,工作日和非工作日会有调整,设计一个表记录工作日(非工作日)并完成以下功能:

    1)根据输入的两个日期,输出两个日期之间的工作日天数

    2)可以将一个工作日设为非工作日,可以将一个非工作日设为工作日

代码参考

头文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#pragma once
class TMyDate {
private:
    // 实例属性
    int year, month, day;    // 年 月 日

public:
    // 实例方法
    TMyDate();                                      // 构造器-空
    TMyDate(int y, int m, int d);                    // 构造器
    bool setYear(int y);                            // 设置年
    bool setMonth(int y);                           // 设置月
    bool setDay(int y);                             // 设置日
    int getYear();                                  // 访问年
    int getMonth();                                 // 访问月
    int getDay();                                   // 访问日
    void add();                                     // 加一天
    void sub();                                     // 减一天
    void Increase(int days);                     	// 日期加法
    void Decrease(int days);                     	// 日期减法
    bool isLarger(int y, int m, int d);             // 大于比较
    bool isLarger(TMyDate t);                       // 大于比较重载
    bool isEqual(int y, int m, int d);              // 等于比较
    bool isEqual(TMyDate t);                        // 等于比较重载
    int Interval(int y, int m, int d);              // 日期作差
    int Interval(TMyDate t_);                       // 日期作差重载
    bool isLeap();                                  // 判断闰年
    void show();                                    // 日期显示

};

类对象源码

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include<iostream>
#include "TMyDate.h"
using namespace std;

const int monthDays1[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };  //包含闰年每月天数的常量数组 
const int monthDays2[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };  //包含平年每月天数的常量数组 

// 构造器
TMyDate::TMyDate(int y, int m, int d) {
    setYear(y);
    setMonth(m);
    setDay(d);
}

TMyDate::TMyDate() {
    year = 0;
    month = 0;
    day = 0;
}

bool TMyDate::setYear(int y) {
    if (y < 0) {
        return false;
    }
    year = y;
    return true;
}
bool TMyDate::setMonth(int m) {
    if (m > 12 || m < 1) {
        return false;
    }
    month = m;
    return true;
}
bool TMyDate::setDay(int d) {
    if (d > 0 && ((isLeap() && d <= monthDays2[month]) || (!isLeap() && d <= monthDays1[month]))) {
        day = d;
        return true;
    }
    return false;
}

int TMyDate::getYear() {
    return year;
}
int TMyDate::getMonth() {
    return month;
}
int TMyDate::getDay() {
    return day;
}

//--------------------------------------------------------------
// add
void TMyDate::add() {
    if ((isLeap() && day + 1 <= monthDays2[month]) || (!isLeap() && day + 1 <= monthDays1[month])) {
        day++;
    }
    else {
        day = 1;
        if (month + 1 <= 12) {
            month++;
        }
        else {
            month = 1;
            year++;
        }
    }
}

// sub
void TMyDate::sub() {
    if (day - 1 > 0) {
        day--;
    }
    else {
        if (month - 1 > 0) {
            month--;
            day = isLeap() ? monthDays2[month] : monthDays1[month];
        }
        else {
            year--;
            month = 12;
            day = 31;
        }
    }
}


//---------------------------------------------------------------------


// 判断闰年
bool TMyDate::isLeap() {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        return 1;
    return 0;
}

// 显示日期
void TMyDate::show() {
    cout << "year:" << year << " month:" << month << " day:" << day << endl;
}

/*
日期加法
*/
void TMyDate::Increase(int days)
{
    for (int i = 0; i < days; i++) {
        add();
    }
}


/*
日期减法
*/
void TMyDate::Decrease(int days)
{
    for (int i = 0; i < days; i++) {
        sub();
    }
}

// 比大小
// 大于
bool TMyDate::isLarger(int y, int m, int d)
{
    if (year > y) {
        return true;
    }
    else if (year < y) {
        return false;
    }
    else {
        if (month > m) {
            return true;
        }
        else if (month < m) {
            return false;
        }
        else {
            if (day > d) {
                return true;
            }
            else {
                return false;
            }
        }
    }
}

bool TMyDate::isLarger(TMyDate t)
{
    if (year > t.year) {
        return true;
    }
    else if (year < t.year) {
        return false;
    }
    else {
        if (month > t.month) {
            return true;
        }
        else if (month < t.month) {
            return false;
        }
        else {
            if (day > t.day) {
                return true;
            }
            else {
                return false;
            }
        }
    }
}

// 等于
bool TMyDate::isEqual(int y, int m, int d)
{
    if (year == y && month == m && day == d) {
        return true;
    }
    return false;
}

bool TMyDate::isEqual(TMyDate t)
{
    if (year == t.year && month == t.month && day == t.day) {
        return true;
    }
    return false;
}

/*
日期作差
*/
int TMyDate::Interval(int y, int m, int d)
{
    TMyDate t(y, m, d);
    int res = 0;
    if (isLarger(t)) {
        while (!isEqual(t)) {
            t.add();
            res++;
        }
    }
    else {
        while (!isEqual(t)) {
            t.sub();
            res++;
        }
    }
    return res;
}

int TMyDate::Interval(TMyDate t_)
{
    TMyDate t(t_.year, t_.month, t_.day);
    int res = 0;
    if (isLarger(t)) {
        while (!isEqual(t)) {
            t.add();
            res++;
        }
    }
    else {
        while (!isEqual(t)) {
            t.sub();
            res++;
        }
    }
    return res;
}

主程序

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include <iostream>
#include "TMyDate.h"
using namespace std;

//-----------------------------------------------------------------------------------------------------------------
// 工作日期类
class TNewDate : public TMyDate {   
private:
    bool isWork;

public:
    TNewDate();
    TNewDate(int y, int m, int d, bool w);
    void setWork(bool w) { isWork = w; };
    bool getWork() { return isWork; };
    void showTNewDate();
    int weekDay();
};

TNewDate::TNewDate() 
{
    this->setYear(0);
    this->setMonth(0);
    this->setDay(0);
    this->setWork(true);
}

TNewDate::TNewDate(int y, int m, int d, bool w = 1)
{
    this->setYear(y);
    this->setMonth(m);
    this->setDay(d);
    if (this->weekDay() > 5) {
        this->setWork(0);
    }
    else {
        this->setWork(w);
    }
}

int TNewDate::weekDay()
{
    int d = this->getDay();
    int m = this->getMonth();
    int y = this->getYear();
    return ((d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400 + 1) % 7)+1;
}

void TNewDate::showTNewDate() 
{
    this->show();
    if (isWork) {
        cout << "WorkDay!" << endl;
    }
    else {
        cout << "FreeDay!" << endl;
    }
}

//-----------------------------------------------------------------------------------------------------------------
// 顺序表实现
const int MAX_SIZE = 10000;
class List
{
private:
    TNewDate Data[MAX_SIZE];
    int length;
    // int workDays = 0;
public:
    List() { length = 0; }
    List(TNewDate a[], int n);
    int Length() { return length; }
    TNewDate Get(int i);
    int Locate(TNewDate x);
    void Insert(int i, TNewDate x); // 插入
    TNewDate Delete(int i);         // 删除
    void PrintList();
    void operator=(List& list);   // 赋值操作符重载
    List(const List& obj);  // 拷贝
};

List::List(TNewDate a[], int n)
{
    if (n > MAX_SIZE) throw "wrong parameter";
    for (int i = 0; i < n; i++)
        Data[i] = a[i];
    length = n;
}

TNewDate List::Get(int i)
{
    if (i<1 && i>length) throw "wrong Location";
    else return Data[i - 1];
}

int List::Locate(TNewDate x)
{
    for (int i = 0; i < length; i++)
        if (Data[i].isEqual(x)) return i + 1;
    return 0;
}

void List::Insert(int i, TNewDate x)
{
    if (length >= MAX_SIZE) throw "Overflow";
    if (i<1 || i>length + 1) throw "Location";
    for (int j = length; j >= i; j--)
        Data[j] = Data[j - 1];
    Data[i - 1] = x;
    length++;
}

TNewDate List::Delete(int i)
{
    if (length == 0) throw "Underflow";
    if (i<1 || i>length) throw "Location";
    TNewDate x = Data[i - 1];
    for (int j = i; j < length; j++)
        Data[j - 1] = Data[j];
    length--;
    return x;
}

void List::PrintList()
{
    for (int i = 0; i < length; i++)
        Data[i].showTNewDate();
}

void List::operator=(List& list) 
{
    memset(Data, '\0', sizeof(Data));
    for (int i = 0; i < list.length && i < MAX_SIZE; i++) {
        this->Data[i] = list.Data[i];
    }
    if (list.length > MAX_SIZE) {
        this->length = MAX_SIZE;
    }
    else {
        this->length = list.length;
    }
}

List::List(const List& obj)
{
    for (int i = 0; i < obj.length; i++) {
        this->Data[i] = obj.Data[i];
    }
    length = obj.length;
}



// ——————主函数——————
//-----------------------------------------------------------------------------------------------------------------
int main() {
    
    int y1, m1, d1;
    int y2, m2, d2;

    TMyDate dd;
    cout << "Date1:" << endl;
    cin >> y1 >> m1 >> d1;
    if (!(dd.setYear(y1) && dd.setMonth(m1) && dd.setDay(d1))) {
        cout << "Illegal Date1" << endl;
        return 0;
    }
    TNewDate date1(y1, m1, d1);

    cout << "Date2:" << endl;
    cin >> y2 >> m2 >> d2;
    if (!(dd.setYear(y2) && dd.setMonth(m2) && dd.setDay(d2))) {
        cout << "Illegal Date2" << endl;
        return 0;
    }
    TNewDate date2(y2, m2, d2);
    
    TNewDate dt = date1.isLarger(date2) ? TNewDate(date2.getYear(),date2.getMonth(), date2.getDay()) : TNewDate(date1.getYear(), date1.getMonth(), date1.getDay());

    int deltaDays = date1.Interval(date2);
    int num = 0;

    List workDayList = List();  // 工作日线性表
    for (int i = 1; i <= deltaDays; i++) {
        dt.add(); 
        if (dt.weekDay() < 6) {
            num++;
            workDayList.Insert(num, TNewDate(dt.getYear(), dt.getMonth(), dt.getDay()));    // 插入工作日对象
        }
    }
    
    // int index = workDayList.Locate(TNewDate());
    // workDayList.Delete(index);

    cout << workDayList.Length() << endl;   // 工作日线性表的长度即工作日总数

    return 0;
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus