2 abc1078278096 abc1078278096 于 2016.04.17 20:08 提问

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)需要验证year\month\day的有效性,避免出现(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)需要考虑跨年、闰月的情况。

4个回答

webcq
webcq   2016.04.17 20:11
已采纳

使用 CDateTime吧

u012155923
u012155923   2016.04.17 20:23

你要是自己验证也可以写个算法判断下入参合法性,难点无非在于对闰年的判断,以及每个月的天数,代码50行左右就能搞定的

LiJiaDongYue
LiJiaDongYue   2016.04.17 22:41

好久没写了,自己尝试下,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)需要验证year\month\day的有效性,避免出现(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();
}

abc1078278096
abc1078278096 看不懂
一年多之前 回复
abc1078278096
abc1078278096 16 6 D:\编程\007.cpp [Error] extra qualification 'Date::' on member 'InitDate' [-fpermissive]
一年多之前 回复
abc1078278096
abc1078278096   2016.04.17 20:18

嗯,我试试。看怎么去实现。谢谢啦

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!