全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C/C++实现日期计算器的示例代码

问题介绍:

今天突然看到一个问题看起来蛮有趣的,跟大家分享一下. 给定任意日期对该日期进行加减天数,最后得出加减后出现的日期.以及给两个日期你可以得出他们两个之间相隔多少天.(需要考虑闰年,每个月天数不同,我们需要写一个我们直接可以使用的日期加减器)因为时间比较仓促,我也没有写界面,只有其中几个主要的函数的架构思想以及简单的调试就发出来了.

代码实现:

#include<iostream> 
#include<Windows.h> 
#include<assert.h> 
using namespace std; 
 
class Date 
{ 
 
public: 
 
  Date(int year = 1997,int month = 1,int day = 1) 
  :years(year) 
  , months(month) 
  , days(day) 
  { 
    assert(IScorrect()); 
  } 
 
  Date& operator=(const Date& d) 
  { 
    if (this != &d) 
    { 
      years = d.years; 
      months = d.months; 
      days = d.days; 
    } 
    return *this; 
  } 
 
  Date& operator + (int day) 
  { 
    while (day > 365) 
    { 
      if (ISleapyear() && day > 366) 
      { 
        years++; 
        day = day - 366; 
      } 
      else 
      { 
        years++; 
        day = day - 365; 
      } 
    } 
    while (day >= Getmonthsday()) 
    {   
      //注意这里的次序问题,一定先减 再加 最后再判断. 如果顺序错了会出BUG的. 
      day = day - Getmonthsday();  
      months++; 
      if (months > 12) 
      { 
        years++; 
        months = 1; 
      } 
    } 
 
    while (day > 0) 
    {   
      DateAdvance(); 
      day = day - 1; 
      days++; 
    } 
    return *this; 
  } 
 
  Date& operator - (int day) //先减去一年,然后在使用加的重载,所以你只需要写一个无懈可击的加算法就够了. 
  { 
    while (day > 365) 
    { 
      if (ISleapyear() && day > 366) 
      {       
        day = day - 366; 
        years--; 
      } 
      else 
      { 
        day = day - 365; 
        years--; 
      } 
    } 
    if (ISleapyear()) 
    { 
      day = 366 - day; 
      years--; 
    } 
    else 
    { 
      day = 365 - day; 
      years--; 
    } 
    operator+(day); 
    return *this; 
  } 
 
  void DateAdvance() //用于出现可以进化的情况 
  { 
    if (days > Getmonthsday()) 
    { 
      months++; 
      days = 1; 
    } 
    if (months > 12) 
    { 
      years++; 
      months = 1; 
    } 
  } 
   
  int operator - (Date D) 
  { 
    int count = 0; 
    if (*this > D) 
    { 
      while (*this != D) 
      { 
        D.operator+(1); 
        count++; 
      } 
    } 
    else 
    { 
      while (*this != D) 
      { 
        operator+(1); 
        count++; 
      } 
    } 
    return count; 
  } 
 
  bool ISleapyear() 
  { 
    if ((years % 4 == 0 && years % 100 != 0) || (years % 400 == 0)) 
    { 
      return true; 
    } 
    return false; 
  } 
  int Getmonthsday() 
  { 
    int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 
    if (ISleapyear() && months == 2) 
    { 
      return 29; 
    } 
    return monthDays[months]; 
  } 
 
  void print() 
  { 
    cout << "目前的时间为"; 
    cout << years << "." << months << "." <<days<< endl; 
  } 
 
  bool IScorrect() 
  { 
    if (years > 0 && ((years % 4 == 0 && years % 100 != 0) || (years % 400 == 0)) && days < 367)//闰年 
    { 
      if (months >0 && months < 13) 
      { 
        if (days > 0 && days <= Getmonthsday()) 
        { 
          return true; 
        } 
      } 
    } 
    else if (years >0 && days < 366) //非闰年 
    { 
      if (months >0 && months < 13) 
      { 
        if (days > 0 && days <= Getmonthsday()) 
        { 
          return true; 
        } 
      } 
    } 
    return false; 
  } 
 
