igot_wtttt 2022-05-21 22:13 采纳率: 0%
浏览 50

c++简单的日期计算器

设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算。
要求在Date类中设计如下重载运算符函数:
Date operator+(int days):返回某日期加上天数得到的日期
Date operator-(int days):返回某日期减去天数得到的日期
int operator-(Date&b):返回两日期相差的天数
leap(int):判断指定的年份是否为闰年
dton(Date &):将指定日期转换成从日起的天数
ntod(int):将指定的
日起的天数转换成对应的日期

#include <iostream> 
using namespace std;

int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};

class Date
{     int year,mon,day;
      bool leap(int);
      int dton(Date &);
      Date ntod(int);
 public:
      Date(int a=2002,int b=11, int c=20 )
      {year=a;
       mon=b;
       day=c;}
  Date operator+(int);
  Date operator-(int);
  int operator-(Date &b);
  int gety()
     {return year;}
  int getm()
     {return mon;}
  int getd()
     {return day;}
}; 
bool Date::leap(int t)
   {if (t%4) return false;  
      else return true;
   }

int Date::dton(Date &d) //将此对象的日期转化为从d年月日起的天数;
{int yd,md,dd,DAY=0;
 if (d.year>year) { return -1;}
    else if ((d.year==year)&&(d.mon>mon)){ return -1;}
    else if ((d.year==year)&&(d.mon==mon)&&(d.day>=day)){return -1;}  
 yd=year-d.year;
 md=mon-d.mon;
 dd=day-d.day;
 if ((yd==0)&&(md==0))  {return dd;}
   else if (yd==0)
       {DAY+=a[d.mon-1]-d.day;
        DAY+=day;
        for(int i=d.mon;i<mon-1;i++)
            {DAY+=a[i];}
        }
  else 
    { 
      for (int i=d.mon;i<=12;i++)
         { if (i==d.mon) {DAY+=a[i-1]-d.day;}
              else DAY+=a[i-1];
         }
     for (int i=d.year+1;i<year;i++)
        { if (leap(i)) {DAY+=366;}
           else {DAY+=365;}
        }
    for (int i=mon;i>0;i--)
       { if (i==mon) {DAY+=day;}
          else DAY+=a[i-1];
       }
  }
return(DAY);
}

Date Date::ntod(int n) //将指定的年月日起的n天数转化为对应日期
{int ty,tm,td,p;
 ty=year;
 tm=mon;
 p=tm;
 if (n-(a[mon-1]-day)<=0)
  {Date m(ty,tm,day+n);
   return m;}
 n=n-(a[mon-1]-day);
 td=a[tm-1];
 if (leap(ty)) a[1]=29;
  else a[1]=28;
 while(n>a[p])
 {tm++;p++;
  td=a[p-1];
  n-=a[p-1];
  if (leap(ty+tm/12)) a[1]=29;
   else a[1]=28;
  if (tm%12==0) p=0;
 } 
 ty+=tm/12;
 tm=tm%12;
 if (tm==0) 
  {Date m(ty,1,n);
   return m;
 }
 else
 { Date m(ty,tm+1,n);
  return m;}
}

Date Date::operator+(int n)
{*this=ntod(n);
 return *this;
}

 Date Date::operator-(int m)
 {int p=0;
  Date test(year,mon,day);
  if (leap(year)) a[1]=29;
   else a[1]=28;
  while(p!=m)
  {if (test.day==1)
  {if (test.mon!=1)
    {test.mon--;
     test.day=a[test.mon-1];
    }
  else
   { test.year--;
     test.mon=12;
     test.day=31;
   }
  }
  else 
  { test.day--;
   }
    p=dton(test);
  }
  return test;
 }

 int Date::operator-(Date &b)
 {return dton(b);
 }

void main()
{int r,y1,y2,m1,m2,d1,d2;
 int y,m,d,day12;
 cout<<"请输入指定日期的年月日:"<<endl;
 cin>>y>>m>>d;
 Date t1(y,m,d),t0(y,m,d),t2;
 cout<<"请输入天数:"<<endl;
 cin>>r;
 t1+r;
 t2=t0-r;
 cout<<"指定日期后"<<r<<"天的日期为"<<t1.gety()<<"年"<<t1.getm()<<"月"<<t1.getd()<<"日"<<endl;
 cout<<"指定日期前"<<r<<"天的日期为"<<t2.gety()<<"年"<<t2.getm()<<"月"<<t2.getd()<<"日"<<endl;
 cout<<"请分别输入两个日期的年月日:"<<endl;
 cin>>y1>>m1>>d1>>y2>>m2>>d2;
 Date n1(y1,m1,d1),n2(y2,m2,d2);
 day12=n1-n2;
 if (day12<0) day12=n2-n1;
 cout<<"两个日期之间相差"<<day12<<"天"<<endl;
}

大部分数据是对的但是有一些数据测试会和预期结果相差1天
尝试了闰年有关的数据但是没有问题
出问题的数据:
请分别输入两个日期的年月日:
2004 3 30
2020 4 20
两个日期之间相差5864天
(少了一天)
请分别输入两个日期的年月日:
2002 3 19
2004 5 20
两个日期之间相差792天
(少了1天)
感觉应该还是闰年的问题??

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2022-05-21 22:39
    关注

    闰年判断函数有问题,修改如下,供参考:

    bool Date::leap(int t)
       {if ((t % 4 == 0 && t % 100 !=0) || t % 400 ==0) return true;
          else return false;
       }
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 5月21日

悬赏问题

  • ¥15 软件定义网络mininet和onos控制器问题
  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。