分享
 
 
 

Date类(C++ Programming Language第10章课后题10.6.2的一部分)

王朝c/c++·作者佚名  2006-09-16
窄屏简体版  字體: |||超大  

//Data.h

#include <iostream>

#include <string>

using namespace std;

class Date

{

public:

enum Month { jan = 1, feb, mar, apr, may, jun,

jul, aug, sep, oct, nov, dec };

class BadDate{ };

Date(int dd = 0, Month mm = Month(0), int yy = 0);

int day( ) const;

Month month( ) const;

int year( ) const;

//string string_rep( ) const;

//void char_rep(char s[]) const;

void print_date( );

//使用Date之前应调用set_default函数设置缺省日期

static void set_default(int, Month, int);

Date& add_year(int n);

Date& add_month(int n);

Date& add_day(int n);

private:

int d;

Month m;

int y;

static Date default_date;

int get_days(Month mm);

};

int leapyear(int yy);

//Date.cpp

#include "Date.h"

Date::Date(int dd, Month mm, int yy)

{

if(yy == 0)

y = default_date.year( );

if(mm == Month(0))

m = default_date.month( );

if(dd == 0)

d = default_date.day( );

int max;

switch(mm)

{

case feb:

max = 28 + leapyear(yy);

break;

case apr:

case jun:

case sep:

case nov:

max = 30;

break;

case jan:

case mar:

case may:

case jul:

case aug:

case oct:

case dec:

max = 31;

break;

default:

throw BadDate( );

}

if(dd < 1 || dd > max)

throw BadDate( );

y = yy;

m = mm;

d = dd;

}

int Date::day( ) const

{

return d;

}

enum Date::Month Date::month( ) const

{

return m;

}

int Date::year( ) const

{

return y;

}

void Date::set_default(int d, Month m, int y)

{

default_date = Date(d, m, y);

}

Date& Date::add_year(int n)

{

if(n != 0)

{

if( d == 29 && m == feb && !leapyear(y + n) )

{

d = 28;

}

y = y + n;

}

return *this;

}

Date& Date::add_month(int n)

{

if(n == 0)

return *this;

if(n > 0)

{

int delta_y = n/12;

int mm = m + n%12;

if(mm > 12)

{

delta_y++;

mm -= 12;

}

y += delta_y;

if(mm == 2 && d >28)

{

if( leapyear(y) )

d = 29;

else

d = 28;

}

if(d == 31)

{

if( (mm == apr) || (mm == jun) ||

(mm == sep) || (mm == nov) )

{

d = 30;

}

}

m = Month(mm);

return *this;

}

if(n < 0)

{

n = -n;

int delta_y = n/12;

int mm = m - n%12;

if(mm <= 0)

{

delta_y++;

mm += 12;

}

y -= delta_y;

if(mm == 2 && d >28)

{

if( leapyear(y) )

d = 29;

else

d = 28;

}

if(d == 31)

{

if( (mm == apr) || (mm == jun) ||

(mm == sep) || (mm == nov) )

{

d = 30;

}

}

m = Month(mm);

return *this;

}

return *this;

}

Date& Date::add_day(int n)

{

if( n == 0 )

return *this;

if( n > 0 )

{

//计算本月剩余天数

int totalDays = get_days(m);

int daysLeft = totalDays - d;

if(n <= daysLeft)

{

d = d + n;

}

else if(n > daysLeft)

{

//把日期调整到下个月1号

n = n - (daysLeft + 1);

add_month(1);

d = 1;

//模拟时间按月的流逝,最后得到正确的日期

int daysInMonth = get_days(m);

while( n >= daysInMonth )

{

add_month(1);

n = n - daysInMonth;

daysInMonth = get_days(m);

}

d = d + n;

}

}

else if( n < 0 )

{

//把n变为正值

n = -n;

//计算本月剩余天数

int totalDays = get_days(m);

int daysLeft = totalDays - d;

//把时间调整到本月的最后一天

n = n + daysLeft;

d = d + daysLeft;

//模拟时间按月的倒流,最后得到正确的日期

int daysInMonth = get_days(m);

while( n >= daysInMonth )

{

add_month(-1);

n = n - daysInMonth;

daysInMonth = get_days(m);

}

d = d - n;

}

return *this;

}

int Date::get_days(Month mm)

{

int days;

if(mm == 0)

return 0;

switch(mm)

{

case jan:

case mar:

case may:

case jul:

case aug:

case oct:

case dec:

days = 31;

break;

case apr:

case jun:

case sep:

case nov:

days = 30;

break;

case feb:

days = 28 + leapyear(y);

}

return days;

}

void Date::print_date( )

{

cout<<y<<'-'<<m<<'-'<<d<<endl;

}

int leapyear(int yy)

{

int iRet = 0;

if( (yy % 4 == 0) && (yy % 100 != 0) )

iRet = 1;

if( yy % 400 == 0 )

iRet = 1;

return iRet;

}

Date Date::default_date(3, feb, 1981);

int main( )

{

//Date::set_default();

Date testDate(29, Date::Month::feb, 2000);

testDate.print_date( );

cout<<"after add -1 years:";

testDate.add_year(-1);

testDate.print_date( );

system("pause");

return 0;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有