PTA训练集阶段总结blog

news/2025/1/19 14:38:41/文章来源:https://www.cnblogs.com/05Bao16/p/18239522

目录
  • PTA训练集总结blog
    • 1.前言
    • 2.设计与分析
      • 题目集一 7.4 答题判题程序四
        • 关于设计要求:
        • UML类图及设计分析:
        • 部分源码:
        • 复杂度分析:
      • 题目集五 7.1 家具强电电路模拟系统—1
        • 关于设计要求:
        • UML类图及设计分析:
        • 部分源码:
        • 复杂度分析:
      • 题目集六 家居强电电路模拟程序-2
        • 关于设计要求:
        • UML类图及设计分析:
        • 部分源码:
        • 复杂度分析:
    • 3.踩坑心得
    • 4.改进建议
    • 5.总结

PTA训练集总结blog

1.前言

1.这次是4-6次的pta作业的一个总结性blog。答题程序在第四次迭代之后已功成身退。但已经没有时间怀念答题程序了,紧接着登场的是家居强电电路模拟程序系列,目前这个系列已经迭代两次,我个人感觉这个系列比前面的答题程序要难。前言无力,请移步正文。

2.设计与分析

题目集一 7.4 答题判题程序四

关于设计要求:

设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。 这次的答题程序加上了多选和填空题,在想了一个下午之后, 得出多选保存答案,填空equals比较的可实现方法(想到的一些其他方法我不会实现很尴尬。)

UML类图及设计分析:

emm…类图还是比较复杂的,但是说实话主要的判定逻辑还是放在了Main类的processAnswers类里,不过是比上次多了一个“抽象父类—子类”的结构来实现多种题型的设计。

部分源码:

public void processAnswers() {int y = 0;for (TestPaper tp : testPapers) {if (tp.getallscore() != 100) {System.out.println("alert: full score of test paper" + tp.getPaperNumber() + " is not 100 points");}}//判断是否被删除,此处省略。。。if(!answerSheets.isEmpty()) {//对答卷排序for(int i=0;i<answerSheets.size()-1;i++){for(int j=0;j<answerSheets.size()-1-i;j++){if(answerSheets.get(j).getStudentNumber()> answerSheets.get(j + 1).getStudentNumber())					{AnswerSheet temp= answerSheets.get(j);answerSheets.set(j, answerSheets.get(j + 1));answerSheets.set(j + 1, temp);}if(answerSheets.get(j).getStudentNumber()== answerSheets.get(j +1).getStudentNumber())					{if(answerSheets.get(j).getPaperNumber()> answerSheets.get(j + 1).getPaperNumber())						{AnswerSheet temp= answerSheets.get(j);answerSheets.set(j, answerSheets.get(j + 1));answerSheets.set(j + 1, temp);}}}}for (AnswerSheet answerSheet : answerSheets) {List<Integer> score = new LinkedList<>();int totalScore = 0;int questionScore;List<Integer> answernums = answerSheet.getAnswernums();TestPaper testPaper = null;for (TestPaper t : testPapers) {if (t.getPaperNumber() == answerSheet.getPaperNumber()) {testPaper = t;break;}}int c = 0;if (testPaper != null) {for (int j = 0; j < testPaper.getQuestionNums().size(); j++) {int t = 0;for (int k = 0; k < answernums.size(); k++) {if (answernums.get(k) == j + 1) {t = 1;c = k;break;}}if (t != 0) {String answer = answerSheet.getAnswers().get(answernums.get(c));String answer1 = answerSheet.getAnswers().get(answernums.get(c));int questionNumber = testPaper.getQuestionNums().get(j);Question question = null;selectQuestion selectquestion = null;blankQuestion blankquestion = null;for (Question q : questions) {if (q.getNumber() == questionNumber) {question = q;break;}}for (selectQuestion q : selectquestions) {if (q.getNumber() == questionNumber) {selectquestion = q;break;}}for (blankQuestion q : blankquestions) {if (q.getNumber() == questionNumber) {blankquestion = q;break;}}if (question != null) {if (question.flag == 0) {if (question.judge(answer)==Result.True) {questionScore = testPaper.getQuestions().get(questionNumber);totalScore += questionScore;System.out.println(question.getContent() + "~" + answer + "~true");score.add(questionScore);} else {System.out.println(question.getContent() + "~" + answer + "~false");score.add(0);}}else {System.out.println("the question " + question.getNumber() + " invalid~0");score.add(0);}}else if(selectquestion != null){if (selectquestion.flag == 0) {if (selectquestion.judge(answer)==Result.True) {questionScore = testPaper.getQuestions().get(questionNumber);totalScore += questionScore;System.out.println(selectquestion.getContent() + "~" + answer + "~true");score.add(questionScore);}else if(selectquestion.judge(answer)==Result.partiallycorrect){System.out.println(selectquestion.getContent() + "~" + answer + "~partially correct");questionScore = testPaper.getQuestions().get(questionNumber);totalScore += questionScore;totalScore=totalScore/2;score.add(questionScore/2);}else {System.out.println(selectquestion.getContent() + "~" + answer + "~false");score.add(0);}}else {System.out.println("the question " + selectquestion.getNumber() + " invalid~0");score.add(0);}}else if(blankquestion != null){if (blankquestion.flag == 0) {if (blankquestion.judge(answer)==Result.True) {questionScore = testPaper.getQuestions().get(questionNumber);totalScore += questionScore;System.out.println(blankquestion.getContent() + "~" + answer1 + "~true");score.add(questionScore);}else if(blankquestion.judge(answer)==Result.partiallycorrect){System.out.println(blankquestion.getContent() + "~" + answer1 + "~partially correct");questionScore = testPaper.getQuestions().get(questionNumber);totalScore += questionScore;totalScore=totalScore/2;score.add(questionScore/2);}else {System.out.println(blankquestion.getContent() + "~" + answer1 + "~false");score.add(0);}}else {System.out.println("the question " + blankquestion.getNumber() + " invalid~0");score.add(0);}}else {System.out.println("non-existent question~0");score.add(0);}} else {System.out.println("answer is null");score.add(0);}}answerSheet.setTotalScore(totalScore);int studentnum = 0;  //添加学号审查for (int num : students.getStudentNums()) {if (num == answerSheet.getStudentNumber()) {studentnum = num;}}if (studentnum != 0) {System.out.print(studentnum + " " + students.getStudents().get(studentnum) + ": ");for (int j = 0; j < score.size(); j++) {Integer i = score.get(j);System.out.printf("%d", i);if (j < score.size() - 1) {System.out.printf(" ");}}System.out.printf("~%d", answerSheet.getTotalScore());if (y < answerSheets.size() - 1) {System.out.println();}} else {System.out.println(answerSheet.getStudentNumber() + " not found");}} else {System.out.println("The test paper number does not exist");}}}else{for(int i=0;i<b;i++){System.out.println("The test paper number does not exist");}}}

复杂度分析:

Method CogC ev(G) iv(G) v(G)
com.nchu.oop4.allQuestion 1.0 1.0 4.0
com.nchu.oop4.AnswerSheet 1.0 1.0 8.0
com.nchu.oop4.blankQuestion 2.5 4.0 5.0
com.nchu.oop4.Delete 1.0 1.0 3.0
com.nchu.oop4.Main 15.5 48.0 62.0
com.nchu.oop4.Question 1.5 2.0 3.0
com.nchu.oop4.Result 0.0
com.nchu.oop4.selectQuestion 8.0 15.0 16.0
com.nchu.oop4.Student 1.0 1.0 4.0
com.nchu.oop4.TestPaper 1.0 1.0 6.0
Total 111.0
Average 3.1714285714285713 8.222222222222221 11.1

题目集五 7.1 家具强电电路模拟系统—1

关于设计要求:

1、控制设备模拟

本题模拟的控制设备包括:开关、分档调速器、连续调速器。

2、受控设备模拟

本题模拟的受控设备包括:白炽灯、日光灯,风扇。三种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。

本题不考虑输入电压或电压差超过220V的情况。

本题只考虑串联的形式,所以所有测试用例的所有连接信息都只包含两个引脚

本题电路中除了开关可能出现多个,其他电路设备均只出现一次。
电源VCC一定是第一个连接的第一项,接地GND一定是最后一个连接的后一项。

家居电路模拟系列所有题目的默认规则:

1、当计算电压值等数值的过程中,最终结果出现小数时,用截尾规则去掉小数部分,只保留整数部分。为避免精度的误差,所有有可能出现小数的数值用double类型保存并计算,不要作下转型数据类型转换,例如电压、转速、亮度等,只有在最后输出时再把计算结果按截尾规则,舍弃尾数,保留整数输出。

2、所有连接信息按电路从电源到接地的顺序依次输入,不会出现错位的情况。

3、连接信息如果只包含两个引脚,靠电源端的引脚在前,靠接地端的在后。

4、对于调速器,其输入端只会直连VCC,不会接其他设备。整个电路中最多只有一个调速器,且连接在电源上。

UML类图及设计分析:

这次的题目集说实话还好,只是多个电器的问题,学会继承多态的我也是拿下,因为只有串联,所以我只设计了串联的电压计算,并没有做串联电路类。还是把计算放在了Main类valid方法里,虽然当时有种不好的预感,但是还是这样设计了。并且因为不想给每个类对象一个名称属性,所以用的LinkedHashmap。这也在下次的迭代中给我不小的麻烦,当然,这是后话了。

部分源码:

public void valid() {int Flag=0;List<String> Key = new ArrayList<>();List<Device> arr = new ArrayList<>();Map<String, Device> devices = new HashMap<>();for (String key : series.keySet()) {arr.add(series.get(key));Key.add(key);}for (int i = 0; i < arr.size(); i++) {Device dev = arr.get(i);if (dev instanceof Switch) {if (((Switch) dev).getState()==0){Flag=1;break;}}}if (Flag==0) {arr.get(0).input = 220;for (int i = 1; i < arr.size(); i++) {Device dev = arr.get(i - 1);if (dev instanceof controlEquip) {arr.get(i).input = ((controlEquip) dev).getOutput();}if (dev instanceof controlledEquip) {arr.get(i).input = dev.input;}}}for (int i = 0; i < arr.size(); i++) {devices.put(Key.get(i), arr.get(i));}for (String key : devices.keySet()) {if (devices.get(key) instanceof Switch) {Switch sw = (Switch) devices.get(key);System.out.println("@" + key + ":" + (sw.getState() == 1 ? "closed" : "turned on"));}}for (String key : devices.keySet()) {if (devices.get(key) instanceof GearSpeedController) {GearSpeedController gear = (GearSpeedController) devices.get(key);System.out.println("@" + key + ":" + gear.getGear());}}for (String key : devices.keySet()) {if (devices.get(key) instanceof ContinuousSpeedController) {ContinuousSpeedController cont = (ContinuousSpeedController) devices.get(key);System.out.println("@" + key + ":" + String.format("%.2f", cont.getPosition()));}}for (String key : devices.keySet()) {if (devices.get(key) instanceof LightBulb) {LightBulb lightbulb = (LightBulb) devices.get(key);lightbulb.setBrightness();System.out.println("@" + key + ":" + (int)lightbulb.getBrightness());}}for (String key : devices.keySet()) {if (devices.get(key) instanceof FluorescentLamp) {FluorescentLamp fluor = (FluorescentLamp) devices.get(key);fluor.setBrightness();System.out.println("@" + key + ":" + (int)fluor.getBrightness());}}for (String key : devices.keySet()) {if (devices.get(key) instanceof Fan) {Fan fan = (Fan) devices.get(key);fan.setSpeed();System.out.println("@" + key + ":" + (int)fan.getSpeed());}}}

复杂度分析:

Method CogC ev(G) iv(G) v(G)
com.nchu.oop5.ContinuousSpeedController 1.2 2.0 6.0
com.nchu.oop5.controlEquip 1.0 1.0 1.0
com.nchu.oop5.controlledEquip 1.0 1.0 1.0
com.nchu.oop5.Device 1.0 1.0 1.0
com.nchu.oop5.Fan 1.5 3.0 6.0
com.nchu.oop5.FluorescentLamp 1.33 2.0 4.0
com.nchu.oop5.GearSpeedController 1.2 2.0 6.0
com.nchu.oop5.Light 1.0 1.0 2.0
com.nchu.oop5.LightBulb 1.67 3.0 5.0
com.nchu.oop5.Main 15.0 23.0 45.0
com.nchu.oop5.Switch 1.6 3.0 8.0
Total 85.0
Average 2.58 3.82 7.73

题目集六 家居强电电路模拟程序-2

关于设计要求:

这次的程序加入了并联的情况,这使我不得不重新设计代码分类并联串联两种电压计算模版。

加入一个新的落地扇类,倒是不难。

还有以下对于并联串联的新要求:

输入信息以end为结束标志,忽略end之后的输入信息。

本题中的并联信息所包含的串联电路的信息都在并联信息之前输入,不考虑乱序输入的情况。
电路中的短路如果不会在电路中产生无穷大的电流烧坏电路,都是合理情况,在本题测试点的考虑范围之内。

本题不考虑一条串联电路中包含其他串联电路的情况。

UML类图及设计分析:

这次因为重新设计,有些仓促,舍弃了Map改为List。判断逻辑和电压赋值也是在Main类里完成的,类间关系有点复杂。

真的是狠狠吃了设计不好的亏。电压赋值做的也不够完善。

部分源码:

 public void valid() {//得出电流double A = (220/this.resistance);//将map转为两个list//判断是否短路for (Device Dev:series){if (!(Dev instanceof Switch)) {flags = 0;break;}}//判断是否断路,返Flag值for (Device dev:series) {if (dev instanceof Switch) {if (((Switch) dev).getState()==0){Flag=1;break;}}}//总串联赋电压值if (Flag==0) {series.get(0).input = 220;for (int i = 1; i < series.size(); i++) {Device dev = series.get(i - 1);if (dev instanceof controlEquip) {series.get(i).input = ((controlEquip) dev).getOutput();A=(series.get(i).input/ dev.input)*A;}if (series.get(i) instanceof Fan) {series.get(i).input =A*Fan.resistance;}if (series.get(i) instanceof gFan) {series.get(i).input =A*gFan.resistance;}if (series.get(i) instanceof LightBulb) {series.get(i).input =A*LightBulb.resistance;}if (series.get(i) instanceof DaylightLamp) {series.get(i).input =A*DaylightLamp.resistance;}if (series.get(i) instanceof Series) {for(Series se:Main.series_es){if(((Series) series.get(i)).name.equals(se.name)) {series.get(i).input =A*se.getResistance();}}}if (series.get(i) instanceof Parallel) {for(Parallel pa:Main.parallel_es){if(((Parallel) series.get(i)).name.equals(pa.name)) {series.get(i).input =A*pa.getResistance();((Parallel) series.get(i)).out();}}}}}}

复杂度分析:

Method CogC ev(G) iv(G) v(G)
ContinuousSpeedController 1.2 2.0 6.0
controlEquip 1.0 1.0 1.0
controlledEquip 1.0 1.0 1.0
DaylightLamp 1.25 2.0 5.0
Device 1.0 1.0 1.0
Fan 1.4 3.0 7.0
GearSpeedController 1.2 2.0 6.0
gFan 1.8 5.0 9.0
Light 1.0 1.0 2.0
LightBulb 1.5 3.0 6.0
Main 28.5 30.0 57.0
Parallel 3.4 8.0 17.0
Series 9.5 31.0 57.0
Switch 1.6 3.0 8.0
Total 183.0
Average 3.588235294117647 6.642857142857143 13.071428571428571

3.踩坑心得

关于答题-4:

个人感觉这次的题目的测试点还是比较正常的也没有什么测试点,把正常逻辑写完之后应该差不多了,但是要说的一点是,对于选择题信息的提取有一些问题,如果只用分组的话可能会提取到一些没有用的东西,所以这一块我使用的是切割,还有填空题一定要注意空格处理,我在这里卡了好久。

关于电路-1:

1.关于调速器的档位,这次迭代的调速器在调档的时候如果大于3就不再往上调,如果降档,则降到0档不能再往下降
2.第二个就是输出问题,需要按照一定的顺序

关于电路-2:

1.如果有一路的开关没有闭合,当传回电阻时不能传0,因为并联电路会用到电阻的倒数,会让数据出现问题,所以直接传一个负数,在并联电路里求电阻的时候如果是负数就不考虑这条路
2.不能用电流求电器的转数或者亮度,会有误差

4.改进建议

在对字符串进行操作时,对于频繁的字符串操作,应该使用StringBuilderStringBuffer类来提高效率。

对于代码异常情况,使用try-catch语句块来捕获和处理异常,以保证程序的稳定性和可靠性。

通过继承,多态进一步完善判定逻辑。如多个并,串联电路。

5.总结

通过本阶段的三次题目集的练习,

  1. 数据结构:我更加熟悉了使用ListMap等数据结构来处理和存储数据。这些数据结构在不同的情境下具有不同的优势,需要根据实际需求选择适当的数据结构。
  2. 循环和条件语句:更熟悉了使用增强for循环和if-else条件语句来实现程序的控制流程,包括遍历数据、判断条件和执行不同的操作。
  3. 字符串处理:更熟练使用字符串操作的方法,如分割、替换和拼接字符串,以及比较字符串和提取子字符串。
  4. 学会了抽象类的基本应用。

需要进一步学习和研究的地方包括:

  1. 异常处理:在给定的代码示例中,并未完全处理输入错误或无效数据的情况。学习处理异常,以提高程序的健壮性。
  2. 更多的数据结构和算法:除了示例中涉及到的数据结构,还有许多其他的数据结构和算法可供学习和探索。了解不同的数据结构和算法可以帮助我更高效地解决问题。
  3. 面向对象编程原则:学习如何设计良好的类和对象,并遵循面向对象编程的原则。这将使代码更加可维护、可扩展和可重用。

总体而言,我已经掌握了更多Java编程的基础知识和技巧,但仍有许多内容需要进一步学习和研究。通过不断练习、听讲,阅读文章和参考优秀的代码示例,我相信可以不断提升自己的编程能力和解决问题的能力。

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

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

相关文章

Redis-6-三种缓存读写策略

2.1 旁路缓存Cache Aside Pattern(旁路缓存)适合读请求比较多的场景Cache Aside Pattern 中服务端需要同时维系 db 和 cache,并且是以 db 的结果为准。 2.1.1 写先更新db 直接删除缓存2.1.2 读先读缓存有,则从缓存返回。 没有,从db中读取返回。再将读取的数据写入缓存2.1.…

PTA4~6次作业总结

(1)前言: 不同于大一上的c语言的PTA作业,java的PTA作业越来越贴近生活中的需求,难度也越来越大了,代码的设计量和题目考察的知识点也是.最后一次作业没有给测试样例,导致有几个点没过,不知道错哪了,测不出来,非常的难受. 这次作业使用了ArryList 先了解下ArryList ArrayList…

Ubuntu基础环境配置

博主:Agony‍ 下载ubuntu地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/选择你所需要的版本下载即可‍ root设置ubuntu系统搭建好之后‍打开终端。输入以下命令来切换到root用户(如果您当前用户有sudo权限): sudo su或者,如果您已经有了root用户并知道密码…

南昌航空大学pta总结

前言 背景介绍: 继上次PTA题目讲解完,本次博客会进行对后几次题目集的讲解说明和题后总结 目的和目标: 及时反馈学习成果,达到学由所会,及时吸收和深入学习的目的 学习收益: 通过后面几次的题目学习,使得我对java的语法代码以及运用熟练度有了极大的进步,同时也对学习代码…

两次pta题目总结

两次pta题目总结 写在前面 这两次pta是新题目,上次那个答题判题的没有继续迭代了,根据这两次题目我也学到了一些东西,主要是面向对象设计模式的运用,接口的使用,以及递归算法的使用等等 第一题题目内容: 智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版 VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) …

第二次Blog作业

此次Blog为题目集4-6的总结性内容 前言(题目集总结) 第四次题目集 (此次题目集为答题判题程序的最后一版,综合性最强,总体偏难) 1.知识点 字符串解析与处理: 程序需要能解析和处理各种格式的字符串,包括题目信息、试卷信息、学生信息、答卷信息和删除题目信息。这涉及到…

第二次blog大作业

1.前言 第四次到第六次大作业所覆盖的知识点还是很多的,例如:抽象类,集合,排序方法,接口等等。第四次的大作业是关于学生答卷的流程,考察了我们对于集合和排序算法,以及类与类之间的关系,相比他前面的三个小弟,他增加了多选题和填空题,在难度上还是有所提升的,不过也…

Spring Boot入坑-8-定时任务

概述在企业级的项目业务中,往往会有一系列的任务需要在有逻辑的指定时间点执行,如系统间定时同步数据、定时做某个复杂的计算、订单提交后30分钟需要付款等上述这些,就需要任务的定时调度与执行来完成,这是程序的基本需要在Java语言中,提供了基础的基于Timer和ScheduledEx…

Zerto 10.0 U4 - 适用于本地、混合和多云环境的灾难恢复和数据保护

Zerto 10.0 U4 - 适用于本地、混合和多云环境的灾难恢复和数据保护Zerto 10.0 U4 - 适用于本地、混合和多云环境的灾难恢复和数据保护 勒索软件防护、灾难恢复和多云移动性的统一解决方案 请访问原文链接:https://sysin.org/blog/zerto-10/,查看最新版。原创作品,转载请保留…

计算机简史第三章 机电时代之数字电路

电路的发明,使得计算机的速度大幅提高电路的发明,使得计算机的速度大幅提高 布尔代数、二进制与电路的关系 20 世纪,随着继电器电路的发展,许多科学家开始将二进制、布尔代数和电路联系到一起,最终,由美国一位名为克劳德香农(Claude Shannon)的数学家做出了完整阐释。 …

计算机简史第三章 机电时代之布尔代数

布尔运算,使得计算机开始有了处理逻辑的能力。布尔运算,使得计算机开始有了处理逻辑的能力。 ‍ 莱布尼茨坚信,人类的思想和数字一样可以化繁为简——所有思想都可以分解为数量不多的简单思想。这些简单思想通过一些既定规律,可以组成任意的复杂思想,就像数学运算一样。当…