实现日期类

题目:实现一个日期类,主要实现日期计算功能:

日期+天数=日期;

日期-天数=日期;

日期-日期=天数;

要实现该日期类,必须熟练掌握运算符重载的概念和实现方法。

以下是编写的一个日期类:

头文件:

#ifndef __DATE_H__
#define __DATE_H__
#include<iostream>
using namespace std;
class Date
{
public:
 Date(int year = 1900, int month = 1, int day = 1);
 Date(const Date& d);
 Date& operator=(const Date& d);
 int DaysOfMonth();//一个月的天数
 bool IsInvalid();//判断非法输入
 bool IsLeapYear();//判断闰年
 void ToCorrectDate();//调整为正确的日期
 Date& operator+=(int days);
 Date& operator-=(int days);
 friend ostream& operator<<(ostream& output, const Date& d);//输出运算符重载
 friend bool operator>(const Date& d1, const Date& d2);
 friend bool operator>=(const Date& d1, const Date& d2);
 friend bool operator<=(const Date& d1, const Date& d2);
 friend bool operator<(const Date& d1, const Date& d2);
 friend bool operator==(const Date& d1, const Date& d2);
 friend bool operator!=(const Date& d1, const Date& d2);
 
 friend Date operator+(const Date& d, int days);//日期+天数
 friend Date operator-(const Date& d, int days);//日期-天数
 friend int operator-(const Date& d1, const Date& d2);//日期-日期
private:
 int _year;
 int _month;
 int _day;
};
#endif

源文件:

