C++,笔试面试,使用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)
 {
  //cout << "Date(int year, int month, int day)" << endl;
  if (!_IsEffective())
  {
   printf("日期无效,已置为1900-1-1\n");
   _year = 1900;
   _month = 1;
   _day = 1;
  }
 }
 Date(const Date& x)
 {
  //cout << "Date(Date& x)" << endl;
  _year = x._year;
  _month = x._month;
  _day = x._day;
 }
 ~Date()
 {
  //cout << "~Date()" << endl;
 }

 void Display()
 {
  cout << _year << "-" << _month << "-" << _day << endl;
 }
 bool operator>(const Date& d)
 {
  if (_year > d._year)
   return true;
  else if (_year == d._year&&_month > d._month)
   return true;
  else if (_month == d._month&&_day > _day)
   return true;
  else
   return false;
 }

 bool operator==(const Date& d)
 {
  if (_year == d._year&&_month == d._month&&_day == d._day)
   return true;
  return false;
 }

 bool operator>=(const Date& d)
 {
  return operator==(d) || operator>(d);
 }

 bool operator<(const Date& d)
 {
  return !operator>=(d);
 }
 bool operator<=(const Date& d)
 {
  return !operator>(d);
 }

 Date operator+(const int day)
 {
  Date tmp = *this;
  if (day < 0)
   operator-(-day);
  tmp._day += day;
  while (tmp._day>tmp._MonthDay())
  {
   tmp._day -= tmp._MonthDay();
   tmp._month++;
   if (tmp._month > 12)
   {
    tmp._year++;
    tmp._month = 1;
   }
  }
  return tmp;
 }

 Date operator+= (const int day)
 {
  if (day < 0)
  {
   operator-=(-day);
   return *this;
  }
  *this = this->operator+(day);
  return *this;
 }

 Date operator- (const int day)
 {
  Date tmp = *this;
  if (day < 0)
   operator+(-day);
  tmp._day -= day;
  while (tmp._day<=0)
  {
   tmp._month--;
   tmp._day += tmp._MonthDay();
   if (tmp._month <1)
   {
    tmp._year--;
    tmp._month = 12;
   }
  }
  return tmp;
 }
 Date operator-= (const int day)
 {
  if (day < 0)
  {
   operator+=(-day);
   return *this;
  }
  *this = this->operator-(day);
  return *this;
 }

 Date operator++()//前置++
 {
  Date tmp = *this;
  operator+=(1);
  return tmp;
 }
 Date operator++(int)//后置++
 {
  operator+=(1);
  return *this;
 }

 Date operator--()//前置--
 {
  Date tmp = *this;
  operator-=(1);
  return tmp;
 }
 Date operator--(int)//后置--
 {
  operator-=(1);
  return *this;
 }

 int operator-(const Date& d)
 {
  int days = _day;
  Date tmp = d;
  if (*this < tmp)
   return -tmp.operator-(*this);
  while (*this>tmp)
  {
   days += tmp._MonthDay();
   tmp._month++;
   if (tmp._month > 12)
   {
    tmp._year++;
    tmp._month = 1;
   }
  }
  return days - tmp._day;
 }

private:
 bool _IsLeapYear()
 {
  if (_year % 4 == 0 && _year % 100 != 0 || _year % 400 == 0)
   return true;
  else
   return false;
 }

 int _MonthDay()
 {
  int monthdays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  if (_IsLeapYear() == 1&&_month == 2)//不是二月没有必要改变到29(算是一个优化)
   monthdays[2] += 1;
  return monthdays[_month];
 }
 int _IsEffective()
 {
  if (_month > 0 && _month < 13 && _day > 0 && _day <= _MonthDay())
   return 1;
  else
   return 0;
 }

private:
 int _year;
 int _month;
 int _day;
};

void Test1()
{
 Date d1(2018, 2, 20); 
 Date d2(2016, 2, 20);
 Date d3(2016, 2, 30);
 printf("%d\n", d1 > d2);
 printf("%d\n", d1 < d2);
 printf("%d\n", d1 >= d2);
 printf("%d\n", d1 <= d2);
 printf("%d\n", d1 == d2);
 d1.Display();
 d3.Display();
 (d1 + 8).Display(); //+(day)
 (d1 + 9).Display(); //+(day)
 (d1 + 10).Display(); //+(day)
 (d2 + 10).Display(); //+(day)
 (d2 + 31).Display(); //+(day)
 printf("\n");

 d1++;  //++
 d1.Display();
 ++d1;  //++
 d1.Display();
 d1 += 10;//+=
 d1.Display(); 
 d2 += 10;
 d2.Display();
 printf("\n");

 d1--;  //++
 d1.Display();
 --d1;  //++
 d1.Display();
 d1 -= 10;//+=
 d1.Display();
 d2 -= 10;
 d2.Display();
 printf("\n");
 d1 += -33;
 d1.Display();
 d1 -= -33;
 d1.Display();
 printf("\n");

 cout << "d1 - d2 = " << d1 - d2 << endl;
 cout << "d1 - d2 = " << d2 - d1 << endl;
}

