C++综合练习:日期类TDate

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++程序设计综合练习:日期类TDate

——2015级软件工程学生暑假作业

设计背景:在程序设计中经常使用日期型数据(事实上,一般是时间与日期型数据,本方案没有考虑时间因素),高级语言如Java和C#等均提供了原生的日期时间结构体类型(原生类型即类似int等可以直接使用的数据类型,不需要引用类库),该数据类型使用广泛且灵活,而C++没有提供原生日期型数据类型,一般需要引用库文件才能使用库中定义的相关数据类型。

设计内容:基于C++的面向对象程序设计思想,综合运用函数重载(包括构造函数重载)、运算符重载和静态函数等知识,在考虑错误数据处理并在充分测试的基础上,设计与实现一个纯日期类TDate,既具有实际价值,也可以作为学习完C++的一个综合练习,还可以作为派生一个日期时间函数的基础。

设计进度:本方案分三个部分,每个部分预计时间10天,要求在30内完成设计、编程和测试等任务。

需要说明,不保证本方案中的算法和测试数据是正确的。如果发现问题或也有不理解之处,请及时提出。

1、基本要求

1)命名要求

①规定命名:如果本方案中给出了命名(比如类名就必须是TDate,成员字段必须是year、month和day,等等),则按本方案的命名规定,否则按下面给出的命名规则命名。

②函数命名:必须为动词、动词+名词、或动词开头的组合结构,例如:Add()、AddMonths()、GetLastDays()、IsValid()等等,名称中每个单词的首字母均大写。

③参数命名:函数的参数命名必须是小写字母开头的camelCasting的形式,如果后面是单词则可以大写。例如:name、studentName。

④局部变量命名:同参数命名。

2)重复代码提取为函数要求

不允许有一行或一个代码块的重复代码(即代码是一样的,或功能是相同的),如果

该行或代码块重复,则必须提取出去作为一个独立的函数。

3)单函数单功能要求

努力做到一个函数只做一桩事情——单函数单功能,这也是软件工程中要求的模块高内聚性。如果一个函数中同时有多个处理,那么把每个处理提出出来作为一个函数。

4)一般格式要求

① 块格式要求:判断和循环语句(如if 和for )的代码块,无论是一行或多行,都

必须都带左右花括号{},且花括号{}独立一行,如: if(a > 0) {

...// 一行或多行 }

② 空格技巧:运算符与操作数之间必须有且只有一个空格 。如:a + 1,等等。 ③ 空行技巧:逻辑意义差异明显的代码块之间适当增加一个空行。

④ 逻辑常量:if 语句中的逻辑比较,如果左值或右值是true 或false 的结果,不能

省略该bool 常数。例如,如果IsValid()函数是一个bool 函数,则if 语句必须书写成格式if(IsValid() == true)或if(IsValid() == false)。

⑤ 代码格式:成员字段和成员函数原型均设计在类中,函数(包括构造函数)实

现的代码则设计在类外,使用TDate::IsValid()等形式编程。

⑥ 宏定义数:一些常用数字必须设计成宏定义形式,比如:MaxYearValue=9999、

MinYearValue=1、MaxDayValue31=31、MaxDayValue30=30、MaxDayValue29=29、MaxDayValue28=28、MinDayValue=1、MaxMonthValue=12、MinMonthValue=1。也就是说,代码中出现上述数字时,必须使用这些宏定义。当然,也可以自己增加有关数值、字符串和函数等的宏定义。

2、第一部分的设计要求(基础部分,七月下旬前完成)

1)类基本成员

类TDate 有且只能有四个受保护成员字段:int 型的年月日(year 、month 、day ),以及string 型的错误信息(errorInfo )。对应这四个受保护的字段,有七个公有函数GetYear()、GetMonth()、GetDay()、GetErrorInfo()、ToString()、IsValid()和IsThisLeapYear(),分别返回年、月、日、错误信息字符串、日期字符串(以减号分隔、月日不足两位时前补0,

if(a > 0) { ... } else { ... }

class TDate {

protected: ...

public: ... }

例如2015-06-19、2015-06-01和2015-11-11、1-01-01)、bool型的日期数据是否有效判断和当前年月是否为闰年判断。其中,IsValid()函数根据errorInfo是否为空或null判断。如果errorInfo为空或null,则返回false,否则返回false。

ToString()及其重载版、GetErrofInfo()和IsValid()函数需要设计为一个virtual函数,为该类派生出TDateTime(即增加时间因素)做准备。

还有,IsThisLeapYear()可以直接调用后面定义的静态函数IsLeapYear(),这样既节省了代码也节省了测试,该函数用于判断当前类的对象是否为闰年。

补充,ToString()还需要设计一个重载的函数ToString(char ch),表示输出制定分隔符的日期字符串,例如:ToString(….‟)输出2015.06.20或ToString(…/‟)输出2015/06/20。

需要指出,在实例化一个TDate对象后(即创建一个TDate对象),如果IsValid()为false,那么在函数中规定:如果是void型则不做处理直接返回,如果为bool型则直接返回false,如果为int型则直接返回0。例如,void AddDays()函数第一条语句就必须做IsValid()判断,如果为false则renturn。但是,两个静态函数不受这个约束,因为静态函数与当前类的实例没有关系。

2)两个构造函数

需要设计两个构造函数,一个是无参构造函数TDate()以及以int型年月日为参数数据的构造函数TDate(int year, int month, int day)。其中,无参构造函数取当前机器日期的年月日为该对象的年月日数据(如何取当前机器日期?网查)。

需要指出,有参构造函数中,需要对年月日参数做有效性判断:年必须大于等于1且小于等于9999,月日则按常规的判断。如果参数无效,此时需要设置errorInfo的字符串型值,该值描述日期错误原因,比如:“1000年2月不能有29号”,“月份数不能超过12”,等等。错误信息描述以清晰、准确和简短为基本要求。

3)两个实用的静态函数

需要实现两个与类实例无关的静态函数,即bool型的IsLeapYear(int year)和int型的GetDaysInMonth(int year, int month)。其中,IsLeapYear()判断给出的年份是否为闰年(错误年份时也返回false),例如:2012返回true、1000返回false、0返回false。GetDaysInMonth()则返回指定年月的天数(错误年月时返回0),例如2012年2月时返回29、1000年2月时返回28、0年2月时返回0。

需要指出,静态函数在使用时不需要创建类的实例对象,直接用类名调用即可获得结果,例如:TDate.IsLeapYear(2012)。

相关文档
最新文档