c++-C++类输出年月日,小白,我没有C币可以悬赏,可以么?

问题描述

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();
}

解决方案四:

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

时间: 2024-10-29 12:28:43

c++-C++类输出年月日,小白,我没有C币可以悬赏,可以么?的相关文章

用c++编写一个类输出100到200的素数,对不起我是刚学的c++,问一些简单的问题!

问题描述 用c++编写一个类输出100到200的素数,对不起我是刚学的c++,问一些简单的问题! #include#include#includeusing namespace std;class Prime{private: int a[25]; int n1n2; int num;public: Prime(int n1int n2int num); void primef(); void show();};Prime::Prime(int m1int m2int n):n1(m1)n2(m

c#使用student类输出学号姓名

问题描述 c#使用student类输出学号姓名 为什么会输出 proj5-8.student? 我写的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Proj5_8 { class student { private int no; private string name; public

使用DateFormat类输出各种格式的时间(上)

import java.util.Date;import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL = 0 * DateFormat.DEFAULT = 2 * DateFormat.LONG = 1 * DateFormat.MEDIUM = 2 * DateFormat.SHORT = 3 * @author    曲金龙 qujl@neusoft.com     * @version   1.0, 2005/04/16  */

Asp.net 弹出对话框基类(输出alet警告框)_实用技巧

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.T

C#的process类 输出结果 可选择终止

问题描述 比如用process执行一个批处理导入sql,通过OutputDataReceived将结果输出在winform界面上,但是我想实现当出现特定的关键字时(比如ora错误等),不再输出,同时process也不在继续工作,本来考虑kill掉process,但是提示说process已经停止了.求大神帮我解释一下原理,并告诉解决方法,谢谢 解决方案 解决方案二:没有没大神

php flush类输出缓冲剖析_php技巧

<?php for ($i=10; $i>0; $i--) { echo $i; flush(); sleep(1); } ?> 按照php手册里的说法 该函数将当前为止程序的所有输出发送到用户的浏览器. 上面的这段代码,应该隔一秒钟输出一次$i.但是实际中却不一定是这样.有可能是等了10秒钟后,所有的输出同时呈现出来. 好,我们来改一下这段代码,改成 <?php ob_end_clean();//修改部分 for ($i=10; $i>0; $i--) { echo $i;

sqlserver中获取date类的年月日语句_MsSql

select * from 表名 where Convert(varchar(100),日期字段,23)='2008-12-15' 再给你个Convert函数的应用: 复制代码 代码如下: Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 Select CONVERT(varchar(100), GETDATE(),

sqlserver中获取date类的年月日语句

select * from 表名 where Convert(varchar(100),日期字段,23)='2008-12-15' 再给你个Convert函数的应用: 复制代码 代码如下: Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 Select CONVERT(varchar(100), GETDATE(),

竞价推广中小白访客目标着落页分析

通过对公司网站"BB霜"相关长尾关键字在竞价数据分析,发现通过搜索引擎进入的用户,很多访客都不是为了直接购买"BB霜",搜索排行一般都是广泛词,或者疑问词,排行靠前的关键字展现中,具体到品牌的关键字没几个. 可以这样说,从搜索引擎过来这类消费者的网购目标性不强,绝大多数还属于"小白用户".对于竞价推广来说,这类访客的直接投资回报率非常低.但是对于这种有购买需求,但缺乏购买欲望的用户,我们还是不能放弃,毕竟首先这类关键字竞价的实际消费很低,其次小白