PTA作业 答题判题程序1-3 总结Blog

**前言**

  前三次PTA大作业包含多个小题总体,其中每次PTA的最后一道题是由一道题目的不断迭代而来,总体考察了类与对象的理解、正则表达式的使用、数组的使用和字符串的处理等多种知识点;从题量来看,虽然题目数量不多,但是难度却不小,尤其是最后一题,题目难度较以往突然加大的同时题目信息也增加了,确实是入学以来第一次一次性接受这么大量的题目信息来进行代码的编写,三次作业的代码总量也接近一千行;从难度来看,除了第一次的PTA的作业,后两次的作业由于涉及到更多的知识点,测试点测试的方面更加地细致,为题目增加了不少难度;同时,第三次PTA的日期类,第二次PTA的链表的使用,相较于上学期的C语言也有不同。尤其是日期类的使用,是C语言的所没有接触到过的,需要重新学习。

 

**设计与分析**

题目大致信息如下: 

7-3 答题判题程序-3
分数 80
单位 南昌航空大学

 

设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-2基础上增补或者修改的内容,要求输入题目信息、试卷信息、答题信息、学生信息、删除题目信息,根据输入题目信息中的标准答案判断答题的结果。

 

  第一次PTA作业由于难度较低,这里不做分析,重点放在后两次作业上;

 

  第二次PTA作业在第一次基础上增加了试卷类,要求根据试卷所引用的题目去寻找对应的题目和答案,判断对错,并按照相应的分值进行赋分汇总并输出;除此以外,还增加了多种异常信息的输出,比如试卷不存在,试卷总分值不满分等等,从难度上比第一次有了较大提升。

  第二次PTA类图设计如下:

  IMG_256

  在第二次PTA的设计中,我只延续使用了第一次pta中的三个类而并没有增加诸如判断,输出的类,这使得我的主函数融入了许多功能,是我以后需要改进的地方。

  在主函数中,我首先对信息进行输入并存储在字符串数组中;在信息全部录入完成后,我再依次对每行字符串进行解析,并将其传入对应的类中(Question,Answer,Paper)存储;所有解析工作完成后,再依照Paper类中存储的试卷号顺序,依次去对应的题目类中去寻找题目,标准答案,去答案类中去寻找作答信息,加以判断并输出相应的信息。

 

  第三次PTA在第二次的基础上加入了学生类,删除类和错误格式的问题,还进一步增加了异常信息的输出,比如学生信息不存在,各种信息格式错误等等,难度进一步加大。

  第三次PTA类图设计如下

 

IMG_259

  在第三次PTA中,我重新规划了我的类的设计,引入了几个新的类来替代我的主函数暂代的功能,比如Controller类:用于进行字符串的解析;View类:用于输出;Student类:用于存储学生信息;Delete类:用于删除信息等,由此,我的主函数最终只承担了输入的工作:

IMG_260

  在我的设计中,我先将所有的信息全部读入并处理,随后依次解析,按照解析完成之后的结果分类存入五个不同的信息类当中;对于错误的信息,在没有被任何一个正则表达式匹配到后输出错误信息;对于删除信息,我选择将其放在最后解析,避免出现删除信息在题目信息之前出现的情形。

  在全部的解析完成之后,程序在答案类中依次寻找对应的试卷并进行相应的判断和处理,然后依次输出。在输出的过程中,我常常会使用一个方法的返回值作为另一个或多个方法的参数使用,这种方法虽然使得我的参数的使用更加方便,不需要额外定义一个变量来存储可能只使用一次、或者变化较频繁的数据,但也大大降低了代码的可读性,难以后续理解并修改,这是后续设计中需要考虑并改进的地方。

  但是尽管我的主函数的功能比较单一,但我各个类之间的方法还是显得比较复杂,比如,在View类的方法中,我就直接完成了正确答案输出,答案不存在的输出和答案被删除信息的输出,这对于程序的修改也是非常不利的,在下一次的PTA中,我会尽可能改善这个问题。

 

**踩坑心得**

  在第二次PTA的初次编写完成后,我的提交通过了大部分测试点

  然而,在初次完成后有几个测试点一直无法通过。

IMG_257

  在与同学讨论后,我才明白了我理解错误了题目的输出信息,按照正确的题目意思,输出时需要按照答案的出现顺序去一一检索试卷,而非按照试卷去匹配答案,这使得我的异常信息“The test paper number is not exist”这个信息的输出时机不正确。

  重新缕清思路后,我认识到原先的代码设计在核心逻辑上存在一些问题,这导致我无法通过最后一个测试点。尽管我尝试在原有代码上进行修改,试图修复这些问题,但每次修改后都发现新的问题涌现,仿佛陷入了一个无尽的循环。

 

  每次修改后的代码,我都满怀期待地提交测试,但结果总是令人失望。我开始怀疑自己的编程能力,甚至对编程这门学科产生了深深的挫败感。那种道心破碎的感觉,让我几乎想要放弃。

 

  然而,我深知放弃并不是解决问题的办法。于是,我决定重新开始,重新设计整个程序的架构和逻辑。我花费了大量的时间,仔细研究题目的要求,分析每一个测试点的意图,确保自己对题目的理解准确无误。

 

  在重新设计的过程中,我更加注重代码的可读性和可维护性,更加注重异常处理,确保程序在遇到错误时能够给出明确的提示信息。

 

  经过接近一个小时的返工努力,我终于完成了新代码的编写。当我再次提交测试时,心中充满了忐忑和期待。幸运的是,这次我的代码通过了所有测试点,包括之前一直无法通过的那个。

 

