1.思维导图及学习体会(2分)
1.1第一章绪论知识点思维导图
1.2学习体会
1.开学学习了数据结构的绪论知识。按照学习通里面所说的,学好这方面知识的方法是大量编程,Practice makes better !Practice makes better !Practice makes better !重要的事情说三遍。
2.C++的语法刚开始接触就要学着应用,有一点难度。目前我写代码主要是先用C语言写出程序,编译成功后再用C++的语句进行修改。这个方法有点笨,下次努力做到直接就用C++编写程序。
3.C语言的知识有些遗忘,文件和指针方面的知识一开始应用得不好,刚开始看不懂老师发的三元组代码中的初始化。后来重新学习C语言的知识,恍然大悟。
4.开学初节奏有点快,绪论知识还没学完就要开始学习线性表的知识。
2.大作业作业内容 (6分)
2.1 设计日期的ADT类型
ADT Date{
数据对象:
D = {year,month,day | year,month,day属于int类型}
数据关系:
R = {<year,month>,<month,day>}
数据操作:
void NewInformation(Date&date,ElemType year,ElemType month,ElemType day);
//操作结果:构造三元组,year,month,day对三元组进行赋值。
ElemType IsLegal(Date date,ofstream& write);
//初始条件:三元组date存在,文件打开成功。
//操作结果:判断日期是否合法,如果合法在文件output.txt写入正确的格式,如果不合法,在文件output中写入相应的提示。
void IsLeap(Date date,ofstream& write);
//初始条件:三元组date存在,文件打开成功,日期合法。
//操作结果:判断年份是否是闰年,如果是闰年,在文件output.txt中写入是闰年,反之则写入不是闰年。
void GetWeek(Date date,ofstream& write);
//初始条件:三元组date存在,文件打开成功,日期合法。
//操作结果:在文件output.txt中写入相应的星期。
void CoutEnglishMonth(Date date,ofstream& write);
//初始条件:三元组date存在,文件打开成功,日期合法。
//操作结果:在文件output.txt中写入相应的月份英文。
void AddDay(Date date,ofstream& write);
//初始条件:三元组date存在,文件打开成功,日期合法。
//操作结果:用户输入需要添加的天数,计算添加天数后的日期,在文件output.txt写入添加前的日期,增加的天数和添加后的日期。
void Compare(Date date,ofstream& write);
//初始条件:三元组date存在,文件打开成功,日期合法。
//操作结果:用户输入要比较的日期,与原日期进行比较,在文件output.txt.中写入结果。
ElemType NewIsLegal(Date date);
//初始条件:三元组date存在。
// 操作结果:判断日期是否合法,合法返回1,不合法返回0
}ADT Date
2.2.数据抽象:头文件
2.3数据封装说明
(1)构造三元组函数
做法:动态申请内存,分别把3个变量放入数组date中。
(2)判断日期是否合法
做法:先判断日期是否为闰年,确定二月的天数,再判断月份是否大于等于1小于等于12,如果月份小于1或大于12,则判定不合法。如果月份合法,进入下一个阶段,日期与当月的最大天数进行比较,如果小于当月的最大天数且大于等于1,则判定日期合法,返回1。日期不合法,返回0。
(3)判断是否为闰月
做法:根据闰月的判定方式设计算法,判断闰月,在文件中写入相应的结果。
(4)设计星期函数
做法:根据星期判断公式,得出该日期的星期,列举一到星期天,根据运算结果在文件中写入相应的结果 。
(5)设计月份英文函数
做法:根据date【1】得出月份,列举每个月的英文,在文件中写入对应的月份。
(6)计算日期添加函数
做法:用year,month,day储存日期并进行运算。用add储存添加的天数。输出提示语,提示用户输入天数。用一个数组monthDay储存一年中每个月的天数。把用户输入的天数和day相加,获得总天数。如果总天数大于该月的最大天数则总天数减去该月最大天数,同时month加一,如果month>12则year+1,month-12。不断循环直到总天数小于其对应月份的最大天数。值得注意的是,闰年需要不断判定以确定二月的最大天数。
(7)日期大小比较。
做法:一般来说比较日期要先比较年份,再比较月份,最后比较当月的日期。不妨假设一年有12个月,每个月有31天,算出总天数。一个日期年份越大,日期也就越大,相同年份,月份越大,日期也就越大。year>month>day。前面的数对后面的数具有碾压性优势,可以通过前面算出的总天数进行比较大小,最后写入文件。
(8)输入数据是否合法判断
做法:参照函数(2)的做法,除去文件写入。
(9)主函数
做法:负责打开文件,用一个循环不断读取文件达到文件末尾时退出文件,对各个函数进行统筹规划,最后关闭文件
3.结果展示
input.txt
输入界面
output.txt
4.调试碰到问题
Q1:C语言知识遗忘很多,文件和指针的知识几乎不记得。
A1:用了一个下午来复习,边敲代码边看书。回想起一些C语言的知识。
Q2:C语言的应用不熟练,不知道要如何设计一个算法,一直纠结着要怎么样避免文件的不断开闭问题。
A2:参考谢晓松的代码,发现他的主函数设计得很巧妙,居然可以通过循环来解决文件的开闭问题。自己思考了一会儿,想到可以通过传递文件指针的方式来把信息写入文件。
Q3:C++的知识不熟练,代码经常出错。
A3:上面讲到传递文件指针的方式来写入文件,一开始我编写了一个C语言的程序,本想着把C语言的程序中的文件指针变换为C++中的文件指针来达到老师的要求。结果一改变文件编译就出现了错误,跳出了一个新的页面。经过不断地调试和查找资料,发现C++的文件输出流不能像C语言指针那样直接在函数中应用,需要添加引用符&。非常感谢晓松推荐的菜鸟网站,那个网站的C++知识很全,可以帮助我快速学习C++知识。晓松的代码也给了我一个很好的参考。
Q4:没有使用抽象数据类型,函数名命名不规范
A4:已改
Q5:助教提出了一些问题,比如截图不正确,指针没有删除。
A5:已改