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");
}

总结:

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

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

(0)

相关推荐

  • c++编写简单的计算器程序

    首先来看下本人的开发环境 系统:win7 电脑:dell 运行环境:vs2015 语言:c++ 简单计算器代码 //四则运算 #include "stdafx.h" #include<iostream> #include<stdio.h> using namespace std; void add() { printf("输入要计算的加数(例如a b)\n"); int adda=0, addb=0,addc=0; cin >>

  • C/C++经典实例之模拟计算器示例代码

    前言 本文主要给大家介绍了关于利用C/C++如何实现模拟计算器的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Problem Description 简单计算器模拟:输入两个整数和一个运算符,输出运算结果. Input 第一行输入两个整数,用空格分开: 第二行输入一个运算符(+.-.*./). 所有运算均为整数运算,保证除数不包含0. Output 输出对两个数运算后的结果. Example Input 30 50 * Example Output import j

  • C语言数据结构之简易计算器

    本文实例为大家分享了C语言简易计算器的具体代码,供大家参考,具体内容如下 主要解决了处理负数.小数等的基础运算操作,无图形界面 #include <iostream> #include <stack> using namespace std; class Calculator{ private: int Priority(char fuhao); double CalSuffix(string PostfixExp); public: double Calculate(string

  • C++有限状态机实现计算器小程序

    本文介绍利用有限状态机原理开发计算器小程序的过程. 实现的功能 支持整数.小数输入 支持+ - * / 四则运算 CE 清除当前操作数 C 清除所有.回到初始状态 回显操作数和结果 HSM状态图 计算器可以分为七种状态:Start.Operand_1.Negate_1.Operator.Operand_2.Negate_2.Error.其中Start.Operand_1.Operand_1状态又分了几种子状态. 下面简要的介绍下状态状态转换的过程: 启动软件,进入Start状态 当用户点击1-9

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

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

  • Django+Bootstrap实现计算器的示例代码

    目录 准备工作 导入Bootstrap前端框架 编写前端内容 编写视图函数 准备工作 创建一个应用 添加应用到配置 创建一个html 编写视图函数 from django.shortcuts import render # Create your views here. def home(request): return render(request, 'index.html') 配置路由 from django.contrib import admin from django.urls imp

  • C语言实现24点游戏计算器的示例代码

    目录 前言 一.项目的创建标 二.项目的编写 三.项目的调试结果 前言 24点游戏计算器的规则如下 24点是一种益智游戏,24点是把4个整数(一般是正整数)通过加减乘除以及括号运算,使最后的计算结果是24的一个数学游戏,24点可以考验人的智力和数学敏感性,它能在游戏中提高人们的心算能力. 24点通常是使用扑克牌来进行游戏的,一副牌中抽去大小王后还剩下52张(如果初练也可只用1-10这40张牌),任意抽取4张牌(称为牌组),用加.减.乘.除(可加括号)把牌面上的数算成24.每张牌必须只能用一次,如

  • Python实现简易计算器的示例代码

    目录 实现流程 计算器布局 计算机执行 代码展示 运行展示 上次我用我学习的python做一个简易的计算器,我对计算器进行了,更改优化,变成了一个真正的计算器 实现流程 1.计算机布局 2.计算机执行 首先导入模块: Tkinter 作为 Python GUI 开发工具之一,它具有 GUI 软件包的必备的常用功能.比如,它提供了十多种不同类型的窗口控件.窗口布局管理器.事件处理机制等,加之其开发效率高.代码简洁易读 import tkinter as tk #Python3标准安装包中自带tki

  • 利用Python实现简易计算器的示例代码

    目录 实现流程 代码实现 定义函数 输入值 判断运算 全部代码展示 运行展示 最近学习了字符串,运算符,条件语句,循环语句,我在想可以用我最近学的东西做什么? 看到运算我就想到了可以做一个简易的计算器. 实现流程 1.定义函数 2.请用户选择运算方法 3.请用户输入要运算的两个数 4.运算出结果 代码实现 定义加减乘除四种函数,在后续的运算中调用这四个函数输出结果. 定义加减乘除四种运算的函数 定义函数要用def 首先定义加法函数add在里面传入参数x,y   返回值X加y 定义subtract

  • java图形化界面实现简单混合运算计算器的示例代码

    写了好几天了终于写完了这个四则运算计算器,总代码放在后面 截图如下: 首先是布局都比较简单,最上面的一个框是总的输出框, 第二个框是每次输入的数字显示在框内, 对于每一个按钮都增加监听器, 对于数字按钮:当长度大于8的 或者等号已经出现之后就不再处理按钮事件 if(e.getSource().equals(button1)) { s=numberText.getText(); //数字长度大于8或者等号已出现 if(s.length()>8 || equalbook == 1) { } else

  • js中的时间转换—毫秒转换成日期时间的示例代码

    js毫秒时间转换成日期时间 复制代码 代码如下: var oldTime = (new Date("2011/11/11 20:10:10")).getTime(); //得到毫秒数 大多数是用毫秒数除以365*24*60*60&1000,这么转回去,这种方法转换太过复杂,年月日,时分秒都要不同的方法获取,而且有的年份有366天,有的365天,这么算起来就太过复杂了. 后面自己试了一个方法,居然成功了 复制代码 代码如下: var oldTime = (new Date(&qu

  • javascript比较两个日期的先后示例代码

    代码很简单,这里就不多废话了,直接奉上代码吧: 复制代码 代码如下: function checkDate(){ //replace(/\-/g, "\/")是根据验证表达式把日期转化成长日期格式 var sDate = new Date(document.getElementById_x("datetimepickerStart").value.replace(/\-/g, "\/"));     var eDate = new Date(do

  • JS比较2个日期间隔的示例代码

    复制代码 代码如下: <!--forms[]部分--> <td> <div id="td12Div" style="display: none;">起始日期:</div> </td> <td> <div id="sdateDiv"> <date:date styleClass="psm-ui-text" name="startD

  • javascript实现日期时间动态显示示例代码

    废话不多说,直接上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"&

随机推荐