IMG_258

 

  在第三次PTA中,由于错误格式的出现,对正则表达式的使用要求更加严格,一旦有某个错误的点没有考虑到,不仅会导致这道题的答案错误,还会影响后续的信息拆分,录入,导致多种错误,使得分析错误原因更加困难;我在前期的提交中由于正则表达式使用不正确,不规范而导致有许多错误格式的测试点过不去,不得不临时补习相关知识和与同学交流。

  同时,后面几个测试点中的乱序输出问题在一开始我也没能理解,不过在后续老师的补充说明后我理解了题目意思并修改了我的代码。

  在完成了以上测试点后,还剩下最后一个测试点我一直寻找不到错误的地方,让我很是苦恼;在作业的最后一天,在与同学讨论后,我才明白没有考虑过在题目,答案前后出现多余空格的问题。这个错误导致了我差分后的字符串中不仅包含了答案内容,还包含了多余空格,在使用eqauls语句判断答案是否匹配时出现了问题。为此,我在各个类中增加了删除字符串前后空格的代码,终于通过了所有测试点。

  

 

**改进建议**

  1.类的方法设计复杂,多种功能混合在一起

  在第二,第三次PTA中,我的五个信息存储类中,只是用了一个setter方法来拆分录入信息;而在View类中,也同样只用的一个方法来输出所有的信息,包括正确答案,答案缺失,题目不存在,题目被删除,试卷不存在等多种问题。在下一次的作业中,我应当适当的将这几个方法拆分成多个方法,这样不仅可以缩短每个方法的长度,使得方法的职责更加单一,同时也可以增加可读性。

  2.多余的重复判断

  在第三次PTA中,由于一开始的正则表达式使用不正确,于是我在每一个类当中再次进行更加细致的错误格式检测;而这个问题在修改了正则表达式后已经得到解决,各个类中的错误格式判断,包括返回格式是否错误的方法已经无用,在下次的PTA中可以考虑删除该部分的代码加以修改。

  3.不同类中使用同名或名称相似的方法,容易造成混乱

  在一开始写代码时,为了方便,将许多序号类都命名为number,将标准答案和答卷中的答案都命名为answer,这使得我在后续编写代码时常常会出现多个number或answer的方法名,虽然其都加上了特殊限定前缀来加以区分,但是在后续的编写和修改中还是造成了许多不便。不过好在这个问题只是表层,不涉及到代码本体的问题,只需要后续多加注意即可。

  4.缺少注释,在后续代码的修改和讨论中不利于分析

  由于以往的题目没有这么复杂和需要频繁修改的情况,因此在初次写题的时候没有想起写注释,这实际上对我后续的修改产生了一点影响,更重要的是不利于我和同学们的代码交流。在下一次的PTA作业中,对于重要的函数、类和方法,我应该在开头添加简要的说明,解释它们的作用、输入参数和返回值。对于复杂的代码段或逻辑,我也应该在关键位置添加注释,说明代码的工作原理和为什么要这样写,才能便利代码的维护与修改。

 

**总结**

  经过前三次PTA大作业的洗礼,我深刻体会到了编程实践中的挑战与成长。这三次作业不仅考验了我对类与对象的理解、正则表达式的使用、数组的使用和字符串的处理等知识点的掌握程度,还锻炼了我的问题分析与解决能力。

  在第一次PTA作业中,由于题目相对简单,我较为顺利地完成了任务。然而,随着后两次作业难度的逐渐加大,我遇到了越来越多的挑战。第二次作业中,试卷类的引入以及多种异常信息的处理,使得我需要在设计时更加周全地考虑各种情况。尽管初次提交后大部分测试点通过,但在“答案的出现顺序去一一检索试卷”这一理解上的偏差,让我意识到自己在审题方面还有待加强。

  在第三次作业中,学生类、删除类和错误格式的处理等新增要求,使得问题变得更加复杂。为了应对这些挑战,我重新规划了类的设计,引入了新的类来分担主函数的功能,使得代码结构更加清晰。然而,在方法的调用和参数传递方面,我仍然存在一些不足,导致代码可读性降低。这也提醒我在未来的编程实践中,需要更加注重代码的可读性和可维护性。

  三次的PTA中有两次因为误解题目信息而导致需要大量修改,使我深刻体会到了审题的重要性。只有准确理解题目要求,才能避免在后续的开发过程中出现方向性的错误。此外,我也认识到了团队合作的重要性。在与同学讨论和互相帮助的过程中,我能够更快地找到问题的症结所在,从而更快地解决问题。

  回顾这三次PTA大作业的经历,我收获了很多宝贵的经验和教训。在未来的编程实践中,我将更加注重审题、注重代码的可读性和可维护性、注重团队合作和互相学习。同时,我也会保持谦虚和进取的心态,不断挑战自己,努力提升自己的编程能力和问题解决能力。

 

**写在最后**

  三次PTA的作业不是学习终点,后续还有一共六次的PTA作业需要完成,从前三次的作业来看,后续作业的难度亦当不会简单,希望在今后的学习中,能少一分迷茫,多一分坚定;少一分慌张,多一分从容。提前学习相关知识,做到步步为营,稳扎稳打。

  

posted @   ming_oo3  阅读(321)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示