PTA三次作业总结Bolg
一:前言:
1. 知识点总结:
①:java面向对象类和对象的基本用法
②:关联类和依赖类等类间关系
③:正则表达式的运用
④:Comparable接口和日期类的基本使用
2. 题量:
适中,每次题目集不超过5题
3. 难度:
较大,特别是每次题目集的最后一题,难点在于正则表达式的运用及类的设计,就比如你应该设计几个类,类间关系是什么。
二:设计与分析:
第一次题目集:(只分析最后一题)
1. 类图设计:
我创建了三个实体类,分别是Answer,Examination,Title,分别表示答卷,试卷,题目,题目与试卷是组合关系,试卷与答卷是组合关系
2. 源码分析:
1、源码信息:
代码行数:249
语句行数:141
分支数占总语句数百分比:16.3
方法调用语句数:35
注释语句占总语句百分比:0.8
类和接口数:4
最复杂函数的复杂度:15
平均深度:2.21
最大深度:5
平均复杂度:1.77
由上图,红色线表示当前的情况,在绿色范围(所推荐的java良好代码,如平均复杂度在2.0-4.0之间)表示良好,可知当前代码在注释语句占总语句数的百分比(Percent Lines with
Comments),最复杂函数的复杂度(Maximum Complexity)和每个函数平均包含的语句个数(Average Statements per Method)不合格。
2、源码思路及问题:
思路:首先在Main类中创建三个列表,分别是题目,试卷,列表,用来接收输入的三种信息,在输入一行信息,通过判断第二个字母来判断输入的是什么信息,在去截取内容信息。然后创建题
目对象存题目信息,创建试卷信息存题目及本身的信息,创答卷对象存试卷及本身的信息;全部输入完后在去判题及输出,这两个方法我是写在答卷类里的。
问题:在截取信息时我的代码是存在严重问题的,因为我是截取后立马存储到列表去,我的并不能无序输入,我能过这题的测试点只是本题未测而已,还有判题方法及输出方法也不应该写在答卷类中。
第二次题目集:(只分析最后一题)
1. 类图设计:
与上一次题目集一样,我这次仍然是三个实体类,分别是Answer,Examination,Title,分别表示答卷,试卷,题目,题目与试卷是组合关系,试卷与答卷是组合关系,这次在题目类中添加了分值属
性,在答卷类中添加了题目所得分以及所答的试卷编号两个属性,在试卷类中添加了试卷编号这个属性。
2. 源码分析:
1、源码信息:
代码行数:383
语句行数:198
分支数占总语句数百分比:19.2
方法调用语句数:92
注释语句占总语句百分比:16.7
类和接口数:4
最复杂函数的复杂度:20
平均深度:3.46
最大深度:8
平均复杂度:2.03
由上图,红色线表示当前的情况,在绿色范围(所推荐的java良好代码,如平均复杂度在2.0-4.0之间)表示良好,可知当前代码在最大深度(Max Depth),平均深度(Avg Depth),最复杂函数
的复杂度(Maximum Complexity)和每个函数平均包含的语句个数(Average Statements per Method)不合格。
2、源码思路及问题:
思路:大体上与上一题思路一样,只是多了输出错误信息以及要输出题目分值
问题:在这次题目集我仍然没有改掉输入问题,对于测试点中的乱序,我只是满足了题目间的乱序,不能满足其他信息的乱序,能过也只是本题未测而已,并且在这次我搞混了答卷及考生,我以
为答卷类和考生类是一样的;其次,这次的题目集类设计至少要在6个以上,我类的设计还是太少了,在心得体会我会详述我的优化。
第三次题目集:(只分析最后一题)
1. 类图设计:
这次包括主类我总共设计了12个类,相较于上一题我新添加了判断输入信息的类,以及考生类,删除类,输出类,判题类,赋值试卷类,赋值答卷类,删除对应信息的类。
2. 源码分析:
1、源码信息:
代码行数:850
语句行数:441
分支数占总语句数百分比:17.5
方法调用语句数:221
注释语句占总语句百分比:15.2
类和接口数:4
最复杂函数的复杂度:20
平均深度:2.22
最大深度:9+
平均复杂度:5.57
由上图,可知当前代码在最大深度(Max Depth),平均复杂度(Avg Complexity),类和接口数(Classes and Interfaces)和最复杂函数的复杂度(Maximum Complexity)不合格
2、源码思路及问题:
思路:这次有5种输入信息,所以我设置了1个类5个方法用正则表达式来判断属于那种信息及格式是否正确(因为这次加了许多错误格式),然后在存储信息,这次较上次的巨大突破是我解决了所有信
息的乱序问题,我是先输入玩,
然后再去将赋值,为此我创建了两个类一个是给我的试卷赋内容与标准答案类,另一个是给我们的答卷赋答案类,原先这两个操作是在输入时就完成的,这显然不对;然后我创建了判题类,专门用来
判断题目的正确性及得分,最后输出考生信息及分数即可。
问题:尽管这题新加了许多了类,但还是存在许多不足,就比如解析信息,我是全写在主方法里的(尽管我的判断信息格式单独建了类),这就造成了我的主方法冗余,代码阅读性很差,解决方
案我会在心得体会说明。
三:踩坑心得:
第一次题目集:
①:
在本输入样例中,我并不确定到底什么时候去输出试卷不是100分,开始我测试的是在开头,那两张试卷呢,我开始设计的时候是试卷一张一张的处理
于是我用以下数据进行测试
发现输出结果是
也就是说这段试卷不满100分的说明,不论有几张试卷,都应该放在开头统一输出,就测试点而言,格式错误也是过不去测试点的。
②:
在本样例中,我不理解答卷的输出顺序,是按照试卷的题号进行输出还是按照试卷题目的顺序号进行输出
以下为我的测试:
测试结果是答卷的输出顺序是试卷的题目顺序,就比如试卷里是2-5 1-4,我们是输出答卷时就应该是先输出第二题,在输出第一题的结果。
第二次题目集:
这次的测试点与上次相差不是很多,主要的坑在于正确格式输出得分,以下为样例
①:
针对该测试点,首先输出问题及相应的答案再输出判题结果,最后输出得分,得分的顺序也要注意,所以这里的坑在于你输出的顺序,一旦错了一项就会报答案错误,以下为正确:
然后这题就没什么坑了,主要就这一个点。
第三次题目集:
由于加入两种输入及错误的信息输入格式等导致本题的坑比较多
①:
第一个坑就在于5种输入判断,这里导致我分数始终上不去
第一次提交只对了一个测试点,总共28个,开始我并没有意识到输入信息会不合法从而报Wrong Format错误,后来我写了5个方法通过正则表达式来判断格式,但这里就是巨大的坑,问题在于你的正
则表达式怎么写,就拿这段代码来说:
这个匹配就有问题,万一我的学号掺杂英文(合理的),而我的正则表达式却认为是Wrong Format,这显然是错的,包括我的答案也是,我配的是\d+,但是我的答案可以是其他字符,这我想了很久
才想到这个测试点,所以代码的测试很重要,以下为正确的结果:
②:
接下来的问题就在于这个乱序输入怎么去处理,我是创建了两个类一个是给我的试卷赋内容与标准答案类,另一个是给我们的答卷赋答案类,这样可以解决乱序的问题,结果还是过不去这几个乱序的
测试点;
我的乱序就测试结果而言是完全没问题的,但是就是过不了,后来经过一个下午的测试,发现是因为是去首尾空格的问题,就是因为一个小的格式导致错误。
四:改进建议:
第一次题目集最后一题到第三次的最后一题是依次完善的,所以第一次和第二次的我基本上在第三次上优化完了,所以我主要说明下第三次题目集最后一题的优化。
1.截取信息:我应该设计多个类来截取信息,这是可扩展的,因为在后续题目集题目信息等会变化,如果按照这题的思路,那我就要改代码,根据OCP(开闭)原则,这显然不合理,而我可以
根据5种输入信息创建5个主类,根据继承对应的主类创建子类即可,这就可以在不改变代码的情况下应对题目信息的变化。
2.判题信息:目前我的判题是用答卷的答案与标准答案对比,只有满分及0分,万一后续增加了多选题怎么办,分数就可能有多种形式,所以也应该创建判题主类,子类是各种判题方式。
3.输出信息:与判题一样,创建输出主类,子类是各种输出方式。
五:总结:
这三次题目集总共进行了3周,我对于正则表达式的使用更加熟练,比如:在判断答卷时,String regex = "^#S:\d+ \d+(((\s+|)#A:\d+-(.*|\s+|))|)+$",我尝试使用了“|”,这是对于匹配多种的表达,以及还学会了(?:...)这种非捕获组,它的作用是分组,但不会直接捕获匹配的内容并返回,学会了类间组合关系,在第一次题目集我将题目作为试卷的组合,并且还初步理解了OCP原则,从第一次到第三次题目集中,我基本是改代码,毫无扩展可言,因此我学会了继承及多态用来扩展,在下次题目集中将会体现;对于正则表达式和类的设计我觉得我需要进一步的学习及研究,在第一次题目集中我用了大量if,到第三次我基本用的是正则表达式来匹配,它的功能远不止如此,类的设计也是,从在第一次题目中的4个类,到第三次的12个类,类的功能是逐渐单一的,这样才体现可复用性,SRP。对于老师的严苛教导,我非常感谢,线上线下课的结合使我对于类的设计有了初级的认识;针对实验而言,我的意见是能允许我们自主添加一些功能,比如第三次实验,狮子根据战斗力能将大象杀死,我就想自己添加一些功能,比如通过产生随机数,通过这个随机数使得狮子被大象反杀;针对题目集而言,我希望出些常用API的题目来增加我们的知识面。
以上就是我针对三次题目集的Blog,感谢助教组和老师们的辛勤付出,感谢共同讨论、分享的同学!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~