01--日期抽象数据类型设计与实现
1.思维导图及学习体会
1.1第一章绪论知识点思维导图
思维导图如下:
1.2 学习体会
寒假玩疯了,没有看视频,很少打代码,以至于刚开学的时候没跟上,看书看的吃力,听课也很懵逼,还好现在调整过来了。
上学期学的C语言是数据结构的基础,数据结构就像是把C语言的语法连起来使用。比起上学期按题目要求打代码,我们现在更要考虑代码的时间复杂度和空间复杂度,要思考如何让代码达到最优,这个比单纯解决题目要求更难,这个也是我们这个学期学习的重点,也是我们应该投入精力的部分。
2.大作业
2.1 设计日期的ADT类型
ADT Date{
数据对象:D={year,month,days|year,month,day属于int类型}
数据关系:R={<year,month>,<year,days>}
数据操作:
Status InitDate(Date &date,int year,int month,int day);
//初始化日期
//操作结果:构造日期数据结构Date,其中 year, month, day分别为日期的年,月,日
Status DestroyDate(Date &date);
//初始条件:date存在
// 操作结果:销毁date
string Style(Date date);
//初始条件:date存在
// 操作结果:将int类型日期转变为字符串,并返回年年年年-月月-日日格式
Status IsLegal(int year,int month,int day);
//初始条件:year,month,day存在
// 操作结果:判断日期是否合法,若合法返回OK,若不合法返回ERROR
Status IsLeapYear(int year);
//初始条件:year存在
// 操作结果:判断年份是否为闰年,若是闰年返回YES,若不是闰年则返回NO
string WeekDay(int year,int month,int day);
//初始条件:year,month,day存在
// 操作结果:判断日期为星期几,并返回星期字符串
string Month(int month);
//初始条件:month存在
// 操作结果:返回月份的英文
string AddDate(Date date,int addDays);
//初始条件:date存在
// 操作结果:求出增加天数后的日期,返回该日期的字符串
Status CompareDate(Date date,Date otherDate);
//初始条件:date,otherDate存在
// 操作结果:比较日期的大小 ,按两个日期之间的逻辑关系返回1,0,-1
2.2.数据抽象:头文件)
Common.h
存放自定义数据,使整个代码的可读性大大提高
Date.h
2.3数据封装说明
(1)构造日期数据结构函数
做法:申请内存,构造三元组date
(2)销毁日期数据结构函数
做法:用C++语法销毁
(3)固定日期格式函数
做法:将int类型日期转变为string类型,并进行拼接
(4)日期合法函数
做法:首先确定month的最大天数,再与day进行比较
(5)判断闰年函数
做法:满足能被4整除且不被100整除,或能被400整除的年份即为闰年
(6)星期判断公式
做法:利用基姆拉尔森计算公式计算星期几 ,并返回对应字符串
(7)月份英文函数
做法:switch语句
(8)增加天数函数
做法:先算年份,再算月份,最后算日
(9)比较日期函数
做法:先进行年份相比,若年份相同再比较日
3.结果展示
小黑框
input文件内容:
out文件内容:
4.调试碰到问题
-
Q1:在将int型的日期转变为固定格式的时候,strcpy,strcat,strcmp,被视为错误(我用的是C++语法)
-
A1:在C++中,strcpy等函数是不安全,可能造成缓冲区溢出。有两种方法:
一是新建项目时不要勾选安全开发生命周期检查;二是在项目属性C/C++命令行中加上 /D _CRT_SECURE_NO_WARNINGS。(不过我嫌麻烦直接改用C++中string类型的用法) -
Q2:对C++语法的不熟悉。
-
A2:我事先在网易云课堂上看了C++基本的输入输出和申请空间、释放空间的视频讲解,但C++中还有很多超级好用的隐藏函数和类型,比如string类型可以直接用+、-来进行字符串的连接,等等。还有很多好用的函数等着被发现。
-Q3:函数传入date(无&,并执行函数),但是返回主函数是date里面的值已经被改变了,这是为什么?
-A3:???还是不是很懂。