Date::Date(int year, int month, int day)//构造函数
:_year(year)
, _month(month)
, _day(day)
{
 if (IsInvalid())//若输入的日期不合法,则调整为合法日期
 {
      _year = 1900;
      _month = 1;
      _day = 1;
 }
}
Date::Date(const Date& d)//拷贝构造函数
{
     _year = d._year;
     _month = d._month;
     _day = d._day;
}
Date& Date::operator=(const Date& d)//赋值运算符重载
{
     _year = d._year;
     _month = d._month;
     _day = d._day;
     return *this;
}
int Date::DaysOfMonth()
{
     int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };        //用数组的形式表示每个月的天数
     if (IsLeapYear())//若为闰年则二月份天数为29天
     {
          days[2] += 1;
     }
         return days[_month];
}
bool Date::IsInvalid()
{
     if (_year < 1900 || _month < 0 || _month > 12 || _day < 0 || _day > DaysOfMonth())
           return true;
     else
           return false;
}
bool Date::IsLeapYear()
{
     return (_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0;
}
ostream& operator<<(ostream& output, const Date& d)//输出运算符重载
{
     output << d._year << "-" << d._month << "-" << d._day;
     return output;
}
bool operator==(const Date& d1, const Date& d2)
{
     return (d1._year == d2._year) && (d1._month == d2._month) && (d1._day == d2._day);
}
bool operator!=(const Date& d1, const Date& d2)
{
     return !(d1 == d2);
}
bool operator>(const Date& d1, const Date& d2)
{
     if (d1._year > d2._year)
          return true;
     if (d1._year == d2._year)
     {
          if (d1._month > d2._month)
               return true;
      if (d1._month == d2._month)
      {
           if (d1._day > d2._day)
          {
                return true;
          }
      }
 }
 return false;
}
bool operator>=(const Date& d1, const Date& d2)
{
     return (d1 > d2) || (d1 == d2);
}
bool operator<=(const Date& d1, const Date& d2)
{
     return !(d1 > d2);
}
bool operator<(const Date& d1, const Date& d2)
{
     return !(d1 >= d2);
}
void Date::ToCorrectDate()
{
     while (_day <= 0)
     {
      if (_month == 1)
      {
           _month = 12;
           _year -= 1;
      }
      else
           _month--;
      _day += DaysOfMonth();
 }
 while (_day > DaysOfMonth())
 {
      _day -= DaysOfMonth();
      if (_month == 12)
      {
           _month = 1;
           _year += 1;
      }
      else
           _month++;
 }
}
Date operator+(const Date& d, int days)
{
     Date d1(d);
     d1._day += days;
     d1.ToCorrectDate();
     return d1;
}
Date& Date::operator+=(int days)
{
     _day += days;
     ToCorrectDate();
     return *this;
}
Date operator-(const Date& d, int days)
{
     Date d1(d);
     d1._day -= days;
     d1.ToCorrectDate();
     return d1;
}
Date& Date::operator-=(int days)
{
     _day -= days;
     ToCorrectDate();
     return *this;
}
int operator-(const Date& d1, const Date& d2)
{
     Date MinDate(d1);
     Date MaxDate(d2);
     int days = 0;
     if (d1 > d2)
     {
          MinDate = d2;
          MaxDate = d1;
     }
     if (d1 < d2)
     {
          MinDate = d1;
          MaxDate = d2;
     }
     while (MinDate != MaxDate)//较小的日期每次增加一天,直到与较大日期相等
     {
              MinDate += 1;
              days++;//记录天数
     }
     return days;
}

测试文件:

#include"date.h"
int main()
{
     Date d1(2016, 1, 7);
     Date d2(2016,1,3);
     Date d;
     int days = 100;
     d = d1 + days;
     cout << d1 <<" + "<< days <<": "<< d << endl;
     d = d1 - days;
     cout << d1 << " - " << days << ": " << d << endl;
     days = d1 - d2;
     cout <<d1 <<" - "<< d2<<": "<<days<< endl;
     getchar();
     return 0;
}
时间: 2024-10-09 20:43:00

实现日期类的相关文章

日期类 Date

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /* 日期类 Date Calendar 日期格式化类 SimpleDateFormat */ public class Demo3 { public static void main(String[] args) throws ParseException {

day17 包装类、日期类

包装类 作用:1.丰富了基本数据类型只能存放值的问题,还提供了大量的方法或常量. 2.包装类充当了基本数据类型和引用数据类型转换的桥梁. 应用层面:包装类.String.基本数据类型的互相转换. 1.基本数据类型转为String: String str = Integer.toString(10): String str = 10 + "": 2.String转换为基本数据类型: int i = Integer.parseInt(str): 3.基本数据类型和包装类互转换: 语法糖--

利用java日期类生成数据仓库维度表

利用java日期类生成数据仓库维度表 Date类: 最基础的日期时间类,返回一个相对日期的毫秒数.精确到毫秒,但不支持日期的国际化和分时区显示.Date 类从Java 开发包(JDK)1.0 就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,这种改进旨在更好的处理日期数据的国际化格式. Calender类: 相对于Date更加强大的时间类,是抽象类,提供了常规的日期修改功能和国际化

Problem B: 时间和日期类(III)

Problem B: 时间和日期类(III) Time Limit: 4 Sec  Memory Limit: 128 MBSubmit: 2889  Solved: 1732[Submit][Status][Web Board] Description 设计一个日期时间类,用于读取输入的数据,按格式输出日期和时间. 设计日期时间类DateTime由2个成员组成,分别是一个Date类对象和一个Time类对象: 设计DateTime类需支持以下操作: DateTime::DateTime()无参构

Java:日历类、日期类、数学类、运行时类、随机类、系统类

一:Calendar类 java.util 抽象类Calendar   1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int field) 返回给定日历字段的值. java.lang.Object 继承者 java.util.Calendar 所有已实现的接口: Serializable, Cloneable, Comparable<Calendar> 直接已知子类: GregorianCalendar 对于日期字段:

时间类和日期类派生出时间日期类

今天再写一个多重继承的应用实例,时间类和日期类派生出时间日期类 程序代码 #include <iostream> using namespace std; class Date//日期类 { public: //构造函数 Date(int y = 0, int m = 0, int d = 0); //设置日期 void SetDate(int y,int m,int d); //打印日期 void PrintDate() { cout<<year<<"年&q

日期类详解

我不清楚大家在上大学的时候是什么样的情况,在我上大学的时候,老师在开课上第一节课的时候都会告诉我们,这本书他会将多少知识点?讲到哪里?考试考到哪里?以至于好多课程我学到的都只是皮毛基础的东西.导致现在不得不花很多的功夫来补以前落下的知识点.其中这个日期类就是一个很重要的知识点,在工作中经常会用到它,这个东西也不难,但是对于我自己来说经常忘这鬼,所以我这次就把它从头梳理一遍并且记录下来,供备以后使用. 首先介绍Date类的构造方法: 1. Date() 创建一个获取当前日期和时间的Date对象.

javascript-封装Date日期类

迁移时间:2017年5月27日18:43:02 Author:Marydon (一)对日期进行格式化 //自定义Date日期类的format()格式化方法 <script type="text/javascript"> // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(H).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字

【C++】日期类+日期万年历+日期计算器

对于日期类,我们主要实现一下日期类的基本函数,构造,拷贝构造,运算符的重载,析构.当然这里运算符的重载需要实现的还是挺多的,如:=.<.>.<=.>=.等 #include <iostream> using namespace std; class Date { public:     Date(int year = 1990, int month = 1, int day = 1)     {         _year = year;         _month 

用c++实现的简单的日期类

自己写的这个日期类实现了简单的一些日期可能会用到的功能, 比如加减某一个日期等等,详细的已在代码里面标注出来了. #include <iostream>using namespace std; class Date{public: Date(int year = 1900, int month = 1, int day = 1)  :_year(year)    //初始化列表     ,_month(month)     ,_day(day) {  if (year < 1900