前言
在最近几周里,完成了三次具有挑战性的题目集,每一次作业都旨在深化我们对Java编程的理解和应用。这些题目集的设计不仅覆盖了基础的编程技能,如数据结构的操作和算法的实现,还包括了更高级的软件工程概念,如软件测试、错误处理和优化。通过这些题目,我学会了如何在实际项目中应用这些理论知识。
题目集1-3概览:
知识点:涉及了数组、链表的操作,正则表达式的应用,以及面向对象的设计原则。
题量和难度:题量逐渐增加,难度也从基础逻辑实现到复杂数据处理不断升级。
第三次题目集“答题判题程序-3”特别增加了处理乱序输入和复杂数据结构的要求,显著提升了题目的难度和实用性。此外,题目要求的功能之一是处理和评分学生的答卷,这不仅测试了我们的编程能力,还涉及到了实际的业务逻辑处理,这对于未来的软件开发是非常有益的。
三次题目集的难度并不算大,题量也不算多,逻辑也不算复杂,但想要满足所有需求通过所以测试点的难度可谓不小,尤其是对数据的获取和对错误格式的判定,让我头疼不已,需要仔细分析题目需求以此设计和改进正则表达式来满足题目需求。
设计与分析
第一次PTA作业类图:
第一次的作业较为简单,只需要输入以及处理简单的题目信息和答题信息,再用字符串的比较来输出匹配结果就行。本来只需要题目类和答案类就能完成这道题,考虑到为了后续的改进,我还加入了试卷类。
用Title类用于储存题目信息,并且可以输出题目信息再用Test类将题目信息整合起来,Script类储存答案信息并且与正确答案进行匹配。在Main类中用于处理输入的数据并且输出需要的信息。
第二次PTA作业类图:
第二次作业相较于第一次作业难度大了不少,信息输入方面增加了试卷和答卷信息,由于在第一次作业中增加了Test类,这次作业并不需要新增类,在第一次作业基础上,Title类中增加了score(分数)属性用于储存每道题的分数 ;Test类中增加了num(序号)属性属性;Script类中增加了Test类型的属性,将试卷信息储存在答卷中。
同时,输出对比第一次作业新增了试卷总分警示、答案不存在、试卷信息不存在情况,
因此在Test类中增加了is100()方法用于判断试卷总分是否为100,在Main类的输出中增加了答案不存在,试卷不存在的输出情况。
第三 次PTA作业类图:
第三次作业难度相较于前两题设计难度以及复杂度方面又有了极大的增加。
在信息的输入方面新增了学生信息以及删除题目信息,因此增加了Student类储存学生信息,以及新增了Question类将题目信息分割为两个类,在Question类中增加了isDelete()方法判断题目是否被删除。
在信息的输出方面。新增了题目引用错误,因此在Title类中增加了IsExist()方法判断题目是否存在;新增了试卷号和学号的错误引用,因此在Script类中增加了studentID属性以及isExist用于判断试卷号是否引用错误;以及最重点的新增了输入信息的错误格式判断,在Main类增加了数个正则表达式用来匹配格式正误,以及增加了wrongFormat链表储存错误的信息输入语句。
在本次作业中,正则表达式的设计是重中之重,关系到对输入信息的处理,这也是本次程序的核心。
采坑心得
1、
问题:在第二次作业中,由于读题不够准确,导致对答案不存在的输出部分出现了误解,误解成,当答案不存在时,输出”answei is null”,将其改成对每次的答案判定后才通过了测试点。
心得:读题应当仔细且准确,要准确进行需求分析。
2、
问题:在设计题目删除方面出现了问题。为了解决这个问题我设计了一个Question类,将输入的题目信息和试卷类中储存的题目信息分隔开,这样我只要将Question的对象设置为删除,Title的对象相应的题目也会设置为删除从而实现了题目的删除。
如图直接对,主方法中的questions链表中的数据进行修改以达到删除的目的。
心得:可以设置多个类以实现单一职责,从而更好地实现功能。
3、
问题:在设计题目的分数时我将分数信息储存在Title类中,在读取试卷信息时,直接将对应的题目变量加入到了试卷的题目链表中,由于在赋值时只是进行引用的赋值,导致当存在多张试卷时,同一个编号的题目的引用是一样的,改变了其中一张试卷中的题目的分数,其他试卷对应的题目的分数也会改变。
为了解决这个问题,在将题目加入到试卷的题目链表时,我创建了一个新的Title对象,并且将对应编号的题目对象的信息储存到该对象中,这样就实现了创建了一个相同的独立的对象,而不是仅仅改变引用。
如同所示复制数据而非改变引用。
心得:当想创建一个和现有对象一样的对象时,不能只是用引用赋值,即
对象1=对象2
而是给新的对象赋值成和现有对象数据一样。
4、
问题:在第三次作业中,要对错误格式数据进行处理。为了匹配正确格式,而对错误数据进行处理,我不断修改了正则表达式。
心得:正则表达式在数据提取、数据验证等方面都发挥着重要的作用,是处理文本数据的强大工具,要善用正则表达式。为了验证正则表达式的准确性,正则表达式网站也是必不可少的,可以很方便地验证正则表达式。
改进建议
1、
在主方法中,对数据的输入过于繁杂。
可以将输入数据的数据写成方法,增强代码的可读性和可维护性。
2、
主方法中的输出对数据的引用过于繁杂,可以将主方法的输出方法写入Script类中,强化Script类的职责,降低主方法的圈复杂度。
总结
通过这三次PTA作业,我对类的设计,数据的封装,单一职责原则,以及正则表达式有了更深一步的理解,同时在正则表达式的设计方面需要进一步学习,正则表达式的强大是毋庸置疑的,我相信还有更多地方等着我去探索学习。
在PTA作业方面,我认为在题目的表述方面存在部分问题,在部分地方如对输出的要求以及对数据格式的描述存在表述表述不清的情况,导致我对需求分析存在疑惑或是误解,时常需要去猜测题目的要求,然后根据猜测列举出各种情况,用列举的情况去修改代码,根据测试点的通过来证明猜测。我希望往后的作业对题目的描述更明确些。