OOP 7-8总结

news/2024/7/7 21:02:24/文章来源:https://www.cnblogs.com/oopLearning/p/18276210

oop 7~8总结

前言

  • 知识点

    整体的知识点与前几次的题目没有太多的不同,每次迭代因为题目要求都有增加,所以会新增一些做法,但是像是继承、集合框架、正则表达式、抽象类、多态以及接口等知识点依然会重复使用,只是用法会不同。

    越写到后面我越是意识到算法的重要性。在题目里面需要考虑遍历算法(用于遍历电路中的设备,执行控制的命令以及计算电压和电流等)、状态更新的算法(根据控制命令来更新设备的状态)、计算具体数值的算法(用来计算电压、电流、亮度、转速等)等等。这些算法贯穿整个题目,是重要的逻辑。好的算法可以将复杂的问题简单化,减轻我们思考的压力。

    另外我觉得这道题目一样非常重要的是字符串的处理。需要解析输入的字符串,提取设备的标识符、编号、引脚等信息。还需要构建连接信息的字符串来表示电路的结构。

  • 题量

    题量不多,但是很难。

  • 反思

    迭代的题目环环相扣,自从有一次因为字符串的解析有问题,数据不能成功存储进集合中之后,后面举步维艰,写的非常的痛苦并且没有起色。我深刻意识到自己在动手能力这方面的欠缺之大。学习软件工程不能只是纸上谈兵,要有扎实的基础和强硬的动手能力才能学好这门课程。PTA的题目对我来说难度比较大,但是每次写出来得到高分的同学大有人在,这也说明了不是题目太难,是能力不够。但是对于我自己来说走到这一步已经是我努力后的结果,虽有遗憾但是不可惜,今后需要努力提升自己的动手能力。

设计与分析

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

新增内容

互斥开关

互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。 开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。 互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。 互斥开关的默认状态为1、2引脚接通,1、3引脚断开。 图1中所示的互斥开关可以反过来接入电路,即汇总引脚接往接地端,两个分支引脚接往电源端。

为避免短路,互斥开关设置了限流电阻,12引脚之间默认电阻为5,13引脚之间默认电阻为10。

受控窗帘

受控窗帘的电路符号为S,其最低工作电压为50V,电压达到或超过50V,窗帘即可正常工作,不考虑室外光照强度和室内空间大小等因素,窗帘受室内灯光的光照强度控制。

当电路中所有灯光的光照强度总和在[0,50)lux范围内,窗帘全开; 在[50,100)lux范围内,窗帘打开比例为0.8; 在[100,200)lux范围内,窗帘打开比例为0.6; 在[200,300)lux范围内,窗帘打开比例为0.4; 在[300,400)lux范围内,窗帘打开比例为0.2; 在400lux及以上范围内,窗帘关闭。 当电压低于50V,窗帘不工作,默认为全开状态。 如果电路中没有灯或者灯全部关闭,光照强度为0,窗帘处于全开状态。

窗帘电阻为15

考虑多个并联电路串联在一起的情况。

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

本例中T1\T2两条串联电路T3的一个部分,本题考虑这种类型的输入。

设计思路

  • MutexSwitch类表示互斥开关,其中的toggle方法用于切换开关的状态。由于connectedPin的初始值为2,并且在此方法中,它的值被更新为5 - connectedPin,所以每次调用这个方法时,connectedPin的值会在2和3之间切换。虽然这看起来像是在模拟引脚编号的切换,但实际上它只是用作一个内部状态标志,用于表示开关是打开还是关闭。
点击查看代码
class MutexSwitch extends Device {int connectedPin;public MutexSwitch(String id) {super(id, "H");this.connectedPin = 2;}public void toggle() {connectedPin = 5 - connectedPin; // Toggle between 2 and 3}@Overridepublic String toString() {return "@" + type + id + ":" + (connectedPin == 2 ? "closed" : "turned on");}
}
  • ControlledCurtain类中的updateTotalLightIntensityremoveLightIntensity方法将由电路中的其他灯光设备(如白炽灯、日光灯等)在它们的状态变化时调用,以更新受控窗帘的总光照强度。getCurtainOpenPercentage方法,用于获取窗帘当前的打开百分比
点击查看代码
 public class ControlledCurtain extends Device {private static final int WORKING_VOLTAGE_THRESHOLD = 50; // 窗帘最低工作电压private double totalLightIntensity = 0; // 总光照强度private double curtainResistance = 15; // 窗帘电阻private double curtainOpenPercentage = 100; // 窗帘打开百分比,默认全开public ControlledCurtain(String id) {super(id, "S");}// 更新总光照强度(由其他灯光设备调用)public void updateTotalLightIntensity(double newIntensity) {totalLightIntensity += newIntensity;updateCurtainState();}// 当灯关闭时,更新总光照强度(减少相应强度)public void removeLightIntensity(double removedIntensity) {totalLightIntensity = Math.max(0, totalLightIntensity - removedIntensity);updateCurtainState();}// 根据总光照强度更新窗帘状态private void updateCurtainState() {if (totalLightIntensity < WORKING_VOLTAGE_THRESHOLD) {// 电压低于50V,窗帘不工作,默认为全开状态curtainOpenPercentage = 100;} else if (totalLightIntensity >= 400) {// 光照强度400lux及以上,窗帘关闭curtainOpenPercentage = 0;} else if (totalLightIntensity >= 300) {// [300,400)lux范围内curtainOpenPercentage = 0.2 * 100;} else if (totalLightIntensity >= 200) {// [200,300)lux范围内curtainOpenPercentage = 0.4 * 100;} else if (totalLightIntensity >= 100) {// [100,200)lux范围内curtainOpenPercentage = 0.6 * 100;} else if (totalLightIntensity >= 50) {// [50,100)lux范围内curtainOpenPercentage = 0.8 * 100;}}// 获取窗帘打开百分比public double getCurtainOpenPercentage() {return curtainOpenPercentage;}@Overridepublic String toString() {return "@" + type + id + ":" + (int)(curtainOpenPercentage * 100) / 100.0 + "%"; // 保留两位小数}
}

改进建议

1.输入信息处理的比较混乱,数据无法存储

2.正则表达式使用的有问题,解析的设备信息、连接信息和控制设备调节信息不准确

3.输出处理没有全部完成

4.设备状态更新的逻辑不够准确,需要再次完善

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

新增内容

二极管

1)增加管脚电压的显示

在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压。(格式详见输出信息部分)

2)电流限制

电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。

例如:**@B1:190 68-17 **exceeding current limit error

本题各类电器的最大限定电流如下:

开关20、分档调速器18、连续调速器18、白炽灯9、日光灯5、吊扇12、落地扇14、互斥开关20、受控窗帘12、二极管8。

3)短路检测

如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”

4)并联电路中包含并联

本次迭代考虑并联电路中包含并联电路的情况,即构成并联电路的串联电路可以包含别的并联电路。

5)二极管

增加二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。

image.png

二极管的标识符为’P’,左侧管脚编号为1,右侧管脚编号为2。

二极管如果两端电压相等,没有电流流过,分以下两种情况输出:

1、如果两端电压为0,二极管的导通/截止状态由接入方向决定,1号引脚靠近电源则状态为导通,反之为截止。
2、如果两端电压不为0,二极管导通。

源码分析

设计思路

二极管是一个电子元件,通常具有两个引脚(阳极和阴极),只允许电流在一个方向上流动。在模拟电路中,二极管可能具有一些特定的属性和行为

点击查看代码
 public class Diode extends Device {// 假设的二极管正向电压降private static final double FORWARD_VOLTAGE_DROP = 0.7;// 是否处于正向导通状态private boolean isForwardBiased;// 构造函数,使用Device的构造函数并设置初始状态为非导通public Diode(String id) {super(id, "D"); // 假设"D"代表二极管类型this.isForwardBiased = false;}// 设置二极管是否处于正向导通状态// 这个方法应该基于电路中的电压和电流来判断,但在这里为了简化我们直接设置public void setForwardBiased(boolean forwardBiased) {this.isForwardBiased = forwardBiased;}// 判断二极管是否处于正向导通状态public boolean isForwardBiased() {return isForwardBiased;}// 假设的方法,用于计算通过二极管的电流// 在实际情况中,这将基于电路中的电压、电阻和其他因素来计算public double calculateCurrent(double voltageAcross) {if (isForwardBiased && voltageAcross >= FORWARD_VOLTAGE_DROP) {// 在这里,我们简单地假设一个固定的电流值,但在实际中这将是一个复杂的计算return 1.0; // 示例值,不代表真实电流} else {return 0.0; // 如果不是正向偏置或电压不足,则没有电流}}// 重写toString方法以提供二极管的简化状态信息@Overridepublic String toString() {return "@" + type + id + ":" + (isForwardBiased ? "forward biased" : "reverse biased");}
}

踩坑心得

1.我不知道二极管一边允许电流通过而另一边不允许应该怎么用程序逻辑表示出来,不知道用哪种算法。

2.在题目信息比较多的情况下我喜欢将信息以简图或者文字的形式整理在纸上,这样看着比较清晰,防止信息遗漏。

总结

最后两次作业我都没有做出来,一个是由于之前程序存在的问题没有解决导致无法进行下去,还有就是临近期末,考试特别特别多,面对十分困难的PTA作业,我实在是没有信心花费大量的时间后能做得出来,于是将重心倾向在了考试科目上,但可以保证的是我绝对没有浪费时间。

后面几次老师都没有给出测试点,起初我还有些不理解,毕竟看着测试点写心里比较有底。但是老师说如果以后在企业工作写代码时哪里会有测试点?这么一想特别有道理。看着测试点写就像是看着线索写题目,总想把过程靠近测试点,甚至有的时候还可以凑出答案,确实是不合理的。

学习这门课程写的代码比上学期学C语言的时候写的代码多很多,我最大的收获就是学会了正则表达式和编译器的调试功能。调试真的能帮助我们找到一些不容易发现的错误,特别是在思路稍微复杂的程序里面,优势体现的更加明显。

这学期的课程已经结束,这么长的时间里虽然煎熬痛苦,但是每多掌握一个知识点,每多得一分带来的开心和喜悦是别人无法体会的。在学习过程中,我深刻意识到了自己的不足,与优秀同学的巨大差距,这也将是我未来要着重提升的地方。最后我真的由衷感谢课程组的老师们,他们都是特别特别特别负责得老师,我能感受到他们对教育工作的热忱之心和超强的专业能力。对我个人而言印象最深刻的就是在部分同学认为PTA作业太困难以至于想要放弃这门课程的时候,老师鼓励我们,即使写不出来也不要放弃,还可以做好这门课的其他方面来提升自己,比如实验,比如认真学习线上慕课等。包括中间由于题目太难,老师加班重新出了一道新的题目。我能感受到老师真的在切实为这门课努力,为学生的成长与发展努力。课程中间老师也指出过我的问题,我都听进去了并且努力改正。真的感谢老师们,他们都是最好最好最好的老师!

接下来我会认真复习,争取通过期末考试,以后也会着重提高自己的动手能力,不怕困难,迎难而上。

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

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

相关文章

家居强电电路模拟程序的两次迭代(包含最终版本)

目录: 一)前言 二)设计与分析 三)踩坑心得 四)改进建议 五)总结 (2)家居强电电路模拟程序-3: 【1】知识点:ArrayList的运用,物理知识的运用。 【2】题量:较大 【3】难度:较难 在家居强电电路模拟程序的迭代中引出较难的互斥开关 (3)家居强电电路模拟程序-4: 【1】…

免费的数据可视化(PCA、t-SNE和UMAP)网页程序

这是一款免费的数据可视化(PCA、t-SNE和UMAP)网页程序,直接进行在线操作,无需下载。这是一款免费的数据可视化网页程序,直接进行在线操作,无需下载。 URL: https://data-visualization-webapp-by-shuaibingli.streamlit.app/ 总体页面【预处理+可视化(PCA、t-SNE和UMAP)+保…

养老院视频监控智能分析系统

养老院视频监控智能分析系统为养老院提供先进的视频监控智能分析技术手段,构建养老智慧监控和安全智能分析防范体系,用科技手段弥补传统方法和技术在监管中的缺陷,变被动“监督”为主动“监控”。致力于打造智慧养老院,打造人性化托养、智能化运营管理,为各大养老机构减少…

关于nchu题目集7~8的总结

关于nchu题目集7~8的总结 一、前言 总结两次题目集的题目的知识点、题量、难度等情况 二、内容[题目[1]](##第三次题目(简略版)) [代码[2]](##我的代码) [设计与分析[3]](##设计与分析) [踩坑心得[4]](##踩坑心得) [改进建议[5]](##改进建议)题目集8最后一题(简略版)1、控制…

springboot+vue前后端分离项目-vue项目搭建5

1.改造登录vue/src/views/LoginView.vue,登陆后存储user信息到sessionStorage,进入到login页面移除sessionStorage里的user 2.改造vue/src/components/Header.vue,从sessionStorage中获取user,每个人登陆后根据个人信息显示名称 3.增加vue/src/views/Person.vue,点击个人信…

生产环境部署Nginx服务器双机热备部署-keepalived(多种模式教程)

前言:今天演示下生产环境keepalived的部署方式,安装模式有很多,比如说主备模型和双主模型,主备分:抢占模式 和 非抢占模式。这里我会一一展开说具体怎么配置 一、双节点均部署Nginx: 第一步:上传安装包到/usr/local/ 第二步:安装编译依赖(使用普通用户需要家sudo) yu…

无业游民写的最后一个.net有关项目框架

理想很丰满,现实往往很残酷。 一种按照ddd的方式,根据业务来把自己需要的模块一个一个写出来,再按照模块把需要的接口一个一个的写出来,堆砌一些中间件,以及解耦的command,handler等等 ,一个项目就这么成型了。上面的项目有一个非常清晰的特点,就是按需开发,不需要去可…

OOP第三次Blog

前言: (1) 第七次题集只有一道题目——家居强电电路模拟程序-3,这是第三次迭代,这次迭代主要的点有四个。 ​ 首先本次迭代添加了线路中存在多个串联起来的并联电路。不同于上次的单并联,本次更复杂。 ​ 然后本次还新迭代了一种控制器——互斥开关,互斥…

23201829OO第三次blog作业

OO第三次blog作业 前言 这次blog是本学期最后一次回顾总结,本次blog的范围是“家居强电电路模拟程序”的第三和第四次迭代,分别加入了互斥开关、窗帘的概念、多个串联起来的并联电路、串联电路中包含其他串联电路的情况和串联电路中包含串联电路的情况和二极管。因此这两次PT…

企业做账流程详解

都说会计月底很忙,那究竟都在忙什么呢,一起来看看吧

快速提取视频字幕!适用B站、AI字幕等等。好用

快速提取视频字幕!适用B站、AI字幕等等。好用 以B站为例: 视频教程:快速提取视频字幕!适用B站、AI字幕!非常好用_哔哩哔哩_bilibili 无论是视频的字幕,还是AI字幕,都可以提取。比较简单。 首先好像需要确定 视频的字幕还是AI字幕。如果是视频字幕,下面F12之后,输入的是…

Ymodem协议说明

Ymodem流程介绍1.Ymodem帧格式 Ymodem两种帧格式: 1024数据格式帧:名称 帧头 包号 包号反码 信息块 校验简写 SOH PN XPN DATA CRC字节数 1 1 1 128 2128数据格式帧:名称 帧头 包号 包号反码 信息块 校验简写 STX PN XPN DATA CRC字节数 1 1 1 1024 21.1 帧头 帧头一个有两…

CentOS7.9部署Nginx

简介 本章节主要讲的是在Linux系统CentOS7.9上去完成Nginx Web服务安装部署 步骤 1.配置 Nginx 源 2.yum 安装 Nginx 3.启动 Nginx 4.浏览默认站点 实施 1.配置 Nginx 源// 执行如下命令 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el…

CF132E Bits of merry old England

传送门构图好题。郑哥的题解 每一个输出的位置看作先分配变量(赋值或者用前面的),再输出。 给每个位置拆三个点 \(v_{i,1/2/3}\)。\(v_{i,1}\) 的流入表示这个位置的 "空变量" 数量(包括有值但是我们选择让它不重复使用的变量);\(v_{i,2}\) 有流入表示分配好了…

opp7~8题目集的反思与总结

opp7~8题目集的反思与总结 1、前言: 这两个题目集都是对于电路题目的迭代,都是对于电路题目的应用,对于电路的题目集,在上次的opp的题目集中就已经简述过了,没有看过的可以点击链接查看(opp第二次blog) 在这个里面就是之前的opp的题目集,讲述了大致的内容,这个是基础,…

CentOS7.9部署.NET Core 8.0

简介 本章节主要讲的是在Linux系统CentOS7.9上去完成.NET Core 8.0软件的安装,确定Linux的版本是x64还是arm64的,然后到.NET Core的官网下载8.0的SDK,并进行安装 步骤 1.查看系统版本 2.打开.NET Core 8.0下载网址 3.下载与Linux系统对应版本的.NET Core SDK 4.上传.NET Cor…

使用世界变换的逆转置矩阵对法线进行变换

最近在做法向量变换的时候,踩了两个坑,记录一下相关的知识点法向量变换细节记录 最近在做法向量变换的时候,踩了两个坑,记录一下相关的知识点 法向量做变换,最后一位是补0 我们知道,顶点在做变换的时候最后一位是 1.0,法线最后一位是补0.0 vec3 normCurrent = (getMatri…

JS逆向——动态页面逆向

JS逆向——动态页面逆向 一. 步骤关键点分析 逆向分析信息提取逻辑 模拟执行二. 实现 1. 关键点分析 找到实现kml导出的按键,发现是通过JS函数实现的,需要针对该函数进行JS代码逆向分析,找到实现的函数逻辑。 ​​ 2. 逆向分析信息提取逻辑 定位找到exportKML函数 ​​ 对该…

开源一款基于 Typecho 开发的导航主题

主题介绍 BeaconNav是基于typecho开发的一款导航主题,Beacon是灯塔的意思,希望使用者在知识的海洋里能够如同有灯塔指引一样目标明确,永远不会迷失方向。 演示站点:https://nav.ilaozhu.com主题特点响应式设计,适配手机、平板、电脑等设备; 支持自定义 LOGO、背景图片; …

一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator

前言 对于后端程序员来说,编写SQL代码是日常工作中不可或缺的一部分。然而,随着数据复杂性的增加,如何高效、准确地编写SQL查询成为了新的挑战。幸运的是,SQL Translator的出现为后端程序员提供了一个强大的工具,将自然语言查询转换为精确的SQL代码,极大地提高了工作效率…