目录:
一、关于面向对象
二、三次大作业设计
** 2.1相关知识**
** 2.2类图+大作业实现讲解+大作业时序图**
三、三次大作业中踩坑心得
四、修改建议
五、总的心得体悟
一、关于面向对象:
这个学期是我们第一次接触面向对象的这个概念,在接触java之前,我们所用到的基本上都是面向过程的。虽然在小规模代码上,面向过程比较方便简单,但代码量大起来之后,面向过程就没有这样方便了,同时,面向对象在迭代上有很大的优势,只需要在对应的类中增加功能即可。
三次大作业设计
第一次大作业:第一题相关知识:类的初步实现,私有域的设置,无参构造和有参构造
第二题相关知识:类的初步实现,私有域的设置,无参构造和有参构造
第三题相关知识:类的初步实现,类的数组的使用,学生信息的封装
第四题相关知识:关联类
第五题相关知识:类的初步实现(包括题目类、试卷类、答卷类的设计与实现)、私有域的设置、方法的定义与调用(各类中的方法定义及在程序中的调用)、对象的创建与使用(创建题目类、试卷类、答卷类的对象并进行操作)。
第二次大作业:第一题相关知识:类与类之间的排序,类详细变量的查找
第二题相关知识:类与对象的实现
第三题:简单类的实现与代码补全
第四题:相关类的代码的迭代
第三次大作业:第一题:私有变量与封装
第二题:正则表达式判断题目格式
第三题:正则表达式判断输入是否合法,类的迭代
二、三次大作业作业设计
2.1类图
一次大作业:第一题
第二题
第三题
第四题
第五题
首先,在这个题目当中名为设计了一个Timu类,用于存储详细题目的信息(包含题目编号:number,题目内容:neir和题目的标准答案:answer),在这个Timu类中我定义了三个方法,分别是gettimu,getnumber,pd用于获取带Timu类中的值,pd是检验正确后的输出,方便后续代码的验证和值的打印校对。
然后我设计一个Exam试卷类,用于存放答卷的信息,答卷类中有一个timu数组就是用于存放题目信息的,该类中存在一个addtimu方法,将接收到的题目存到Timu数组当中,一个px的方法(因为我接受到的是从0开始的,所以出现题目顺序颠倒的情况,会输出不一样的结果,所以我加了一个排序,不过这玩意我应该在第一次就把他改成按照题号顺序接收的,后面迭代的时候这一处代码算是败笔,花费了大量时间修改,在第三次迭代的时候,这串部分的逻辑一直不过,最后想推到重来的时候已经来不及了),这里的Exam类和Timu类之间的关系是聚合
同时还有一个Dajuan类,这个类主要用来是处理答卷相关信息和操作的,在这个类定义类一个Shijuan类型的变量,用来存储试卷相关的信息,用来校验答卷里面的答案是否正确。并且定义了一个Boolean数组类型的,用来存储运算结果,这里面有一个方法是saveanswer,用来保存答案,再定义一个checkanswer方法,用来检验dajuan中的答案是不是与timu中的答案一致。再定义一个printQuestionAndAnswer和 printResults方法来打印结果
时序图:
第二次大作业:
第一题
第二题
第三题
第四题
这一次大作业是在上一个大作业的基础上的一个迭代,因为这个时候还不是很了解正则表达式,所以我进行输入的时候没有采用正则表达式的形式,而是采用一遍一遍循环遍历,然后用startWith来判断输入的类型,如:
Timu类在上次的基础上并没有什么变化,Exam类取消掉了排序方法,因为这一次排序不是按照Timu中的编号来的,所以不在这个类中使用排序,这一次迭代,新增加了一个SJ类,用来存储代表试卷号的试卷,SJ类中有sjnum,fs[],t[],sum.sjnum是用来记录有多少张试卷,t[]数组用来记录试卷对应试卷的对应的题号,fs[]是用来记录该题号的分数的,sum用来记录总分
Timu类中一共两个方法,一个是addsum(),用来将该试卷中的所有分数相加,最后来判断是不是满足100分,另外一个是getfs(int i),这个方法能够将对应题号的分数返回,用于获取正确分数的题号。
这一次的Dajuan比起第一次新增了一个方法,是sumfs(),用来将正确题目的分数相加并输出,如图所示:
时序图:
第三次大作业:
第一题
第二题
第三题
这一次迭代在上一次迭代的类的基础上,我新增了一个学生类,还是从Timu类开始看,在这一次的Timu类当中,因为需要用到删除功能,所以对Timu类进行了一定的修改,新增加了一个方法changetimu(int num),用来针对删除时找不到值的timu,如图所示,
同时,为了符合删除题目的要求,对SJ类也进行了一定程度上的修改,新增了一个方法,用于将删除对应的题号的分数归零。新增了一个changefs()的方法,将fs数组对应的值赋值为0。
新增学生来,来符合对于#X的输入,Student类中一共有三个三个变量,一个是存储学号的String数组,一个是存储姓名的String数组,一个记录学生数量的int类型,该类中只有一个方法,findxuesheng(String line),用于查找对应学号的人以及输出。
Dajuan类中新增删除题目的方法deletetimu,用来删除所输入的题目,如图所示:
判断输入是什么内容的时候我也是采用上一次相关的方法,采用循环获取,但这也有个问题,这一次的测试点中存在三个不满足正常输入的测试点,因此还需要增加一个不满足正常输入的判断。如图:
同时,这一次的输入用到了正则表达式,需要使用正则表达式来进行输入的判断。如图:
时序图:
三次大作业踩坑心得
第一次大作业踩坑心得:因为第一次作业中,我是直接按照输入的顺序接受题目来进行存储的,所以就会造成最后输出的题号顺序不一样,因此我增加了一个排序,来对接受到的题号进行排序,排序完后再按照顺序输出,当时本来以为用这个方法能通过后面的迭代的,但在第二次迭代就换了排序的规则,同时,第三次中这个方法暴雷了,最后想重新整理自己的代码,但因为时间来不及,最后没能修改成功。
第二次大作业踩坑心得:这一次大作业给的时间比较丰富,在这一次大作业中,我踩的坑是打乱输入的顺序,原先的的代码只能老老实实按照顺序输入才能起到作用,但这一次迭代中,有测试点是会打乱顺序的,解决方法:我采用了遍历加startWith的方式来采用判断,第一次循环将#N:开头的一个一个存储到试卷当中,第二遍循环将#T的存储到新定义的SJ类当中,第三遍循环处理最终的函数
第三次大作业踩坑心得:这一次大作业踩了蛮多坑的,首先第一坑是输入要用正则表达式,不然很多输入不合规的样例点过不去,其次,这一次的输入还增加了一个所有输入都不满足条件的情况,因此单单使用上一次的输入不能直接满足条件,应该再增加一个判断。同时,在这一次作业中我也遇到了特别难修改的一部分,那就题目中题号对应试卷中对应的不一致,如图:
当出现这种情况的时候,无法得到有效的答案,因此这个测试点过不去,等想要重新建构这部分代码的时候已经来不及了。
改建建议:
1.将这种循环读入判断,从而写进对应类改进成一遍循环,比如这种:
可以将其改成一遍循环,循环后将对应的存入对应的类,减少循环数量
2.将整体输入写进新的类中,减少主函数的负担
如下所示
3.将存入题目的逻辑一开始写好,避免后续迭代造成代码越来越复杂
总结
通过这三次的大作业,我学习到了很多的东西,首先就是java中面向对象的思想,在之前我们写代码基本上是采用面向过程的方法,但通过这几次的实验,我基本上掌握了如何使用面向对象的方法进行编程,学会了面向对象中的设置私有域,学会了面向对象过程中如何通过set,get的方法进行访问,同时,通过这一次的学习,我还学会了java中如何进行链表的编写,并且这几次学习,让我加深了对正则表达式的认识。同时,更加深刻地让我感受到了java在迭代上面的优势。并且通过这几次大作业的学习,我对java中类的封装,继承,组合,聚集等关系的认识也更加地深刻了。在这几次代码迭代的过程中,我还学会了在写java之前应该首先对类进行设计,设计完后绘制是时序图,不然就很容易像我的代码当中,一旦前几次某个地方出现了问题,那么在后续迭代的过程当中,不刻意修改的话,代码量上去之后再一次进行设计就不是一件简单的事情了。