int main()
{
 Test1();
 system("pause");
 return 0;
}

时间: 2024-10-05 04:59:46

C++,笔试面试,使用C++编程,实现万年历的相关文章

算法之美一书附录中笔试面试题目参考答案

探秘算法世界,求索数据结构之道:汇集经典问题,畅享编程技法之趣:点拨求职热点,敲开业界名企之门.<算法之美--隐匿在数据结构背后的原理>全文目录."45个算法"目录."22个经典问题目录",请见如下链接: 算法之美隆重上市欢迎关注(更有三重好礼) http://blog.csdn.net/baimafujinji/article/details/50484348 *本书附录中的笔试面试题目主要从我之前的系列博文<常见C++笔试题目整理(含答案)&g

C++笔试面试总结

今天去广州的一家手游公司进行笔试面试,刚进去是中午1点半的时候,他们公司的人刚睡醒,一个个精神萎靡地去打卡然后上班,瞬间对这公司就没什么好印象,整个氛围好压抑. 接着快2点的时候,发了一份笔试题,大部分题目均在网上的<C++经典面试300题中>,另外还有几道题目里面没有的(估计是根据公司需求另加的): 如:1,有malloc/free,为什么还用new/deleter?2,Internet采用什么网络协议?该协议的主要层次结构?3,编程题:二叉排序树找第K大节点. 1个小时答4页,编程题占2页

leetcode 刷500道题,笔试/面试稳过吗?谈一谈这些年来算法的学习

想要学习算法.应付笔试或者应付面试手撕算法题,相信大部分人都会去刷 Leetcode,有读者问?如果我在 leetcode 坚持刷它个 500 道题,以后笔试/面试稳吗? 这里我说下我的个人看法,我认为不稳.下面说说为啥不稳以及算法题应该如何刷.如何学才比较好,当然,也会推荐自己学过的资料. 一.先说说笔试题 在刷 leetcode 的时候,你会发现,每道题的题意都很短,你只需要花十几秒的时间,就知道这道题是要你干嘛了,并且每道题所用道的算法思想都很明确,动态规划.递归.二分查找等,你可能很快就

php 笔试面试 总结

一次小小的笔试面试经历,虽然是一些简单的问题,但是自己在这儿总结一下,也查一些资料,得出一些较好的答案,也能帮助自己成长. 1.自己熟悉的http状态码及其意义 其实这个题答案随处可见.这儿也还是记录一下我们常见的http状态码 200:请求返回的状态正常. 301:url永久性重定向. 302:url暂时性重定向. 400:错误请求. 401:未授权访问. 403:禁止访问. 404:未找到 500:服务器错误. 502:bad gateway.错误网关. 504:Gateway Timeou

[转]关于Web前端开发,附:(百度web前端笔试面试题目)

关于Web前端及百度web前端笔试面试题目 随着各大互联网公司设立了Web前端开发工程师.设计工程师等职位,web前端越来越得到互联网企业的认可.而且其重视程度与地位也随着浏览器 端的富客户端的体现而日益提高. 眼前对HTML5的未来和走向,业内的预测是会和Flash.Silverlight等相结合,从而取代传统的客户端应用程序.而实现这个目标的客户端核 心工作是有Web前端工程师来完成的. 从另一个角度,对于web产品来说,交互和用户体验是产品的第一价值,这部分价值的体现就是在web前端.可以

Java编程:万年历,根据用户输入的年份,月份,显示日历

public static void main(String[] args) {  Scanner scanner=new Scanner(System.in);  //根据日历类对象的方法,实例化一个当前的日历类对象  Calendar calendar=Calendar.getInstance();  System.out.println("<<<<<<<<<<<<<<<<万年历>>&

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

Web前端开发笔试&amp;面试_01(mi:)

—— (al_me16041719002000) begin—— 1.(单选)下面哪个方法是String对象和Array对象都有的? A.splice B.split C.replace D.concat E.sort F.join 2.(单选)以下说法错误的是? A.IE8支持 :before B.IE8支持 :after C.IE8支持 :first-child D.IE8支持 :last-child E.IE8支持 ::before F. IE8支持 ::after 3.(单选)以下框架采

多线程笔试面试概念问答

题目转自http://blog.csdn.net/morewindows/article/details/7392749 第一题:线程的基本概念.线程的基本状态及状态之间的关系? 线程,有时称为轻量级进程,是CPU使用的基本单元:它由线程ID.程序计数器.寄存器集合和堆栈组成.它与属于同一进程的其他线程共享其代码段.数据段和其他操作系统资源(如打开文件和信号). 线程有四种状态:新生状态.可运行状态.被阻塞状态.死亡状态.状态之间的转换如下图所示: 第二题:线程与进程的区别? 1. 线程是进程的