  Date operator += (int day) 
  { 
    *this = *this + 100; 
    return *this; 
  } 
  Date operator -= (int day) 
  { 
    return *this = *this - day; 
  } 
  inline Date& operator++() 
  { 
    *this += 1; 
    return *this; 
  } 
  inline Date operator++(int) 
  { 
    Date tmp(*this); 
    *this = *this + 1; 
    return tmp; 
  } 
 
  bool operator == (const Date& d) 
  { 
    return (years == d.years&& months == d.months&&days == d.days); 
  } 
 
  bool operator != (const Date& d) 
  { 
    return !(*this == d); 
  } 
 
  bool operator >(const Date& d) 
  { 
    if (years > d.years || 
      (years == d.years&&months > d.months) 
      || (years == d.years&&months == d.months && days > d.days)) 
    { 
      return true; 
    } 
    return false; 
  } 
 
  bool operator < (const Date& d) 
  { 
    return !(*this > d); 
  } 
 
  bool operator >= (const Date& d) 
  { 
    return (*this == d) && (*this > d); 
  } 
 
  bool operator <= (const Date& d) 
  { 
    return (*this == d) && (*this < d); 
  } 
 
private: 
  int years; 
  int months; 
  int days; 
}; 
 
void Test() 
{ 
  Date d1(2012, 4, 5); 
  Date d2(2013, 4, 5); 
  d1.print(); 
  /*d1 = d1 - 400;*/ 
  d1.print(); 
  cout << d1 - d2 << endl; 
  d1.print(); 
  system("pause"); 
} 

总结:

日期类对我们掌握面向对象这里还是一个蛮重要的知识,你至少要能很熟练很正确地自己快速写出这个整个框架,然后一个一个实现函数,我只能说很重要,很重要,很重要大家一定要掌握.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# c  # 实现日期计算器  # C++实现日期计算器  # 基于C++实现简单日期计算器  # 基于C++实现日期计算器的详细教程  # 基于C++实现一个日期计算器  # C++日期类计算器的模拟实现举例详解  # C++实现日期计算器详细代码示例  # 详解如何用C++写一个日期计算器  # C++日期类的实现日期计算器举例详解  # 很重要  # 加减  # 我也  # 几个  # 来了  # 你可以  # 错了  # 无懈可击  # 时间为  # 可以使用  # 一个问题  # 大家分享  # 每个月  # 再加  # 大家多多  # 正确地  # 面向对象  # 很熟  # 你只需要  # 就够了 


相关文章: 建站之星安全性能如何?防护体系能否抵御黑客入侵?  大同网页,大同瑞慈医院官网?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  如何在西部数码注册域名并快速搭建网站?  如何在云主机快速搭建网站站点?  ,制作一个手机app网站要多少钱?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  家具网站制作软件,家具厂怎么跑业务?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  代刷网站制作软件,别人代刷火车票靠谱吗?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  建站之星客服服务时间及联系方式如何?  如何快速生成ASP一键建站模板并优化安全性?  常州企业建站如何选择最佳模板?  如何通过虚拟主机空间快速建站?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何获取开源自助建站系统免费下载链接?  如何批量查询域名的建站时间记录?  建站之家VIP精选网站模板与SEO优化教程整合指南  如何在自有机房高效搭建专业网站?  宝塔建站后网页无法访问如何解决?  建站之星上传入口如何快速找到?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  如何快速生成橙子建站落地页链接?  如何选择PHP开源工具快速搭建网站?  盘锦网站制作公司,盘锦大洼有多少5G网站?  如何在橙子建站中快速调整背景颜色?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何通过二级域名建站提升品牌影响力?  建站VPS能否同时实现高效与安全翻墙?  移民网站制作流程,怎么看加拿大移民官网?  安云自助建站系统如何快速提升SEO排名?  如何通过虚拟机搭建网站?详细步骤解析  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何在万网自助建站中设置域名及备案?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  ,网页ppt怎么弄成自己的ppt?  Android自定义控件实现温度旋转按钮效果  建站主机选哪种环境更利于SEO优化?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  中山网站制作网页,中山新生登记系统登记流程?  招贴海报怎么做,什么是海报招贴? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。