日期操作一般包含年增建,月增减,日增减,某一日期是该该年第几天和两日期间隔天数这几种问题
我编了一道题模块化的实现了上述的功能,如下:
设计一个程序,完成以下对日期的操作,包括以下函数:
Date AddDay(Date d, int days):对日期增加days天数,然后返回得到的日期
Date AddMonth(Date d, int months):对日期增加months月数,然后返回得到的日期
Date AddYear(Date d, int years):对日期增加years年数,然后返回得到的日期
int DayInYear(Date d):计算日期是所在年中第几天,然后返回天数
int Subtract(Date d1, Date d2):用d1-d2,计算它们相距的天数,作为函数值返回
输入说明 :
程序包含多组输入,
每组测试数据包含两行,第一行用一个整数(1到5)指定需要完成的操作,含义如下:
1:AddDay
2:AddMonth
3:AddYear
4: DayInYear
5:Subtract
第二行为该操作需要的数据。
比如输入:
1
2016 1 1 31
表示将进行AddDay操作,输入日期为2016年1月1日,加31天。
程序输出结果日期,按年月日格式输出,中间以一个空格分隔。
输出说明 :
程序输出相应计算结果。
对于AddDay、AddMonth、AddYear三种操作,输出结果日期,按年月日格式输出,中间以一个空格分隔。
对于Subtract,结果仅输出一个整数,表示相距的天数。
每组输出占一行,行首与行尾无多余空格,所有地方无多余空行。
代码实现:
1
:
AddDay
Date AddDay(Date d, int days) { for(int i=days; i; --i) { if(d.day==31) { if(d.month-12) { d.month++; d.day=1; } else { d.year++; d.month=1; d.day=1; } continue; } if(d.day==30) { if(d.month==4||d.month==6||d.month==9||d.month==11) { d.month++; d.day=1; } else d.day++; continue; } if(d.day==29&&d.month==2) { d.month++; d.day=1; continue; } if(d.day==28&&d.month==2) { if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) d.day++; else { d.month++; d.day=1; } continue; } d.day++; } return d; }
2:AddMonth
Date AddMonth(Date d, int months) { d.year+=(d.month+months)/12; d.month=(d.month+months)%12; if(d.day==31) { if(d.month==1||d.month==3||d.month==5||d.month==7||d.month==8||d.month==10||d.month==12) return d; if(d.month==4||d.month==6||d.month==9||d.month==11) { d.day=30; return d; } if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) { d.day=29; return d; } d.day=28; return d; } if(d.day==30&&d.month==2) { if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) { d.day=29; return d; } d.day=28; return d; } if(d.day==29&&d.month==2) { if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) return d; d.day=28; return d; } return d; }
3:AddYear
Date AddYear(Date d, int years) { d.year+=years; if(d.day==29&&d.month==2) { if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) return d; d.day=28; return d; } return d; }
4: DayInYear
int DayInYear(Date d) { int Long = 0; int DAY[12]= {31,28,31,30,31,30,31,31,30,31,30,31}; if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) DAY[1]=29; for(int i=0; i<d.month-1; ++i) { Long+=DAY[i]; } return Long; }
5:Subtract
int Subtract(Date d1, Date d2) { if(d1.year==d2.year&&d1.month==d2.month) { return d1.day-d2.day; } else if(d1.year==d2.year) { return DayInYear(d1) - DayInYear(d2); } else { int a,b,c=0; Date temp; int flag=0; if(d1.year>d2.year) { temp=d1; d1=d2; d2=temp; flag=1; } if(((d1.year%4==0)&&(d1.year%100!=0))||(d1.year%400==0)) a=366-DayInYear(d1); else a=365-DayInYear(d1); b=DayInYear(d2); for(int i=d1.year+1; i<d2.year; ++i) { if(((i%4==0)&&(i%100!=0))||(i%400==0)) c+=366; else c+=365; } return flag?(a+b+c):(-a-b-c); } }
代码整合:
#include <bits/stdc++.h> using namespace std; typedef struct Date { int year,month,day; } Date; Date AddDay(Date d, int days) { for(int i=days; i; --i) { if(d.day==31) { if(d.month-12) { d.month++; d.day=1; } else { d.year++; d.month=1; d.day=1; } continue; } if(d.day==30) { if(d.month==4||d.month==6||d.month==9||d.month==11) { d.month++; d.day=1; } else d.day++; continue; } if(d.day==29&&d.month==2) { d.month++; d.day=1; continue; } if(d.day==28&&d.month==2) { if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) d.day++; else { d.month++; d.day=1; } continue; } d.day++; } return d; } Date AddMonth(Date d, int months) { d.year+=(d.month+months)/12; d.month=(d.month+months)%12; if(d.day==31) { if(d.month==1||d.month==3||d.month==5||d.month==7||d.month==8||d.month==10||d.month==12) return d; if(d.month==4||d.month==6||d.month==9||d.month==11) { d.day=30; return d; } if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) { d.day=29; return d; } d.day=28; return d; } if(d.day==30&&d.month==2) { if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) { d.day=29; return d; } d.day=28; return d; } if(d.day==29&&d.month==2) { if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) return d; d.day=28; return d; } return d; } Date AddYear(Date d, int years) { d.year+=years; if(d.day==29&&d.month==2) { if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) return d; d.day=28; return d; } return d; } int DayInYear(Date d) { int Long = 0; int DAY[12]= {31,28,31,30,31,30,31,31,30,31,30,31}; if(((d.year%4==0)&&(d.year%100!=0))||(d.year%400==0)) DAY[1]=29; for(int i=0; i<d.month-1; ++i) { Long+=DAY[i]; } return Long; } int Subtract(Date d1, Date d2) { if(d1.year==d2.year&&d1.month==d2.month) { return d1.day-d2.day; } else if(d1.year==d2.year) { return DayInYear(d1) - DayInYear(d2); } else { int a,b,c=0; Date temp; int flag=0; if(d1.year>d2.year) { temp=d1; d1=d2; d2=temp; flag=1; } if(((d1.year%4==0)&&(d1.year%100!=0))||(d1.year%400==0)) a=366-DayInYear(d1); else a=365-DayInYear(d1); b=DayInYear(d2); for(int i=d1.year+1; i<d2.year; ++i) { if(((i%4==0)&&(i%100!=0))||(i%400==0)) c+=366; else c+=365; } return flag?(a+b+c):(-a-b-c); } } int main() { int op; while(cin>>op) { Date d1, d2; int n; switch(op) { case 1: cin>>d1.year>>d1.month>>d1.day>>n; d2=AddDay(d1, n); cout<<d2.year<<" "<<d2.month <<" " <<d2.day<<endl; break; case 2: cin>>d1.year>>d1.month>>d1.day>>n; d2=AddMonth(d1, n); cout<<d2.year<<" "<<d2.month <<" " <<d2.day<<endl; break; case 3: cin>>d1.year>>d1.month>>d1.day>>n; d2=AddYear(d1, n); cout<<d2.year<<" "<<d2.month <<" " <<d2.day<<endl; break; case 4: cin>>d1.year>>d1.month>>d1.day; n=DayInYear(d1); cout<<n<<endl; break; case 5: cin>>d1.year>>d1.month>>d1.day>>d2.year>>d2.month>>d2.day; n=Subtract(d1, d2); cout<<n<<endl; break; } } return 0; }