OOP第一次博客作业
1.前言
总结三次题目集的知识点、题量、难度等情况
初次接触Java
第一次的Java大作业是我第一次接触Java并且利用Java进行面向对象的程序设计,相对与C语言而言Java多出的对象和其相应的成员方法和成员变量,在初期让我对对象的方法的设计和多个对象的交互的实现头大,虽然C语言的封装函数有点像,但是实现却是大相径庭,特别是不同的类的对象的关系设计,这点在面向对象的程序设计中很重要,大概也算是和C语言这个面向过程的语言最不一样的地方之一吧。
涉及知识点
类与类之间的关系,HashMap<>,List,ArrayList类;
难度吐槽(bushi)
oop-2024-上-1:(与万恶的答题程序的初次照面),刚刚开始也还好,算是熟悉Java并将其第一次实际运用的过程
oop-2024-上-2:因为题目乱序输入引入了HashMap<>,多了很多判断,对题目信息的储存和处理判断需要更细节了,因此要自行根据自己的代码增加题目中没有提及的方法和变量
oop-2024-上-3:(真神降临)这道题说难吧也就像上面1到2增加了一些功能,而这些功能的实现也可以用平时生活中思考的逻辑来解决,但是要说不难吧我也没有拿满分,应该是因为输入的字符串的自由度越来越高,对其的切分录入判错以及对正则表达式的运用要求变高了(再加上模糊不完整的样例和描述),对字符串的输入处理确实有点伤脑筋。
2.设计与分析
对题目的提交源码进行分析
oop-2024-上-1 7-5
UML图
耦合度
小结:
在这道题目中类设计比较简单,对象关系也没有很复杂,稍微让刚刚接触Java的人费解应该就是题目类和试卷类之间的聚合关系了吧。
这道题总体来说就是用来熟悉Java中面向对象的程序设计的思想。最开始我对题目的切分输入并不数值,对于信息的输入无从下手,从文心一言上面找了一些灵感(bushi)后了解到了spilt这个String类的方法的妙处,当然有些时候不好找用来split的公用字符串时用同为String类的substring方法加上indexOf定位也是切割字符串的一大利器,我也在第二次作业中运用了。
而对于切割完的信息的储存则需要用到ArryList<>动态储存数组的方法来储存(当然你也没有在我的对象设计中看见这个方法,因为刚刚开始我也不知道有这个方法就硬头皮用了静态数组在加上len++实时记录输入的信息模拟动态数组,后面的迭代也是破罐子破摔,继续用了,实在不好修改,显然用动态数组是上上策)。
本题踩坑:
1、在main方法中创建对象数组之后没有对其数组中的对象又创建实例,导致引用错误。
2、习惯直接在pta写代码(因为之前C语言作业都比较短),导致最后在提交时出现了好多个拼写错误和符号错误,要集中修改好久,遂转到外部编译器。
oop-2024-上-2
UML图
耦合度
小结:
这道题最大的不同看以及其难点在于增加的试卷成绩的判断,题目乱序输入。这在处理初始数据时就要考虑如何处理成绩的储存计算,以及题目乱序后的读取,而这里的题目类就需要用到HashMap了,因为是乱序输入,题目号和题目本身又具有关联性,就可以通过题号而不是储存顺序来获取输入的题目信息了。
对于成绩类的储存因为是一张试卷有自己不同的成绩设定大小,我就把成绩列表储存在了试卷类中。
本题踩坑:
在处理答案缺失的时候理解错误题目,仅将answer is null输出一次,不是缺多少题就输出多少次,导致一直卡着一个测试点过不去,感觉是题目描述不清楚(附上原文:如果输入的答案信息少于试卷的题目数量,答案的题目要输"answer is null"),所以要自己多创建几个样例试一下。
oop-2024-上-3 7-3
UML图
耦合度
小结:
首先我没有过掉所有的测试点,但是我又过掉了所有的样例,这大概也和上一道题有类似的原因(题目表述不清楚或者理解错误或者自己创建的样例不够),最后直接卡死,无从下手,导致2小时就只过掉一个测试点,那就在这里暂且留下自己的问号吧。
这道题最让我感到抓马的是在引入错误格式判定之后更加复杂的字符串切割和随之出现的正则表达式。首先是正则表达式,像题目类#N的输入是固定的,正则表达式就按照这种思路来,但是像#T这种有一定规律增长的字符串的正则表达式让我眼前一黑,后面依靠同学讲解才解决了(用括号设置捕获组,用*让捕获组中的其中一段增长),所以在学习过程中和同学交流也是有很大的帮助的。
刚刚开始做这道题的时候因为题干相当长,需要判断特殊处理的小地方也特别多,在上手写代码的时候非常乱,感觉处理不过来。其实最终要的是对各种类和对象之间的设计,理解设计好了它们之间的关系后才是处理增添这些小方法,为了防止混乱我是顺着题干的要求的顺序写的。
然后这道题虽然又增加了很多判断,但是解决思路也是和上一道题大差不差,在这里我采用的大多数是遍历,查看相等或者遍历记录序号相同的对象的信息,虽然数据一多时间复杂度也就上去了,暂时还不知道是否有算法能够优化,那就在这里暂且留下自己的问号吧。
本题踩坑:
(虽然到最后都没有跳过所有的坑,但还是厚脸皮写下跳过的坑之前的踩坑经历)
使用下标实现映射时候老是用数组下标作为键的题目编号来寻找键值,其实键是在数组下标的基础上还要加一。
而对于学号是否引用正常,试卷题目是否存在,是否删除的检查我都是通过遍历寻找,然后在对应检查对象创建一个成员变量来存存是否存在的信息,在随后的遍历的时候检查相应的点就可以了。
3.编码改进
对相应题目的编码改进给出自己的见解,做到可持续改进
在迭代中发现的问题:刚刚开始的时候因为代码和类比较少,没有发现这个问题,在逐渐迭代的过程中成员变量不断增多,给变量取名相似度越来越大,经常出现在要使用一个对象的成员变量的时候回过头去找看见取名相近成员变量名字不知道实际上是什么,又要花时间看它们在方法中实际上代表着什么。所以到后期我都将所有类中的成员变量写上注释,说明其实际意思(血的教训)。
编码平台:做C语言作业的坏习惯了,直接在pta上面写代码调试,但是Java的代码量直接咻咻上涨,最后写完再来修改直接50多个报错,后面转战eclipse,一边写一边报错一边修改,还能轻松直接跳转到相应的类中,不用像在pta上面苦哈哈的几百行翻来翻去了,eclipse万岁!!
编码思路:与面向过程的程序设计不同,面向对象的程序设计不仅要考虑解题的大体步骤更要设计好在解题过程中的对象与对象之间的关系以及相互作用,前期因为我没有怎么思考对象之间的关系导致写着写着就要卡住。所以在进行代码的设计之初就要想好对象之间的关系。
4.总结
对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见
课程建议:在Java课程中有极大一部分时自学,学生在书上就需要提前预习Java的课程内容,老师再在课上讲一遍又起到了巩固知识点的作用,但是知识点终究是零散的,希望老师在一个模块结束以后为我们讲解相应的实际程序(其实就是Java大作业有点困难,想感受了解一下老师如何设计的对象,拓宽一下思路)。
学习方式:我认为在写作业的时候同学之间的交流太少了,希望增加晚上实验课的时间,特别我作为女生有效交流对象也比较少。而有些时候有些关键部分的代码死死卡住,就是差那一点的知识点没有收集到(比如前文提到的#T的正则表达式的表达),这就需要和同学相互学习(当然,查重系统摆在那里,抄袭是不可能抄袭的)。
作业:对于作业我深感痛苦,最后一题从空白卷开始测试点都过不了,而所有的样例都过了,包括乱序输入的样例十但是后面的乱序输入的测试点都过不了。我的程序是按照样例来修改的,反过来说没有样例的测试点我把握不不了细节(因为pta检测答案要求格式输入一模一样),我可是大致实现测试点的要求,但是估计就是因为细节不相同为过不了,希望老师尽量对于每一个测试点的输出格式给一个详细的介绍(如果每一个测试点都有一个样例就好了),当然老师想要锻炼学生的自测能力就另当别论。
5.后言
还是谢谢老师和助教,基本学生有什么问题都会回答,尽心尽责。