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 看不懂
大约 2 年之前 回复
abc1078278096
abc1078278096 16 6 D:\编程\007.cpp [Error] extra qualification 'Date::' on member 'InitDate' [-fpermissive]
大约 2 年之前 回复
abc1078278096
abc1078278096   2016.04.17 20:18

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
求助:怎样获得积分和C币啊
如题,小白一个,还请大家赐教
我就想知道怎样获取C币,买C币的话一买就是几百个,但是我又用不完,能不能只买几个,因为我只需要5个
123
C币为什么不能想买多少买多少
这个网有点奇怪,为什么只能买VIP固定额度的C币
[活动]微信小程序悬赏通缉令——你晒程序我送礼
[活动]微信小程序悬赏通缉令——你晒程序我送礼
博客C币积分突然不增长了?
自从2017年8月12日期,C币积分就不增加了;但是这段时间访问量什么的还是嗖嗖在增加,规则似乎仍然显示“300次阅读量增加一个C币积分”。我是从这个链接查看的,http://my.csdn.net/my/score?type=1&begin_date=2017-08-01&end_date=2017-08-21听说8月18日期改规则了?大家其他人都是这样吗?很好奇。新规则是怎样的?——以前看到博客
我的CSDN现在没有C币,没办法下载
CSDN,我总是没有机会去下载,我喜欢网盘方式的共享,有时候真的是急死人啊急死人。我也发了不少博客
谁知道c币有什么用
还有就是c币怎么查看,系统说给我发送了c币,可是nal
【公告】C币兑换平台上线
亲爱的CSDN用户:                             C币兑换平台终于和大家见面了!                             C币系统是CSDN最新推出的兑换机制,C币用于奖励用户对社区有价值的贡献。                             C币可以兑换论坛可用分、下载积分、CSDN学院课程和定制纪念品,全方位升级你的IT
C语言程序:输入年月日,判断该年月日为这一年的哪一天
部分代码: int main(int argc, char *argv[]) { int month,days,year,days_per_year,i=0; char str[]="Please input year,month,days:\n"; int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; days_per_year=0; while(str[i]!='\0') { putchar(str[i]); Sleep(150); i++; } scanf("%d,%d,%d",&year,&month,&days); if((year%4==0&&year%100!=0)||(year%400==0)) { a[1]=29; } for(i=0;i<month-1;i++) { days_per_year+=a[i]; } days_per_year+=days; printf("The days_per_year is:%d\n",days_per_year); return 0; }
获得C币规则(截止2017年10月已失效,万恶的CSDN)
完善信息获得C币   现在去完善 行为 获得数量 说明 完善个人资料   5 完善个人资料(姓名、职业背景等)获得5个C币 手机验证获得C币   现在去绑定 行为 获得数量 说明 绑定手机   5 首次绑定手机可获得5个C币 撰写博文获得C币  现在去发博文