OO第一次blog作业

OO第一次blog总结作业 

前言

答题判题程序:针对与pta上的3次作业,主要考察的是javabean类的设计,类与类之间存在的联系的设计以及正则表达式的学习与书写。除了第三次作业的测试点不完善需要一个一个自己去猜测试点外,大体设计上是不难的,题量也是规规矩矩(其实除了最后一题,其他都是送分题的:))。最重要的是在第三次作业当中,是无法理解一些测试点的得分要素的,在这次作业中得了97我感觉是十分的不容易的,特别的最后一个测试点死命就是测不出来,感到有些绝望。对于一直贯穿三次作业最重要的我觉得是judge方法,以下会对其进行一些说明补充。

设计与分析

第一次作业

类图:

耦合度:


由于改题目较为单一简单,只是对单一题目的判断正误,我就只设计了一个除Main类外的Question的javabean类。然后用switch来接受输入的line信息然后逐一进行信息处理,然后主要的判题过程与以及switch过程,我都是写在Main当中的,因为比较简单第一次作业,所以思路也是迸发出来,一股脑就将作业写完了,导致Main类中的耦合度较高。

第二次作业

类图:

耦合度:

第二次作业完善了试卷类以及答卷类。这次的作业因为设计到了多张试卷以及答卷的情况,所以使用了大量的集合来存储信息,在试卷类中也采用了集合来封装问题。每个试卷对象都可以用ArrayList集合来存储题目类创作了使每张试卷对象都可以拥有独立的题目,在此之前也是在Main中创建了questions的集合,所以可以通过题号来找到题目,以此来创建试卷对象。关于空格问题,我觉得这是这次作业中最有挑战性的一个难题(其实归根结底就是对正则表达式的抉择),因为可能会存在不规范输入,所以我们要屏蔽空格带来的干扰,并从line输入中匹配出有效的信息。

最后在第一次作业的基础上我对判题过程以及输出过程都写成了一个judge方法,但可能嵌套过多,思路耦合严重导致复杂度比较高的,对比第一次作业大体上是没有太大改变的。

第三次作业

类图:

耦合度:

这次的作业是前两次作业的综合,相较于第二次作业难度是直线上升的。暂且不谈测试点多且分类较为散列,而且测试点的提示不够明显,虽然知道这涉及了现实中客户的需求大多数情况下会描述不清,需要我们去猜测(但还是能够理解的:))。

1.这次作业增加了学生的学号和姓名以及删除题目这一功能。这其实还是比较好添加的,我只要创建一个新的javabean类的Student类并且在Main中继续用ArrayList去装载从输入信息中读取到的学生信息。

2.其次还有相对于第二次作业更加丰富化的错误格式判断,由于相对于第二次作业错误判断的单一及这次作业的复杂化,我对错误格式判断也是添加了isWrong的方法去判定输入的line,这里是涉及了更加细致化的正则表达式的判定并且需要自己去摸索,这里是耗时比较高的。

3.针对第三次作业的输出更加细致化和对题目会有可能删除和引用错误的可能出现,也是在Main中建了一些集合来装载,并且有相应的方法去判断并在judge的核心方法中去实现判断后输出不同的结果。

4.最后完善了答卷类。我在这里面加了一个学生对象的属性作为答卷人,这个是需要从Main中的学生集合中去搜索的,否则输入not fine。

踩坑与心得

踩坑

第一次作业的坑点

这里的坑点是比较少的,我甚至不知道我这个算不算坑点:)。当我看到这个样例7中的#N: 1 #Q: 5 +5= #A:10的时候,我一开始就觉得这道题不简单了,可能会涉及到很多的输入格式判断问题的出现,于是乎我便用了好多的正则表达式去不断地匹配啊。(由于是第一次作业,说实话正则表达式在当时是比较懵逼的,可以说的闻所未闻)到了提交完后看到满分也是比较开心的(功夫不负有心人的),但是舍友却告诉没必要考虑那么多时(:)心里也是晴空霹雳)。总的来说,题目逻辑时非常的简单的,没什么好讲的,毕竟这才是第一次作业,难度偏低,当时也只是多想了一些东西的而已,但我没想到的时在后面给了节省了很多时间的。

第二次作业的坑点

这里相较于第一点我踩了两个坑点

  1. 出现了集合访问越界问题(这是一个比较常见的问题了)

