问题描述
- C++类输出年月日,小白,我没有C币可以悬赏,可以么?
-
完成类的定义:
class Date
{int day, month, year;
void InitDate(int d, int m, int y);
//要求验证day,month的有效性,-2000<=year<=3000
void AddYear(int year); //year可正负
void AddMonth(int month); //month可正负
void AddDay(int day); //可选做,day可正负
};注意:
1.InitDate(int d, int m, int y)需要验证yearmonthday的有效性,避免出现(5678,14,37)(2014,2,29)等无效日期。
2.AddYear(int year)需要考虑特殊的日期,如(2012,2,29)加1年不能出现(2013,2,29)。
3. AddMonth(int month)类似,如(2014,1,31)加1年不能出现(2014,2,31)。
4. AddDay(int day)需要考虑跨年、闰月的情况。
解决方案
使用 CDateTime吧
解决方案二:
你要是自己验证也可以写个算法判断下入参合法性,难点无非在于对闰年的判断,以及每个月的天数,代码50行左右就能搞定的
解决方案三:
好久没写了,自己尝试下,day还有bug,只是给你个思路
/*
完成类的定义:
class Date
{
int day, month, year;
void InitDate(int d, int m, int y);
//要求验证day,month的有效性,-2000<=year<=3000
void AddYear(int year); //year可正负
void AddMonth(int month); //month可正负
void AddDay(int day); //可选做,day可正负
};
注意:
1.InitDate(int d, int m, int y)需要验证yearmonthday的有效性,避免出现(5678,14,37)(2014,2,29)等无效日期。
2.AddYear(int year)需要考虑特殊的日期,如(2012,2,29)加1年不能出现(2013,2,29)。
3. AddMonth(int month)类似,如(2014,1,31)加1年不能出现(2014,2,31)。
4. AddDay(int day)需要考虑跨年、闰月的情况。
*/
#include
#include
using namespace std;
class Date
{
private:
int day, month, year;
public:
void InitDate(int d, int m, int y);
void PrintDate(){
cout<<year<<"-"<<month<<"-"<<day<<endl;
}
//要求验证day,month的有效性,-2000<=year<=3000
void AddYear(int year); //year可正负
void AddMonth(int month); //month可正负
void AddDay(int day); //可选做,day可正负
};
void Date::InitDate(int d,int m,int y){
bool isDate=true;
Date::day=d;
Date::month=m;
Date::year=y;
//处理year
if(year<-2000||year>3000) {
isDate=false;
}
//处理months
if(month<=0||month>12){
isDate=false;
}
//处理day
int days[12]={
31,28,31,30,31,30,31,31,30,31,30,31
};
bool Leapyear=(year%400==0)||(year%4==0&&year%100!=0);
if(Leapyear){
days[1]=29;
}
if(day<=0||day>days[m-1]){
isDate=false;
}
if(!isDate){
cout<<"This is a Wrong Date!";
}
}
void Date::AddYear(int year){
Date::year+=year;
}
void Date::AddMonth(int month){
int tmpmonth=Date::month+month;
if(tmpmonth<0){
Date::year-=int(ceil(abs(tmpmonth)/12.0));
Date::month=12-abs(tmpmonth)%12;
}
else if(tmpmonth>12){
Date::year+=int(floor(tmpmonth/12));
Date::month+=month%12;
}
else{
Date::month=tmpmonth;
}
}
void Date::AddDay(int day){
int tmpday=Date::day+day;
int days[12]={
31,28,31,30,31,30,31,31,30,31,30,31
};
bool Leapyear=(Date::year%400==0)||(Date::year%4==0&&Date::year%100!=0);
if(Leapyear){
days[1]=29;
}
int sumday=0;
if(tmpday<0){
if(Date::month==1){
Date::year-=floor(abs(tmpday)/365);
}
for(int i=Date::month-2;i>=0;i--){
sumday+=days[i];
if(sumday+tmpday<days[i]){
Date::month=i+1;
Date::day=sumday+tmpday;
}
}
sumday=0;
}
else{
if(tmpday<days[Date::month-1]){
Date::day=tmpday;
}
else{
if(Date::month==12){
Date::year+=int(ceil(tmpday/365));
}
for(int i=Date::month-1;i<=12-1;i++){
sumday+=days[i];
if(sumday-tmpday<days[i]){
Date::month=i+1;
Date::day=sumday-tmpday;
}
else if(i=11){
i=0;
}
}
}
}
}
int main(){
Date date;
date.InitDate(11,11,2012);
// date.AddMonth(14);
date.AddDay(22);
date.PrintDate();
}
解决方案四:
嗯,我试试。看怎么去实现。谢谢啦