功能描述
-
定义一个日期类,这个类可以进行日期的加减以及日期间隔计算。
-
因为节假日的缘故,工作日和非工作日会有调整,设计一个表记录工作日(非工作日)并完成以下功能:
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 版权协议,转载请附上原文出处链接和本声明。