我的解决方法如上图所示,每当给AnswerPaper答卷类添加问题给Integer类型的score集合时,未给该题目赋予分值(在未答题的情况下是都赋予0的)

  1. 一开始我是为Question题目类的每一个题目对象都赋予了分数score的成员变量的,后来才发现每一张试卷的题目所给予的分数都是不一样的,才从该类中删除了score这个成员变量并且在答卷类AnswerPaper中用了ArrayList来装所有的成绩

第三次作业的坑点

讲到这里,也只剩下:) 因为坑点是比较多的而且考虑的东西也是指数级递增

  1. 从一拿到题目开始,题目相较于前两次作业已经是大变样了,我感觉。我一度认为可能我的代码要大改了,因为前面的架构没有搭建完善。

考虑的东西(审题):

  1. 首先我想到的是大改了对输入格式的判定

我就在想我这个获取第二个字符(就是#后面的那个字符,是判断输入line的类型的标志)会不会被好多个空格给我隔开,导致我输入的line第二个字符不是类型判断标志(这是我当时最后怕的地方)。

  1. 其次我想到的是如果我的问题在加入题库之前会不会出现在这之前有试卷出现过这道题目,那这道题目到底算是不存在还是存在呢,在这里也是迟疑了蛮久的。好在后面老师提醒了不会出现这种情况我才放心书写代码。
  2. 最后就是总分的计算。这里有两个地方没表述清楚,一是关于被删除题目要不要算进总分中,二是引用错误的题目要不要算进总分内。我是十分的不理解的,好在后面有同学的指点:(这道题目既然出在了试卷上,说明总分已经加上了这道题目的分数了的),也是恍然大悟。
  3. 从这里开始我就已经开始提交代码了一提交好家伙28个测试点,一开始我只是拿了部分分还有5个测试点并没有通过,一个是isWrong方法中对错误输入格式判断有一个没有拿分,于是我仔细往回找,终于是拿到了这3分。

还有两个是空字符的两个测试点,我在想啥是空字符啊,空字符不就是没有问答这个问题吗?answer is null???为什么我没有得分呢,我考虑了很久,我一直以为是正则表达式出了问题。后来在查阅了一些资料后我才知道了啥是空字符和null之间的区别(顿时觉得自己好(′д` ))

最后两个测试点是若在答案中出现空格应该要屏蔽的情况,我这里是没有拿到分的,是在该作业结束狗去问满分的同学才知道的,在后面的补练当中也是成功获得了满分。

心得

在前两次作业中其实乍一看是没啥大问题就是丰富了自己的代码经验。而第三次的作业是真的难度飙升,我感觉提升最多的就是对正则表达式的理解以及知道了其对字符串的作用是有多么的巨大,对我们这些程序员的是多么锋利的利剑。明白了空字符“”以及null的区别。更懂得了团结合作的精神(:)当然我指的不是去抄袭,而是互补,相互的分享自己对测试点的探索经历和测试点的猜测)。

改进与建议

减少耦合度,要求尽可能地减少类之间的依赖从而使得代码更容易维护和扩展,可以仔细设计代码模式来解耦。这是我从我的类图和耦合度分析图当中得到的结论以及相处的方法建议。其中最有说道的就是judge方法了,这个方法是贯穿了我所有思想和功能的方法,我把好多东西都塞进去处理了并且有三重循环以及各种的if else判断。在这之后我会先分析画出类图之间的关系后,再去写代码,尽可能做到可单一功能的原则。

总结

从C语言到java,意味着从面向过程到面向对象。这其中的跨度是可以想象的,这是一种从思想思维方面的转换。在这3次的pta的作业当中,其实体会最深的就是oop面向对象的思维体现。所以我知道了面向对象编程的重要性:通过完成大作业,我深入理解了面向对象编程的核心概念,包括类、对象、继承、多态等,意识到了它们在软件开发中的重要性。完成大作业是一次实践编程技能的过程,通过实际动手编写代码,加深了对编程语言和相关工具的熟悉程度,提高了编码能力。完成这次作业的路途是艰难的,但它会给予我成就感和自信心,激励我继续努力学习、不断进步。(如果可以的话,望老师手下留情,可以适当多给我一些样例:))。

posted @ 2024-04-21 22:52  guotianxiang  Views(11)  Comments(0Edit  收藏  举报