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

  • Post author:
  • Post category:其他




功能描述

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

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

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

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



代码参考



头文件

#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();                                    // 日期显示

};



类对象源码

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



主程序

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



版权声明:本文为qq_22328011原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。