PTA题目集7-8的总结性Blog

news/2024/10/5 14:17:16/文章来源:https://www.cnblogs.com/pickupwind/p/18273808

一:前言:

1. 知识点总结:

①:递归的使用

②:java面向对象类和对象的基本用法

③:关联类,依赖类和组合等类间关系

④:正则表达式的运用

⑤:接口的基本使用

⑥:Comparator接口及比较器基本使用

⑦:ArrayList的基本使用

2. 题量:

较少,每次题目集只有1题

3. 难度:

由于题量少,所以每次题目集难度较大,难点在于电路复杂多变的情况,这两次题目集加入了多并联及并联包含并联,这样在计算电流时需要考虑局部短路及断路分压

等特殊情况,这对于分流及分引脚电压带来了多种情况,当然这题的难度也不是太大,因为老师设计的测试点舍去了许多异常情况。

二:设计与分析:

第七次题目集:

1. 类图设计:

这次包括主类我总共设计了22个类,6个接口,相较于上一次题目集我新添加了继承自电器类的受控窗帘和互斥开关类,添加了判断断路,搜索受控窗帘,获取总亮度

和输出接口,都是device类实现他们,然后子类去重写。

2. 源码分析:

1、源码信息:

代码行数:1351

语句行数:769

分支数占总语句数百分比:23.8

方法调用语句数:346

注释语句占总语句百分比:11.0

类和接口数:18

最复杂函数的复杂度:36

平均深度:1.84

最大深度:6

平均复杂度:2.08

由上图,红色线表示当前的情况,在绿色范围(所推荐的java良好代码,如平均复杂度在2.0-4.0之间)表示良好,可知当前代码在每个函数平均包含的语句个数

(Average Statements per Method),最复杂函数的复杂度(Maximum Complexity)不合格,其他方面较上次题目集有所改良。

2、源码思路及问题:

思路:首先在Main类中创建一条总干路存储串并联电路及干路电器,然后创建一个临时列表用于存储所有具体的电器设备,这个临时列表就是用于输出所有电

器的状态用的,然后解析三种输入信息,存到总干路及临时列表里,然后计算电流及电压,然后分流分压,由于受控窗帘的状态基于其他电器,所以单独创建一个

类来计算电路的总亮度,然后通过搜索受控窗帘接口给其赋值,由于本题新增了一个互斥开关,我就给互斥开关增加了两个属性,一个是计算时的状态,一个是真

实状态,因为如果只有1.3引脚接入电路,互斥开关真实状态默认是闭合的,但这里显然是断开的,所以真实状态用于输出,计算时状态用于计算电流等,最后是输

出, 利用Comparator的sort方法排序即可。

问题:本次程序存在许多多余的接口,比如搜索受控窗帘这个接口完全没必要,统计电路总亮度可以用其他的方法,不需要单独创建一个类和接口来统计,而且

我是device类实现这个接口,因为我想利用多态,但是实际上只有子类的串联和并联电路类才会用到这个接口,其他的子类完全用不到,但是还是要重写,这就导致

整个程序非常冗长;其次,目前写的这个程序是完全无法应对引脚电压的,我只是让电器分了电压,但是他的输入引脚电压输出引脚电压具体是多少是无法求得的。

第八次题目集:

1. 类图设计:

这次题目集相对于上次我删去了搜索受控窗帘及获取总亮度这两个多余的接口,加上了判断短路接口。

2. 源码分析:

1、源码信息:

代码行数:1811

语句行数:1038

分支数占总语句数百分比:27.9

方法调用语句数:526

注释语句占总语句百分比:11.3

类和接口数:19

最复杂函数的复杂度:50

平均深度:2.02

最大深度:8

平均复杂度:2.56

由上图,红色线表示当前的情况,在绿色范围(所推荐的java良好代码,如平均复杂度在2.0-4.0之间)表示良好,可知当前代码在最复杂函数的复杂度

(Maximum Complexity),每个函数平均包含的语句个数(Average Statements per Method),类和接口数(Classes and Interfaces)

和最大深度(Max Depth)不合格。

2、源码思路及问题:

思路:首先在Main类中创建一条总干路存储串并联电路及干路电器,然后创建一个临时列表用于存储所有具体的电器设备,因为这次加入了要输出输

入输出引脚电压,所以这次又新建一个列表用于存储含两个不同状态的互斥开关,并且在device类加入了一个顺序属性表示引脚顺序,因为电器引脚可能

反接,然后是在计算电路属性时,我在计算电流时,所有的device子类重写断路,短路接口,输入输出电流接口,在遍历时就是递归调用,所以不论并联

里面是否还是有并联,通过这样重写来实现递归调用这个方法就可以遍历各条电路,通过判断断路或短路及输入输出电流然后就可以正确地计算电流及电

