PTA7-8次作业

news/2024/7/4 16:34:50/文章来源:https://www.cnblogs.com/xyxpta/p/18276526

1.前言:
第七次作业是在第六次作业基础上的拓展,新增互斥开关与受控窗帘(要求:互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。互斥开关的默认状态为1、2引脚接通,1、3引脚断开。图1中所示的互斥开关可以反过来接入电路,即汇总引脚接往接地端,两个分支引脚接往电源端。)
受控窗帘的电路符号为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,窗帘处于全开状态。)
图一:

为保证开关安全,在互斥开关处添加电阻,使其并不太适合控制装备的子类,窗帘的条件也偏多,先判断是否有足够电压,在判断总光照(关灯情况使其光照强度为0)。
第八次作业是最后的迭代,难度加大很多,添加电流限制和输出管脚电压,还添加有短路检验,使得优先级有较大改变,添加有二极管元件,且并联电路中包含有并联电路,较考验前期类的完整性和兼容性。最后这两次作业不包含测试点提示,使得难度进一步增大。
2.设计与分析:
第七次作业:
第七次作业在第六次作业基础上的拓展,新增互斥开关与受控窗帘,关键在于互斥开关的处理和对窗帘优先级的判定。为保证开关安全,在互斥开关处的添加电阻,使其并不太适合控制装备的子类,我直接让他成为控制装置,使得使用起来并不方便,频频出错,也没有很好处理优先级问题,我的这次作业显然是个失败品。注释问题依然存在,时间线长到可以让人模糊类中方法的作用,添加注释才可以更好的修改,此次作业使用了许多类,但是并没有遵守或运用单一职责原则、开闭原则、迪米特法则,且许多判定过程写在了主方法中,而不是写在类中作为类的方法,更没有代理类。因为在敲之前,很多逻辑部分并没有思考清楚,导致代码出现了许多的冗余及不必要的代码,我意识到了写注释的重要性。写注释不仅有益于在写代码过程中清晰自己的逻辑,更有益于改代码过程中读懂自己之前写的代码。在主函数中的输出和修改状态部分,未找到简便快捷的方法,过多的全循环使得代码过于浪费空间且耗时,无效循环非常多。因接口与抽象类不熟练,未使用。
添加了互斥开关类,部分代码如下:

点击查看代码
 private Switch switch1=new Switch(0,"switch_1");private Switch switch2=new Switch(0,"switch_2");public double getResistance(){return resistance;}public Switch getsw1(){return switch1;}public Switch getsw2(){return switch2;}
public void setOutputV(double current){if(this.state==0){this.switch1.setinputV(this.inputV-current*this.resistance);this.switch2.setinputV(0);this.outputV=this.inputV-current*this.resistance;}else if(this.state==1){this.switch2.setinputV(this.inputV-current*this.resistance);this.switch1.setinputV(0);this.outputV=this.inputV-current*this.resistance;}}

添加有受控窗帘类,部分代码如下:

点击查看代码
public void setOpenrate(double brightness){if(this.deviation<50){this.openrate=1;}else if(brightness<50||brightness>=0){this.openrate=1;}else if(brightness<100||brightness>=50){this.openrate=0.8;}else if(brightness<200||brightness>=100){this.openrate=0.6;}else if(brightness<300||brightness>=200){this.openrate=0.4;}else if(brightness<400||brightness>=300){this.openrate=0.2;}else if(brightness>=400){this.openrate=0;}}
SourceMontor的生成报表如下:

由主要的三个函数和总体来看,不足还是有很多。可以看出:各文件的代码行数差异较大,项目中不同模块或功能的代码量差异大;部分文件的分支比例显示为0.0%,意味着这些文件没有包含条件语句;不同文件的方法数量也差异较大,高方法数量可能意味着该文件或类承担了较多的功能,需要关注其内聚性和可维护性;平均复杂度和最大复杂度大,某些方法可能较为复杂,需要特别注意以避免潜在的错误或性能问题。
类图如下:

第八次作业:
第八次作业是最后的迭代,难度加大很多,添加电流限制和输出管脚电压,还添加有短路检验,使得优先级有较大改变,添加有二极管元件,且并联电路中包含有并联电路,较考验前期类的完整性和兼容性。最后这两次作业不包含测试点提示,使得难度进一步增大。管脚电压我用输入电压和输出电压分别表示1,2处,互斥开关的2,3处用switch1,switch2的输出电压,1处用其输入电压。二极管设计为特殊的开关,根据管脚判定开关。短路添加旗帜,检测到直接跳过输出。添加对象最大电流。
二极管部分代码如下:

点击查看代码
public class Diode extends Control{public void setState(int flag){this.state=flag;}
}
SourceMontor的生成报表如下:

同上次作业一样,存在问题。分支语句百分比正常,为41.0%;类和接口分布偏低。
类图如下:

采坑心得:
第七次作业:
传递电流部分出错,会使得数据全部错误。
要注意互斥开关的电阻计算,它更类似于用电器,会分走一部分电流。
窗帘的判定要放在所有灯判定的后面,否则会数据错误。
第八次作业:
二极管的管脚需额外放在一个对象中,根据管脚判断旗帜是0/1,再判断其state。
短路判断不可放在太前面,可在最后面添加判定,否则前面还未通电过一遍元件就会直接判定短路。
改进建议:
写代码时提前画好类图以减少遗漏。
排序优先于修改状态更好。
多考虑优先级问题,先将预定状态确定后再传电压。
套用串并联时额外写方法更不易出错。
部分类不可太专。
总结:
1.学到了:
Java基础语法
封装、继承、多态的实现(结构体实现封装,组合实现继承,接口实现多态)。
接口的定义和实现(一个类可以实现多个接口 使用关键字interface来定义接口)。
抽象类和接口的区别。
ArrayList、LinkedList、HashMap的使用方法。
类之间的调用与复用。
数组的建立到运用。
2.需要进一步学习及研究:
提高类的带注释的行百分比。
在写代码之前,要将整个代码的逻辑部分设计好,避免出现写到中途手忙脚乱的现象。
提升代码的可复用性,注重设计中的开闭原则。
每次写完代码都会出现数组越界的情况,原因大概是思考逻辑时,无法面面俱到。多敲代码以提升自己的思考能力以及逻辑能力。画设计图、类图是个不错的选择。
在对象传递与赋值时找错对象,画出空间概念图可避免。
3.建议:
希望能有完整的思路和过程展示,以供观摩
希望测试点点明测试方向。
希望挑出常用方法的难点讲。

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

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

相关文章

.net6 prism wpf 8.1使用 halcondotnet 17.12程序集

1、找到安装目录下的halcondotnet.dll 2、自己新增dlls离线程序集合文件夹 3、放入halcondotnet.dll 4、wpf程序右键引用dll 5、报错 System.Drawing.Common问题nuget安装包 System.Drawing.Common 6、wpf使用halcondotnet.dll 程序集 <UserControl x:Class="Halcon…

表格结构转换(Filter+ToRow)

问题:一维表转成二维表,重复的内容横向展开 函数公式解决:=TOROW(FILTER(B$2:C$7,A$2:A$7=E2))

VAE生成人脸代码

基于VAE介绍的理论,简单实现VAE生成人脸,代码如下: utils.pyimport os from torch.utils.data import Dataset from torchvision.transforms import transforms import glob import cv2 import numpy as np import torchclass MyDataset(Dataset):def __init__(self, img_pa…

ret2shellcode

参考链接 :基本 ROP - CTF Wiki (ctf-wiki.org) 参考链接: https://www.freebuf.com/vuls/266711.html 参考链接:PWN入门(2-2-1)-栈迁移(x86) (yuque.com)介绍栈溢出漏洞的一种利用方式,通过向可写入可执行内存写入shellcode,并利用栈溢出漏洞将返回地址覆盖为shellco…

判断存在与否

问题:A、B两个表,在B表中判断其中数据在A表是否存在。 函数公式解决: =COUNTIF(A!A:A,A2)

有点难以描述的问题(转列+排序+去重)

问题: 以下数据起始值为0,与0同行的2在数据源中有重复,则取与之重复的2的同行数据即6,6在数据源中仍有重复,再取与之重复的6的同行数据8,8在数据源中没有重复,则为第一行第二列的结果。 以此类推。函数公式解决:=WRAPROWS(UNIQUE(SORT(TOCOL(A3:B8)),,1),2) 先用ToCal…

outside_的第三次博客作业

outside_的第三次博客作业 --Wenxiaowenyy 前言: 这次博客是本学期的最后一次博客,也是大一的最后篇博客,回顾这学期学习java的热情以及完成大作业的积极性比起学c语言的时候减少了许多,原因有很多,其一是自己变懒惰了,其二是这学期的java比起上学期的c语言的确难度增加了…

最大值减不为0的最小值

问题:一列中的最大值减去不为0的最小数(所有数据均为正数) 函数公式解决:=MAX(B4:B7)-MINIFS(B4:B7,B4:B7,">0")如果数据有正有负,则需要用MaxIfs减去MinIfs,MaxIfs与MinIfs用法相同。

搭建rust开发环境-记录

通过官网教程(https://www.rust-lang.org/zh-CN/learn/get-started)下载rustup安装 在项目开始的时候提示需要解析工具,按照提示需下载vsstudio,安装的时候选择c++开发桌面程序,不然后面build时候报错 参考文档:https://blog.csdn.net/weixin_44475303/article/details/1…

文本时间转成小数

问题:文本时间(**小时**分钟**秒)转成小数,小时部分为整数。 函数公式解决:传统套路 =SUBSTITUTE(SUBSTITUTE(A2,"小",),"钟",)*24 新套路 =SUBSTITUTES(A2,{"小","钟"},)*24 更新的套路(正则) =REGEXP(A2,"[小钟]",…

Face Adapter - 一键面部表情迁移、换脸工具 本地一键整合包下载

Face Adapter是一款高效的人脸编辑适配器,由浙江大学和腾讯联合开发,适用于预先训练的扩散模型,专门针对人脸再现和交换任务。只需要上传一张源脸和一张参考人脸,就能按照参考人脸的风格生成相同的面部的表情,一键生成两张换脸照片。类似的ID保持的人像生成软件,还有我们…

高级筛选超过15位的数字

问题:高级筛选直接设置条件,当条件的数字超过15位时会出现错误,要如何解决。 解决:在高级筛选条件中设置公式,公式所引用单元格为数据源表标题行下第一行,公式所在单元格上一个单元格必须空

OOP第三轮大作业总结

关于学习OOP的一点总结 本学期的pta也是走到尾声了,一路过来最深的体会是想做好面向对象真不是件容易的事情,但它确实在日常生活中发挥了很大的作用。个人很喜欢这种和实际结合起来的课程,但几个月下来我学得并不是很好,只能日后自己钻研了。 个人体会 关于语法: 1.因为一…

第三次大作业Blog

目录前言设计与分析踩坑心得改进建议总结 前言 知识点:类与对象的应用: 在三次大作业中,类与对象的应用无疑是核心和基础。这充分体现了Java作为一种面向对象编程语言的特性。通过定义类,我们可以创建具有特定属性和行为的对象,从而构建出复杂的程序逻辑。在每次大作业中,…

前端调用后端产生跨域问题解决

[参考文章](https://www.cnblogs.com/zhaodalei/p/17090119.html) ## 问题复现 * 前端的地址是* 后端的的请求资源地址 http://127.0.0.1:3000/api/category/list。 * 当前端请求获取后端数据时,会报如下错误,导致资源加载不出来。但是直接访问是可以获得数据的。说明不是数据…

java第三次大作业blog

pta第三次博客 目录 • pta第三次博客 o 1.前言 o 2.设计与分析 o 3.踩坑心得: o 4.改进建议 o 5.总结1.前言 这两次题目集的主要考察的知识点是继承和多态,包括对super、extend关键字的使用,方法的重写,类的继承,接口,排序,正则表达式等。 在数据处理方面,作业同样要求…

Python基础之多进程

目录1 多进程1.1 简介1.2 Linux下多进程1.3 multiprocessing1.4 Pool1.5 进程间通信1.6 分布式进程 1 多进程 1.1 简介 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用…

[LeetCode] 169. Majority Element

排序,返回中值。class Solution:def majorityElement(self, nums: List[int]) -> int:#always existsnums.sort()return nums[len(nums)//2]

BUUCTF---childRSA(费马引理)

题目点击查看代码 from random import choice from Crypto.Util.number import isPrime, sieve_base as primes from flag import flagdef getPrime(bits):while True:n = 2while n.bit_length() < bits:n *= choice(primes)if isPrime(n + 1):return n + 1e = 0x10001 m = …

Python 使用__slots__来限制实例动态添加属性

在Python中,是可以随便在对象实例中动态添加属性的。那么,怎么样可以防止其他人在调用类实例的时候胡乱添加属性和方法?使用 __slots__ 属性,来限制 class 实例能添加的属性也就是说,只有在 __slots__ 变量中的属性才能被动态添加,否则会添加失败。例如,创建一个 Person …