PTA第三阶段作业总结

news/2024/7/7 22:00:25/文章来源:https://www.cnblogs.com/Chew-Cherry/p/18276929

前言

第三阶段的两次大作业明显对设计的要求进一步提高了。我两次作业一共得到了162分,最后一次作业只得到了62分,第7次作业得到了满分,但程序仍有许多不足,下面开始逐题分析。

7-1 家居强电电路模拟程序-3

这道题是一个全新的模拟场景,模拟一个家居电路。主要的类就是一个父类Electricdevice类,所有的用电器类都继承自这个类,对于串联电路,也把它看成一个特殊的用电器,同样继承自此类。 对于输入处理,用一个Information类保存。

整体思路如下:用正则表达式处理输入,将分割后的信息储存。由于没有异常信息输出,所以没有对应的异常输出处理。再从储存的信息中提取电路电器信息,new出每条信息对应的电器类,再遍历操作类信息,对电器的状态进行改变,这样就保证了整个电路的信息与要求对应。将new出的电器放入一个Electricdevice类型的数组中,用List来代替传统数组,更简洁方便,这样就模拟出了一条串联的电路。然后判断整个电路每个用电器的状态state,如果都为true则电路连通,有一个为false则整个电路的状态都是false,相当于逻辑中的与门。

对Agent类进行简要分析:

属性:
Agent类中只有一个串联类类型的电路属性,用来保存电路信息
方法:
Agent类中有一个无参构造方法,有添加电器方法,获取电路信息方法,打印电路信息方法,和排序方法。
其中这个排序方法我采用的是“暴力排序法”,即对比每个电器的类类型名来进行排序,目前没有想到更好的方法。
在这个类的设计上,其实可以免去createSystem类,使用getRoad().add()方法即可。

对Electricdevice类进行简要分析:

属性:
1.name是电器的名字,后续排序的时候需要使用
2.id是电器输入的次序,排序也需要使用
3.V1, V2是输入电压和输出电压,这两个电压的差值即为电压差U,这里设定了V1初始值为220,V2的初始值为0,其实是错误的,因为串联电路未接通时候电压为0。
方法:
主要就是getter/setter方法,有参构造方法和无参构造方法,还有一个打印信息的方法,无特别之处。
这个类的设计存在缺陷,如缺少一个表示电器状态的state属性,这样在后续的判断中需要用for循环对电路里的每个电器进行操作,非常不方便,而且浪费资源。

测试点分析

在这个测试点卡了很久,后续改正发现是没有按照KFLBRD这个字母顺序输出,而且有可能有多个开关,没有考虑这两种情况。在写完多个开关判断的时候,我就发现了代码结构的问题,所以在满分后我又修改了代码,在Electricdevice类中添加了state这个属性,来表示这个用电器的状态,控制类电器的初始值为false,用电器类初始值为ture。然后在串联电路中添加了一个方法,使得电路可以判断整条电路的状态。同时我还添加了电阻,电流两个方法,这对后续迭代会有帮助

7-1 家居强电电路模拟程序-4

这道题的主体思路与上一道题大致相当,除了多了一个落地扇类,多了一个并联类,并无本质区别。沿用了上一次的代码后,我删除了Agent类,添加了一个输入处理类,一个并联电路类,就基本完成了整个设计,这是我第一次几乎做到了开闭原则,第一次体会到段老师上课说的对扩展开放,对修改关闭的好处。

这里提下一个卡了很久的测试点:
因为排序的代码我直接引用了上一次的,所以在遇到有落地扇的输出信息排序时候,全错了,当时找了好久,最后发现是排序的问题,除此之外都是一遍就过了。所以在写一道题目的时候,一定要先反复读题理解题意,就像段老师说的,先要做好需求分析,如果需求分析做不好,那肯定是不行的。就像我这个代码,其他都没问题,完全是符合要求的产品,结果因为漏掉一个需求,导致运行结果出错。

分享一些踩坑心得

1.主函数一定不要写很多处理输入输出信息的代码在里面,一定要用类跟方法实现处理输入输出的功能,主函数只能放输入和输出的代码,其他一概不要放在里面。因为如果大量代码在主函数里,会导致后续逻辑极度混乱,可能会出现改了一个bug,出来三个bug,而且你还没法找到。比如答题判断程序-4,我就是因为有大量处理输入输出信息的代码在主函数里,导致我最后没找到程序错在哪里,最后还是在与同学讨论,在代码不同位置插入断点进行反复调试后才发现的bug——一个本该写在for循环外面的if/else写在了for里面,导致没有判断输入为空的情况。究其原因,就是因为在主函数里用了多重循环嵌套处理输入输出,最后看错了这段代码要放的位置。其实些循环,完全可以放在多个不同的类和方法中进行实现。
2.使用继承的时候一定要考虑子类是否有某些父类没有的方法。如果子类有父类没有的方法,一定要谨慎使用父类数组储存子类对象。因为可能出现:在父类的数组里,我要调用某个位置上储存的子类对象的方法,但是父类不能调用子类里有而父类里没有的某个方法。我在家居强电电路模拟程序中就遇到了这种情况,最后解决的办法就是在父类中添加一个与要调用的子类方法同名的空方法,把子类中的方法看作是对父类方法的复写。但是这种解决方案不符合继承与多态的基本原则,所以后续要考虑修改。

改进建议

我觉得目前我对继承与多态的运用还不算非常合理,在后续的练习中,我还需要对抽象出的父类的合理性进行优化,可以合理地使用抽象类对父类进行表示,有时候也可以添加一些接口,进行实质上的多继承。

总结

通过这三次作业,我进一步了解了面向对象程序设计的“设计”二字,在对程序的结构设计中,我提升了自己的设计能力,现在逐步开始能够遵循开闭原则,单一职责原则,主函数中比较简洁,只有输入和输出,这是我从这三次作业里学到的。后续我也要在代码中加入接口,抽象类等,学以致用。对于pta的题目,我认为难度非常合理,要是老师能够对有些较难的测试点进行统一提示就更好。

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

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

相关文章

Django 笔记 - Django Shell

启动 Django Shell 交互式界面,具体命令如下:python manage.py shell具体实例 实例 1. 直接修改用户密码,无需原密码。 在 Django Shell 交互式界面下,修改 admin 用户密码的具体代码如下:from django.contrib.auth.models import User user = User.objects.get(username=…

用pipenv解决pyinstaller打包文件过大的问题

学会用pyinstaller打包python文件后,我发现直接大暴出来的文件内存特别大 于是我上网搜了一些压缩方法,试过用upx,用了之后感觉有点麻烦,后面又看到了pipenv,感觉还不错 首先用windows+r快捷键输入cmd打开命令管理器安装pipenv模块pip install pipenv -i https://pypi.tun…

对7~8次pta的总结

(1).前言: 第七次pta难度很大,主要体现在互斥开关的设计上: 互斥开关: 互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。 开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚…

rust的webview框架tauri快速搭建

因为上一步把rust相关环境都搭建好了,可以用h5开发桌面程序了,搭建tauri npm create tauri-app@latest,等待安装npm run tauri dev,运行测试环境了,直接用网页查看页面效果 npm run tauri build,等待打包出exe文件,在目录tauri-app\src-tauri\target\release下运行exe查…

数据分析神器Pandas快速入门3类型转换

序列类型转换3.1 自动转换 在pandas 1.0 中,引入了一种新的转换方法.convert_dtypes。它会尝试将Series 换为支持 pd.NA 类型。以city_mpg 系列为例,它将把类型从int64转换为Int64: >>> city_mpg.convert_dtypes() 0 19 1 9 2 23 3 1…

log 日志原理

1)slf4j接口 仅仅定义了接口,因此,需要绑定到具体的日志框架才可以打印日志出来,具体如何来做呢,引用一张slf4j官网上的图片: 具体的组合使用: slf4j-api,日志是打到了/dev/null里面,因此啥也打印不出来slf4j-api + logback-classic:使用的是logback,因为logback本身…

tp5(finish)

tp5 1.tp5.0开始 结构 www WEB部署目录(或者子目录) ├─application 应用目录 │ ├─common 公共模块目录(可以更改) │ ├─module_name 模块目录(Home:前台模块;Admin:后台模块) │ │ ├─config.php 模块配置文件 │ │…

thinkphp3.2.x漏洞分析

tp3.2.3 1.开始 入口文件 就是www/index.php,index.php包含了框架的入口文件,所以访问后可以直接加载thinkphp框架 配置文件 thinkphp的配置文件在www/ThinkPHP/Conf/convention.php url大小写 url默认是大小写敏感的,也可以通过修改convertion.php,达到url不区分大小写的目…

git基本知识

文件在本地仓库的状态常用命令:git status 查询状态git add 添加到暂存区,可以使用通配符*git commit desc:1 提交到本地仓库,只能提交暂存区的文件,该次提交的描述git commit -a -m desc:2 表示直接提交,不用放到暂存区git log 查看提交记录git reset --soft 123456 传入…

揭秘Python:对象类型打印

哈喽,大家好,我是木头左!一、Python数据类型简介 在Python的世界中,了解你正在处理的数据类型是至关重要的。Python提供了多种内置数据类型,包括数字(整数和浮点数)、字符串、列表、元组、字典等。这些数据类型决定了你可以对数据执行哪些操作,以及如何高效地存储和处理…

用Python的pynput和pyautogui实现自动化操作

哈喽,大家好,我是木头左!一、前言 在日常生活和工作中,常常需要重复执行一些机械性的操作,如复制粘贴、点击按钮等。这些操作虽然简单,但频繁执行会浪费大量时间。为了提高效率,可以使用Python编写脚本来实现这些操作的自动化。本文将介绍如何使用pynput库记录各种按键操…

(log求因数和)北京建筑大学2024年程序设计竞赛 B因数之和

题意:计算一个数的所有因数的和通常涉及质因数分解,然后对每个质因数的幂次进行求和运算。 具体步骤如下: 1.质因数分解:首先,将给定的数进行质因数分解,表示为\(2^{a}*3^{b}*5^{c}....\) 2.计算每个质因数的贡献:对于每个质因数p(如2, 3, 5等),计算从p{0}到p的所有…

样本空间的计数

高一初学阶段常用的样本空间的计数方法需要切实掌握前言 在统计样本空间数时,需要考虑是否有顺序和是否放回,同时请注意列举法、描述法,表格法,树状图的合理运用。这些方法都是高一初次学习需要切实掌握的方法,等到了高二或者高三,对思维的要求提高以后,更多的会用到加法…

空间单细胞|基于图像的数据分析(3)

引言 在这篇指南[1]中,我们介绍了Seurat的一个新扩展功能,用以分析新型的空间解析数据,将重点引言 在这篇指南中,我们介绍了Seurat的一个新扩展功能,用以分析新型的空间解析数据,将重点介绍由不同成像技术生成的三个公开数据集。Vizgen MERSCOPE(用于小鼠大脑研究) Nan…

关于Java中 因取消装箱可能产生 NullPointerException 的原因

一.什么是装箱,什么是拆箱? 装箱:将值类型转换为引用数据类型。 拆箱:将引用数据类型转换为值类型。说白了就是 Integer与int数据类型之间的转换 二.为什么会有自动一说呢? 我们都知道,java是一个面向对象的语言。因此包括数字、字符、日期、布尔值等等再内的一切都是对象…

7-8次大作业总结

前言 这两次对我这种水平的学生来说很难写,只能搭建大致的框架和思路。 还是要对对第七和第八次大作业里所学进行一个总结,从多方面来分析这两次作业之间的联系和差异,并从中了解自己的不足与缺点。第七次作业添加了互斥开关和窗帘,窗帘还好,只是一个简单的电路的受控设备…

第三轮OOP作业总结

随着这一次大作业的结束,这学期的PTA大作业也随之完结,可以说这最后一次大作业也是最难的一次,在这一次作业中我也感受到了不良代码结构所导致的修改错误的痛苦,接下来让我们对这两次题目进行相应分析。家居强电电路模拟程序-3 家居强电电路模拟程序-4第三次作业 这一次大作…

Windows 7操作系统全面解析与实用技巧

深入介绍Windows 7操作系统的基础知识、功能特性、分类和基本操作技巧,包括核心功能、特征、分类、安装方法、启动、文件管理、个性化设置等方面。旨在帮助用户深入理解Windows 7,并掌握提高工作效率和个性化设置的实用技巧。Win7操作系统一、操作系统的概述 1.1操作系统的概…

C#使用MQTT通讯协议发布订阅主题报文

一、服务端1.添加引用MQTTnet类库  2.代码:启动一个MQTT服务1        // 启动一个MQTT服务器2 // MQTT 3 IMqttServer server = new MqttFactory().CreateMqttServer();4 server.ClientConnectedHandler = new MqttServerClient…

图解 Jenkins Pipeline 的前端自动化部署,用上后真香!

图解 Jenkins Pipeline 的前端自动化部署,用上后真香! 原创 悟空聊架构 悟空聊架构 2024-06-27 20:57 广东 听全文你好,我是悟空。 本文目录如下:一、Jenkins 前端部署思路1.1 整体架构图1.2 部署步骤二、Pipeline和自由风格对比三、Pipeline 核心脚本3.1 获取 Git 代码分支…