压;在计算总亮度时,因为我们之前用了临时列表存了所有的电器,直接在输出之前遍历即可,然后再将值赋给受控窗帘,其他的跟上次题目集逻辑差不多。

问题:最后一次题目集我尽管得了96分,但设计十分失败,因为我的代码写了1800多行,十分冗长,并且没有处理很多的异常,另外一名同学在主函数

只写了try,catch处理了一些异常,并且代码只有1200多行,他在设计时是用链表写的,对了两个引脚设计的更能体现题意,我只是取巧,通过在device类

加一个顺序属性表示两个引脚,顺序表示1-2引脚连接,逆序则2-1引脚;

三:踩坑心得:

第七次题目集:

①:

在本输入样例中,在输出顺序存在着坑,就是B2与B12应该按着什么顺序输出按照之前的写法是B12在后面,因为12比2大嘛,但是这样写的话,就会错以下

测试点:

于是后来与同学讨论得知是按字典序排序,即B2在后面,这样便顺利通过了以下测试点,以下是正确的输出结果:

②:

在本输入样例中,互斥开关只有1-3引脚接入电路,这条路是断开的,但是此时坑就在这里,因为此时互斥开关的实际状态是闭合的,所以这条路如何判断就成为

了问题,因此在处理这个问题的时候,我就给互斥开关设置了两种状态,一个是计算时状态一个是输出时状态,就是如果是1-3引脚计算状态初始时都是断开的,而

1-2引脚初始计算时状态就是闭合的,然后不管是1-2还是1-3他们的初始输出时状态都是闭合的,在调互斥开关时,两个状态都要调,这样就解决了这个坑,以下是

正确的输出结果:

尽管互斥开关时闭合的,但未调互斥开关的话1-3就是断开的,所以D1的值为0;

③:

在以上样例中,坑就是在于判断并联是否断路这里,在并联电路中,若所有的分路都是断开的,则该并联电路时断路的,我之前只判断了串联电路的断路状态,并未判

断并联电路的断路状态,以下是正确的输出结果:


因为两条分路都是断开的,所以整个电路就是断开的。

第八次题目集:

本次题目集的坑主要在于引入了输入引脚和输出引脚电压之后造成的,以下是多个点

①:

第一个坑就是受控窗帘的问题,在之前的题目描述中,若电压为0,那么受控窗帘的打开程度为100%,但是在这次题目集就不是这样了,若电压小于50,受控窗帘为0%,

通过我和同学们的测试,明确这就是32这个测试点,就考这一点:

以下为正确的输出结果:

②:

在这个测试点中就产生了一个问题,这个并联分路全是开关,说明这两条分路都是短路的,那么怎么分流呢,我之前并未处理这个问题,实际上他是均分的,比如,三条分

路全是短路的则电流均分为3,那么会对什么产生影响呢,就是电流超限,如果没有均分,而是全集中在一条分路上,那么可能对于这个开关电流就超限了,在输出时就要输

出“exceeding current limit error”,以下是本例正确的输出结果:

四:改进建议:

由于第八次是第七次的迭代,我就只说明第八次的改进建议。

第八次题目集:

1.针对代码冗长问题:在第八次题目集中,我足足写了1800多行,按照老师所述,这题最多1000左右,而我的代码太过冗长,首先是主类,我写了40行,经过与其他同学讨论

可以在主类只写try-catch代码块,try里面有两行,一行创建一个类处理输入,第二行处理输出即可,catch用于处理异常;其次在解析输入时,有多少个电器我就写了多少

个if这是不对,这会造成很高的圈复杂度,使得代码难以维护及理解,应该用多态才对,因为所有电器都是继承自device类。

2.针对电流计算方法:这题我是通过分流来写的,就是先计算总电流,然后乘以各个电器的电阻从而得出各个电器的电压,这样写的误差其实是比较大的,因为在计算并联电阻

时,会算出无限小数,那么在传值时计算的总电流就有误差,我是通过保留6位小数并四舍五入来减小了这个误差,但若用分压的写法,就可以明确哪一部分电压是多少,通过电

阻来分压。

五:总结:

这二次题目集总共进行了3周左右,这两次题目集的难度明显高于前面两次,因为要处理多种复杂的电路状态,比如断路分压问题,就是并联电路中一条断开一条连通,但是断

开的电路是有输入引脚电压和输出引脚电压的,尽管电压为0,那么在赋电压时就需要考虑在什么情况这样处理,以及遍历到这个断路;这两次题目集我与同学们讨论较多,可以

说是共同完成了这两次PTA中不少难的测试点,确实,有时候一个人还真不一定能想到某个测试点,大家共同讨论来解决这个问题,让我收获颇多,比如一位同学抛出异常使其非

零返回,为了测试哪里出了问题,这都是值得我学习的,运用多方面的知识来解决问题。

六:课程的建议及意见:

本门课程就像老师一开始所说,是有挑战的,也确实如此,但这样让我们学会了许多东西,有时可能在晚上12点左右还在与同学讨论PTA的题目,锻炼了我们的抗压能力及共同

解决问题的能力,这是一种新奇的体验,因为在高中,我觉得这样的讨论机会比较少;对于这门课程我的拙见是:在课程引进一些最新的技术,来增加我们的知识面,还可以搞一

些编程竞赛或者设计竞赛,选编程能力强的或者设计思路较好的来分享经验。

以上就是我针对七八次题目集的Blog,感谢助教组和老师们的辛勤付出,感谢共同讨论、分享的同学!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/733097.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战篇——Burpsuite工具BruteForc靶场实战

实战篇——Burpsuite工具BruteForc靶场实战 BurpSuite是一款强大的渗透工具,主要用于抓包、口令爆破和Fuzzing测试。本章通过BruteForc靶场实战,深入掌握Burp口令爆破。 经过测试,原靶场(https://github.com/3sNwgeek/BruteForc_test)在登录回显方面存在几处问题,现已修正并…

PTA7~8次大作业总结

目录前言设计与分析PTA第七次作业PTA第八次作业踩坑心得总结 前言第七到八次大作业已经完成,对第七和第八次大作业里所学进行一个总结,从多方面来分析这两次作业之间的联系和差异,并从中了解自己的不足与缺点。第七次作业添加了互斥开关和窗帘,窗帘还好,只是一个简单的电路…

代码随想录算法训练营第23天 | 39.组合总和 40.组合总和Ⅱ 131.分割回文串

39.组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个…

北航软院人工智能课程笔记

北航软院人工智能课程笔记,期末复习用。你软绝世好课,实际上照搬浙大吴飞老师(慕课)&台大李宏毅老师(B站or油管)的PPT…… 上课听不进去可以直接去听这两位老师的课。 期末复习自用笔记,有误欢迎指正。绪论机器学习及有监督学习 机器学习基本概念 机器学习:就是从数…

PTA题目集7-8总结

1. 前言知识点: 继承,多态,类设计 题量:一次一道题,1000行代码左右,还行,不多 难度:家居强电电路模拟程序-3 :略难,主要是互斥开关好难设计啊!!!不知道要怎么写 家居强电电路模拟程序-4 :太难啦,提示和没有一样啊!!!真的找不到还有哪里错啦,想不到啊啊啊!!…

LLM并行训练3-数据并行

大模型训练 数据并行相关的学习笔记, 主要内容 zero, zero++前置知识 混合精度训练在参数存储时采取fp32, 开始进行fp/bp时转成fp16运算, 拿到fp16梯度后再转回fp32更新参数. ZeRO对显存占用的估算:模型状态: Weights(fp16)、grad(fp16) 和 MasterWeights(fp32 模型参数备份),…

货车运输的五种解法

上完课整的活(这里的“五种解法”之间有实现方式之外的不同) 方法1:最大生成树 + 树上倍增 本题的标准解法,先用 kruskal 建出最大生成树,再在最大生成树跑树上倍增求路径 \(min\) ,时间复杂度为 \(\Theta(n \log n + q \log n)\)。 树上倍增也可以用树剖替换,但是需要两…

一张图让你看懂10种软件架构风格

软件架构风格是构建各种软件系统的基本蓝图,确保它们满足特定的要求和质量属性。通过坚持合适的架构风格,组织可以确保其软件系统的构建与其战略目标保持一致,适应未来的变化,并在面对不断发展的技术环境和用户需求时具有弹性。 以下是最常见的样式:(单体架构):将整个…

linux三剑客-grep、sed、awk

Linux三剑客是Linux系统中最重要的三个命令,它们以其强大的功能和广泛的应用场景而闻名。这三个工具的组合使用几乎可以完美应对Shell中的数据分析场景,因此被统称为Linux三剑客。 1、grep grep是一个强大的文本搜索工具,用于在文件内容中查找指定的字符串,并将匹配到的行输…

联通网络无法使用FTP,无法使用21端口连接的解决方法

最近家里换了联通的网络,结果发现连接不上FTP了,本来以为是软件的问题。最后发现只有21端口的FTP连接不上,其它的端口没问题。 首先想到的是肯定是联通的光猫把21端口给关闭了。然后就想着通过192.168.1.1来设置一下光猫。专业网站制作、系统开发订制、微信公众号开发、接外…

LINUX命令-sed

sed命令是用于对文本文件做内容操作的神器,常见的增删改都可以,熟练运用可提高shell脚本编写能力和在terminal下的工作效率。本文编辑小绝技-sed sed命令是用于对文本文件做内容操作的神器,常见的增删改都可以,查没必要用它,用grep或者gvim打开用vim的搜索匹配就行。 sed …