⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sheji1.cpp

📁 用于实现日期的前后计算
💻 CPP
字号:
#include<iostream.h>
class  date
{int  year,month,day;
 public:
  date(int y,int m,int d)      //日期参数int型的构造函数
   {year=y;
    month=m;
    day=d;
   }
  date(char *s)                //日期参数为字符串的构造函数
   {
    char y[4],m[2],d[2];
    int i;
    for(i=0;i<4;i++)
     y[i]=s[i];
     year=(int (y[0])-48)*1000+(int (y[1])-48)*100+(int (y[2])-48)*10
                +(int (y[3])-48);  //字符串中的年转化为数据成员
    if(s[4]=='0')
     {m[0]=s[5];
      month=int (m[0])-48;   //月份小于10,转化为数据成员
     }
   else
     {m[0]=s[4];
      m[1]=s[5];
      month=(int (m[0])-48)*10+(int (m[1])-48);//月份大于等于10,转化为数据成员
     }
   if(s[6]=='0')
    {d[0]=s[7];
     day=int (d[0])-48;   //号数小于10,转化为数据成员
    }
   else
     {d[0]=s[6];
      d[1]=s[7];
      day=(int (d[0])-48)*10+(int (d[1])-48); //号数大于等于10,转化为数据成员
     }
    }
  void  input()                      //输入日期
   {cin>>year;
    cin>>month;
    cin>>day;
   }
  void  output()                    //输出日期
    {cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
    }
 date nextdate()                    //计算下一日函数
   {
    int test[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月的天数分布
     int i=month;
    if(i==2&&((year%4==0&&year%100!=0)||(year%400==0))) //月份为2月且是闰年
     {
      if(day==29)
       {date a(year,3,1);  return  a;            //刚好是最后一天,返回3月1日
        }
      else
       {date a(year,2,day+1);  return a;       //否则返回日期加1
       }
     }
   else if(i==12&&day==31)                     //若是最后一天就返回下年的第一天
     {
      date a(year+1,1,1);
      return a;
      }
   else                                     //其他情况
     {
      if(day==test[i])
       {date a(year,i+1,1);  return  a;   //刚好最后一天,返回下个月1日
       }
      else
       {date a(year,i,day+1);  return a;  //否则返回日期加1
       }
     }
   }
 date pirrodate()                         //计算前一日函数
   {
    int test[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月天数分布
    int  i=month;
    if(i==3&&((year%4==0&&year%100!=0)||(year%400==0)))//月份为三月且是闰年
      {
       if(day==1)
        {date a(year,2,29);  return  a;    //刚好第一天,返回2月29日
        }
      else
        {date a(year,3,day-1);  return a;   //否则返回日期减1
        }
      }
   else if(i==1&&day==1)               //若是第一天就返回上一年最后一天
       {
        date a(year-1,12,31);
        return  a;
       }
   else                                   //不是闰年3月的情况
     {
      if(day==1)
       {date a(year,i-1,test[i-1]);  return  a;//刚好第一天,返回前个月最后一天
       }
     else
      {date a(year,i,day-1);  return a; //否则返回日期减1
      }
     }
   }
  date  dateafter(int d)
   {int test[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月天数分布
    int m=month;
    int y=year;
   while(day+d>=28)                       //当日加上d日大于=28,要进行延伸分析
    {if(m==2)                             //2月份情况
     {
      if((y%4==0&&y%100!=0)||(year%400==0))  //是闰年
       {
         if((day+d-29)>0)             //日期加d减29天大于0,表明延伸到下个月
          {d=d-29;                    //d减29
           m++;                       //月份加1
          }
        else  break;
       }
      else  if((day+d-28)>0)         //不是闰年
         {d=d-28;                   //d减28
          m++;                      //月份加1
         }
      else  break;
     }
     else                       //其他月份情况
      {
       if(day+d-test[m]>0)      //日期加d减当月天数大于0,表明延伸到下个月
        {d=d-test[m];           //d循环减当月天数
         m++;                   //月份加1
        }
       else  break;
      }
   if(m>12)                    //月份超过12,表明延伸到下一年
    {m=m-12;
     y++;
    }
   }
 date a(y,m,d+day);           //返回d天后日期
 return a;
 }
 date  datebefore(int d)
  {int test[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平面每月天数分布
   int m=month;
   int y=year;
   while((day-d)<=0)                       //日期减d小于0,要进行延伸分析
    { if(m==3)                              //3月分情况
       {
        if((y%4==0&&y%100!=0)||(year%400==0)) //是闰年
          {d=d-29;                            //d减29
           m--;                               //月份减1
          }
       else
         {d=d-28;                           //不是闰年,d减28
          m--;                               //月份减1
         }
       }
     else                                //其他月份情况
       {d=d-test[m];                     //d循环减当月天数
        m--;                             //月份减1
       }
    if(m<=0)                          //月份小于0 ,表明要延伸到前一年
      {m=m+12;
       y--;
      }
    }
  date a(y,m,day-d);               //返回d天前日期
  return a;
  }
};
void main()
{date t(0,0,0);
 date a("20071231");            //用字符串构造一个日期
 a.output();
 t=a.nextdate();                //下一日日期
 cout<<"下一日:";
 t.output();
 date c("20080101");
 c.output();
 t=c.pirrodate();             //前一日日期
 cout<<"前一日:";
 t.output();
 date b(0,0,0);
 cout<<"输入一个日期:"<<endl;   //输入一个日期
 b.input();
 t=b.dateafter(90);             //90天后日期
 cout<<"90天后的日期:";
 t.output();
 t=b.datebefore(130);          //130天前日期
 cout<<"130天前的日期:";
 t.output();
 cin.get();
 cin.get();
}


                 
                         

















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -