第三次OOP作业总结

第三次OOP作业总结

前言

此次作业为家居强电电路模拟程序的再次迭代,主要增加了两个特殊用电器,并且考察学生前几次的程序架构的完善性。新增的电压与电流的要求迫使程序更加智能。


设计与分析

题一:家居强电电路模拟程序-3

题解:在器具方面,控制设备增加了互斥开关,受控设备增加了窗帘,电路设计方面增加了多个并联串接的可能性。

  • 解题思路:增加Switch类代表互斥开关,由于互斥开关具有电阻,所以将计算控制设备的电阻加入到计算电路总电阻的行列中,而非像之前一样仅仅遍历受控设备的电阻来计算电路的总电阻;增加Curtain类来表示窗帘,由于窗帘的特殊工作原理,即需要计算室内的关照强度来决定输出内容,所以在排序之后,因为恰好Curtain类的输出顺序在白炽灯,日光灯的后面,可以将所有灯的亮度记录下来,当出现设备的实际类型为Curtain时,将总的亮度传入该设备中,再进行输出。

  • 说明:此处互斥开关实际上只是一个包装类,内部含有一个LinkedList<Button>类型的数据,接入电路的实际上是互斥开关内部的几个BUtton,互斥开关只在输出时使用。

  • 修改:由于互斥开关引脚问题,即它的1引脚可能出现两次,2、3引脚至多出现一次,所以更改所有设备的构造方法,要求按顺序传入引脚的编号。

  • UML类图

  • 度量

    • 方法

      Method CogC ev(G) iv(G) v(G)
      Button.Button(String) 0 1 1 1
      Button.changeState() 0 1 1 1
      Button.setV() 1 1 2 2
      Button.toString() 1 1 1 2
      Concatenation.Concatenation() 0 1 1 1
      Concatenation.Concatenation(String) 0 1 1 1
      Concatenation.addControl(Control, int) 2 2 1 3
      Concatenation.addControled(Controled, int) 2 2 1 3
      Concatenation.addanotherconcate(Concatenation) 0 1 1 1
      Concatenation.changeButton(int) 1 1 2 2
      Concatenation.changeSeriesControl(int, double) 1 1 2 2
      Concatenation.changeStageControl(int, String) 4 1 3 3
      Concatenation.getConcatenations() 0 1 1 1
      Concatenation.getControlLinkedList() 0 1 1 1
      Concatenation.getControledLinkedList() 0 1 1 1
      Concatenation.getControledhash() 0 1 1 1
      Concatenation.getControlhash() 0 1 1 1
      Concatenation.getParallels() 0 1 1 1
      Concatenation.isState() 12 1 5 9
      Concatenation.link(double) 4 1 5 5
      Concatenation.setConcatenations(LinkedList) 0 1 1 1
      Concatenation.setControlLinkedList(LinkedList) 0 1 1 1
      Concatenation.setControledLinkedList(LinkedList) 0 1 1 1
      Concatenation.setControledhash(HashSet) 0 1 1 1
      Concatenation.setControlhash(HashMap<String, Integer>) 0 1 1 1
      Concatenation.setParallels(HashMap<String, User>) 0 1 1 1
      Concatenation.setR() 4 1 5 5
      Control.Control(String) 0 1 1 1
      Controled.Controled(String) 0 1 1 1
      Controled.getValue() 0 1 1 1
      Controled.setValue(double) 0 1 1 1
      Curtain.Curtain(String) 0 1 1 1
      Curtain.getNeedlight() 0 1 1 1
      Curtain.setNeedlight(double) 0 1 1 1
      Curtain.setValue() 4 1 2 7
      Curtain.toString() 0 1 1 1
      Fan.Fan(String) 0 1 1 1
      Fan.setValue() 3 1 3 3
      Fan.toString() 0 1 1 1
      IncandescentLamp.IncandescentLamp(String) 0 1 1 1
      IncandescentLamp.setValue() 2 1 2 2
      IncandescentLamp.toString() 0 1 1 1
      LandFan.LandFan(String) 0 1 1 1
      LandFan.setValue() 7 1 7 7
      LandFan.toString() 0 1 1 1
      Main.add(String, Concatenation) 27 3 7 16
      Main.main(String[]) 67 1 26 27
      Parallel.Parallel() 0 1 1 1
      Parallel.Parallel(String) 0 1 1 1
      Parallel.addconcern(Concatenation) 0 1 1 1
      Parallel.isState() 3 1 2 3
      Parallel.link(double) 1 1 2 2
      Parallel.setR() 3 1 3 3
      SeriesControl.SeriesControl(String) 0 1 1 1
      SeriesControl.resetTimes(double) 0 1 1 1
      SeriesControl.setV() 0 1 1 1
      SeriesControl.toString() 0 1 1 1
      StageControl.StageControl(String) 0 1 1 1
      StageControl.addstage() 1 2 1 2
      StageControl.changeStageControl(String) 1 1 1 3
      StageControl.cutstage() 1 2 1 2
      StageControl.setStage(int) 0 1 1 1
      StageControl.setV() 0 1 1 1
      StageControl.toString() 0 1 1 1
      SumLamp.SumLamp(String) 0 1 1 1
      SumLamp.setValue() 2 1 2 2
      SumLamp.toString() 0 1 1 1
      Switch.Switch(String) 0 1 1 1
      Switch.changeButton() 3 1 3 3
      Switch.getButtons() 0 1 1 1
      Switch.setIssort(boolean) 0 1 1 1
      Switch.setV() 0 1 1 1
      Switch.toString() 4 2 2 3
      User.User() 0 1 1 1
      User.User(String) 0 1 1 1
      User.compareTo(User) 2 2 2 2
      User.getArraytime() 0 1 1 1
      User.getName() 0 1 1 1
      User.getR() 0 1 1 1
      User.getV() 0 1 1 1
      User.isNext() 0 1 1 1
      User.isState() 0 1 1 1
      User.setArraytime(int) 0 1 1 1
      User.setName(String) 0 1 1 1
      User.setNext(boolean) 0 1 1 1
      User.setR(double) 0 1 1 1
      User.setState(boolean) 0 1 1 1
      User.setV(double) 0 1 1 1
    • Class OCavg OCmax WMC
      Button 2.25 5 9
      Concatenation 4.08 17 49
      Control 1 1 1
      Controled 1 1 3
      Curtain 3 8 15
      Fan 2.67 4 8
      IncandescentLamp 2.33 4 7
      LandFan 3.33 5 10
      Main 25.5 33 51
      Parallel 2.58 8 31
      Pin 1 1 8
      SeriesControl 1.75 4 7
      StageControl 2 4 14
      SumLamp 2.33 4 7
      Switch 3.4 9 34
      User 1.12 4 36
      diode 2.8 8 14

题二:家居强电电路模拟程序-4

题解:在用具方面,增加了二极管;电路设计方面增加了并联套并联的可能性;输出方面,增加了引脚电压的输出要求,以及电路电流的计算要求。

  • 解题思路:增加diode类代表二极管。为了解决引脚电压问题,修改串联中用具的存储方式,从之前的将控制设备与受控设备分开存放改为将所有用具都存放在一个LinkedList类型中,并增加一个属性showV来演示电压在电路中传导的过程;对于电流问题,如果电路为通路则通过I=R/V计算。为了方便引脚的使用,增加一个引脚类Pin

  • diode实际上为一个包装类,其内部只含有一个开关,开关的开与闭由二极管的引脚顺序决定。

  • 增添:

    • downlink方法:将一个串联或并联看出一个整体,如果它所在的电路是短路的,那么它也是短路的。
    • callBack方法:在遇见并联电路时,如果一条路开路,一条路通路,并联电路的输出电压会从开路中返回,直到达到开路的用具。
    • 电流判断特殊情况:如果一个并联出现两个及以上的无电阻的通路,需要将电流平均分配给不含电阻的各个通路。
  • 判断核心

        public void judgeOfShow(User userself, User user, double takeV){if(userself.isState()){if(user.isState()){user.setPinsV(user,userself.getShowV(),0);}elseuser.setPinsV(user,userself.getShowV(),userself.getShowV());}else{if(user.isState()){user.setPinsV(user,userself.getShowV(),0);}elseuser.setPinsV(user,userself.getShowV(),userself.getShowV()-takeV);}}
    

    如果本身是开路的,分两种情况,如果该用电器是开路的,那么两个引脚别为ShowV0,如果是闭合的,那么两个引脚都为ShowV;电路如果是闭合的,其实只有一种情况,就是用电器闭合,那么两个引脚风别为ShowVShowV-takeV[1]

    当电路本身是开路的而开路的元件在该元件之前,那么传出的ShowV为0,也可被包括,故不用考虑这种情况。

  • UML类图

  • 度量

    • 方法

      Method CogC ev(G) iv(G) v(G)
      Button.Button(String, String, String) 0 1 1 1
      Button.changeState() 0 1 1 1
      Button.setV() 1 1 2 2
      Button.toString() 6 1 2 5
      Concatenation.Concatenation() 0 1 1 1
      Concatenation.Concatenation(String) 0 1 1 1
      Concatenation.addEloctor(User) 5 1 4 4
      Concatenation.callback(double) 21 7 9 10
      Concatenation.callsuperState() 0 1 1 1
      Concatenation.downlink(boolean) 5 1 5 5
      Concatenation.getElector() 0 1 1 1
      Concatenation.isState() 3 1 2 3
      Concatenation.link(double) 47 1 19 19
      Concatenation.setElector(LinkedList) 0 1 1 1
      Concatenation.setNowState(boolean) 2 1 3 3
      Concatenation.setR() 5 1 4 4
      Control.Control(String, String, String) 0 1 1 1
      Controled.Controled(String, String, String) 0 1 1 1
      Controled.getValue() 0 1 1 1
      Controled.setValue(double) 0 1 1 1
      Curtain.Curtain(String, String, String) 0 1 1 1
      Curtain.getNeedlight() 0 1 1 1
      Curtain.setNeedlight(double) 0 1 1 1
      Curtain.setValue() 4 1 2 7
      Curtain.toString() 4 1 2 4
      Fan.Fan(String, String, String) 0 1 1 1
      Fan.setValue() 3 1 3 3
      Fan.toString() 5 1 2 4
      IncandescentLamp.IncandescentLamp(String, String, String) 0 1 1 1
      IncandescentLamp.setValue() 2 1 2 2
      IncandescentLamp.toString() 5 1 2 4
      LandFan.LandFan(String, String, String) 0 1 1 1
      LandFan.setValue() 8 1 8 8
      LandFan.toString() 5 1 2 4
      Main.add(String, Concatenation) 31 3 8 18
      Main.main(String[]) 99 1 35 36
      Parallel.Parallel() 0 1 1 1
      Parallel.Parallel(String) 0 1 1 1
      Parallel.addconcern(Concatenation) 0 1 1 1
      Parallel.callBack(double) 3 1 3 3
      Parallel.callsuperState() 0 1 1 1
      Parallel.downlink(boolean) 2 1 3 3
      Parallel.isState() 17 1 9 10
      Parallel.judgeOfShow(User, User, double) 8 1 4 4
      Parallel.link(double) 1 1 2 2
      Parallel.setI(double) 1 1 1 2
      Parallel.setNowState(boolean) 1 1 2 2
      Parallel.setR() 5 1 4 4
      Pin.Pin() 0 1 1 1
      Pin.Pin(String) 0 1 1 1
      Pin.compareTo(Pin) 0 1 1 1
      Pin.getName() 0 1 1 1
      Pin.getV() 0 1 1 1
      Pin.setName(String) 0 1 1 1
      Pin.setV(double) 0 1 1 1
      Pin.toString() 0 1 1 1
      SeriesControl.SeriesControl(String, String, String) 0 1 1 1
      SeriesControl.resetTimes(double) 0 1 1 1
      SeriesControl.setV() 0 1 1 1
      SeriesControl.toString() 5 1 2 4
      StageControl.StageControl(String, String, String) 0 1 1 1
      StageControl.addstage() 1 2 1 2
      StageControl.changeStageControl(String) 1 1 1 3
      StageControl.cutstage() 1 2 1 2
      StageControl.setStage(int) 0 1 1 1
      StageControl.setV() 0 1 1 1
      StageControl.toString() 5 1 2 4
      SumLamp.SumLamp(String, String, String) 0 1 1 1
      SumLamp.setValue() 2 1 2 2
      SumLamp.toString() 5 1 2 4
      Switch.Switch(String, String, String) 0 1 1 1
      Switch.addPin() 22 1 7 7
      Switch.changeButton() 3 1 3 3
      Switch.fullPin() 12 1 8 10
      Switch.getButtons() 0 1 1 1
      Switch.getPinName() 0 1 1 1
      Switch.setIssort(boolean) 0 1 1 1
      Switch.setPinName(HashSet) 0 1 1 1
      Switch.setV() 0 1 1 1
      Switch.toString() 14 1 5 9
      User.User() 0 1 1 1
      User.User(String, String, String) 0 1 1 1
      User.compareTo(User) 2 2 2 2
      User.getArraytime() 0 1 1 1
      User.getI() 0 1 1 1
      User.getLimitI() 0 1 1 1
      User.getName() 0 1 1 1
      User.getPins() 0 1 1 1
      User.getR() 0 1 1 1
      User.getShowV() 0 1 1 1
      User.getV() 0 1 1 1
      User.isIssort() 0 1 1 1
      User.isJustthisstate() 0 1 1 1
      User.isNext() 0 1 1 1
      User.isNowState() 0 1 1 1
      User.isShowV() 0 1 1 1
      User.isState() 0 1 1 1
      User.judgeOfShow(User, User, double) 8 1 4 4
      User.setArraytime(int) 0 1 1 1
      User.setI(double) 0 1 1 1
      User.setIssort(boolean) 0 1 1 1
      User.setJustthisstate(boolean) 0 1 1 1
      User.setLimitI(double) 0 1 1 1
      User.setName(String) 0 1 1 1
      User.setNext(boolean) 0 1 1 1
      User.setNowState(boolean) 0 1 1 1
      User.setPins(LinkedList) 0 1 1 1
      User.setPinsV(User, double, double) 0 1 1 1
      User.setR(double) 0 1 1 1
      User.setShowV(double) 0 1 1 1
      User.setState(boolean) 0 1 1 1
      User.setV(double) 0 1 1 1
      diode.diode(String, String, String) 2 1 2 2
      diode.getButton() 0 1 1 1
      diode.setButton(Button) 0 1 1 1
      diode.setV() 1 1 2 2
      diode.toString() 17 1 6 9
    • Class OCavg OCmax WMC
      Button 2.25 5 9
      Concatenation 4.08 17 49
      Control 1 1 1
      Controled 1 1 3
      Curtain 3 8 15
      Fan 2.67 4 8
      IncandescentLamp 2.33 4 7
      LandFan 3.33 5 10
      Main 25.5 33 51
      Parallel 2.58 8 31
      Pin 1 1 8
      SeriesControl 1.75 4 7
      StageControl 2 4 14
      SumLamp 2.33 4 7
      Switch 3.4 9 34
      User 1.12 4 36
      diode 2.8 8 14

踩坑心得

  • 在Java中,当你执行
   LinledList<String> a ={"a","b","c"};Collections.reverse(a);LinkedList<String> b = a;

这样的代码时,你并没有创建a的一个新副本,而是让ba引用同一个LinkedList对象。因此,对b所做的任何修改都会影响到a,因为它们引用的是同一个对象。

改进建议

将按电阻分配获得电压的方式进行修改,在遍历用具链表的时候根据电阻来计算电压并决定引脚内的数值。

总结

  • 此次作业要求同学们有很好的构造能力,由控制设备与受控设备展开,同时不相互孤立,也因此带来了不小的困难。
  • 题目设置有部分歧义,希望改进。

  1. takeV为该用电器消耗的电压 ↩︎

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

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

相关文章

codis架构学习

转自:https://jackeyzhe.github.io/2018/11/14/玩转Redis集群之Codis/ 1.介绍 codis是一种redis 分布式集群解决方案,codis是基于多个redis实例做了一层路由层来进行数据路由,每个redis实例承担一定的数据分片。Codis FE:集群管理界面。多个集群实例共享可以共享同一个前端…

PTA作业7~8总结

目录1.前言:2.设计与分析:(1)第七次大作业(2)第八次大作业3.采坑心得:4.改进建议:5.总结: ---------------------------------------------------------------------------------------------------------------------------------- PTA作业总结1.前言:这次的作业相比于前几次…

02-单链表的操作

单链表的创建:头插法 #include <stdio.h> #include <malloc.h> #include <stdbool.h>typedef int ElemType; /*定义一个单链表*/ typedef struct LNode{ElemType data;/*下一个元素的地址指针*/struct LNode *next; } LNode,*LinkList;/***单链表的创建* @r…

Java7-8次大作业题目集总结性Blog

Java4~6次大作业题目集的总结性Blog前言这两次大作业无疑就是更好学会面向对象编程了,并且是新添加的信息能够合理处理然后使用。 题量不大,只是在之前的代码上运用开闭原则修改代码,但我还是不能能很好掌握开闭原则。 难度有点大了,第八次大作业在之前的基础上添加了并联…

Linux系统基本介绍

一、Linux系统基本介绍 【1】、Linux操作系统特点多任务的操作系统多任务操作系统严格区分大小写Linux一切皆文件所有文件的起点都是“/”根目录对于Linux操作系统来说文件的后缀名没有任何实际意义,他不像是Windows操作系统中的后缀名代表了本文件是什么类型的文件。Linux中文…

STM32延时函数

STM32延时函数(查询定时器实现) 之前在STM32中使用延时函数的时候,都是直接使用,并不了解其中的原理。经过查阅资料,这里记录一下大致原理。 首先直接贴出来延时函数delay.c,通过查询的SysTick Timer的STK_CTRL寄存器的计数标志位COUNTFLAG方式实现,其中SysTick是一个结构…

OOP最后两次作业总结

OPP最后两次作业总结 前言 两次题目集其实都是在前面的基础上进行迭代,第一次作业说实话我没花什么时间,毕竟我从写第一次PTA就是给电器使用两个接点,我从拿到题目到达到及格分只用了半天时间,然后最后又花了点时间测试几个样例,拿到了82分。然后最后一次作业嘛,我几乎是…

游戏常用运行库 合集 | Game Runtime Libraries Package(2.1.24.0618)

软件简介: 游戏常用运行库 合集 整合了许多游戏会用到的运行库,支持 Windows XP – Windows 11 系统,并且支持自动检测系统勾选推荐的运行库,方便快捷。 本版特点: By:mefcl整合常见最新游戏所需运行库根据系统自动勾选推荐的版本纯净安装包无病毒和弹窗行为支持静默安装…

背包DP——混合背包

顾名思义,混合背包就是将前面三种的背包问题(01,完全,多重)混合起来,有的只能取一次,有的能取无限次,有的只能取 k 次。 正解特解 部分情况下,如小数据,可以转换成多重背包(把完全情况的数量换成足够大,如1e7,就把完全相对变成了多重) 例题 https://www.luogu.co…

cent os配置docker(解决2024.6月docker镜像拉取问题)

docker拉取镜像目前已经失效,多方查找目前试了试下面这个还可以用 首先执行以下命令安装dockeruname -r yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum …

Field stock doesnt have a default value

当你遇到 "Field stock doesnt have a default value"​ 这个错误时,这意味着你正在尝试插入一条新记录到数据库中,但是涉及的 stock 字段没有提供一个值,同时该字段在数据库表定义中也没有设置默认值(default value),并且数据库配置为严格模式,不允许NULL值或…

南昌航空大学软件学院23201823第三次blog

一、前言 这是最后一次blog了,是一些关于题目集7~8次的总结以及这一个学期对于PTA题目集的总结了。最后这两次的题目难度其实我并不是非常了解,大抵是因为我已经来不及挽救了,但是我还是想说其实这几次题目的难度感觉并没有想象中的触不可及,而是我自己没有花足够的心思去了…

中国城市降雨量历史记录查询 All In One

中国城市降雨量历史记录查询 All In One 降雨量 历史记录中国城市降雨量历史记录查询 All In One降雨量 历史记录https://www.ceicdata.com.cn/zh-hans/china/precipitation 中国 降水量:河南:郑州 1990 - 2022 | 月 | 毫米 | 气象局 降水量:河南:郑州在12-01-2022达1.500毫米,…

oracle安装调用图形化失败

报错现象: [grid@19c01 grid]$ ./gridSetup.sh ERROR: Unable to verify the graphical display setup. This application requires X display. Make sure that xdpyinfo exist under PATH variable.No X11 DISPLAY variable was set, but this program performed an operatio…

Kubernetes-高可用k8s集群部署(多Master节点二进制方式)

一、安装Docker 配置docker的yum源地址 yum -y install wget wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum provides docker-ce 安装指定的docker版本 yum install -y docker-ce-20.10.7 docker-ce-cli-20…

23201813-第三次blog作业

前言: 这学期已经接近了尾声,java和面向对象的学习也已经接近结束,在这门课程的最后时间里,剩余的两次pta我都没有完成,一部分原因是后面的题目集感觉好难,然后要经过好多迭代,还有期末的考试学科很多,有大部分的时间用来复习,所以对pta就基本上放弃了,所以最后两个题…

一个HTML页面demo

代码:<!--* @Description: 一个博客页面布局,加上一些CSS和JS样式* @Author: zhangyh* @Date: 2024-06-29 15:25:16* @LastEditTime: 2024-06-29 23:06:12* @LastEditors: zhangyh* Copyright (c) 2024 by zhangyinghui181217@163.com, All Rights Reserved. --><!…

WPF网格类型像素着色器

由于WPF只能写像素着色器,没法写顶点着色器,所以只能在这上面做文章了 刚好有个纹理坐标TEXCOORD输入可用,而且值的范围是已知的0-1,左上角是原点,这就好办了 例子 索引 二分网格使用ceil 0-1移动定义域到-0.5 - 0.5,然后向上取整变成 0 / 1float4 main(float2 uv : TEXC…

LLM大模型: RAG两大核心利器: M3E-embedding和bge-rerank

RAG的效果好不好,最核心依赖两点:文本embedding语义提取的好不好,rerank的排序效果好不好(包含正确答案的文本是不是排在前面)!各自使用的环节如下:1、文本embedding的提取:理论上讲,任何transformer架构的encoder部分都可用于生成token的embedding,然后采用合适的po…

oop-PTA题目集7~8总结

一、前言 第七次和第八次的题目集中的题目均是在前两次的电路模拟程序中增加新的内容,难度相较前面两次的题目有明显增大,主要是电路结构更加复杂,比如多并联、并联包含并联等较为特殊的情况,另外,新增了一些需要特殊处理的电器设备,比如有三个引脚的互斥开关、与其他设备…