最后两次oop作业总结

news/2024/7/7 21:38:40/文章来源:https://www.cnblogs.com/88aa/p/18277127

1.前言
最后两次作业(即第七八次作业)大题目都是家居强电电路模拟程序,每次作业分别给了一个礼拜的时间去完成,题量较少,难度逐渐升高,以下为依次对两周题目集的知识点,题量和难度进行概述:

  • 第六次作业:
    第六次作业只有一道题
    家居强电电路模拟程序3,题目大概是输入设备信息调节信息控制设备调节信息三种信息,然后输出信息按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。特点是只有串联电路里面套并联电路,并联电路里面套串联电路,了解元件在电路上的位置,了解每个元件的工作原理即可完成这道题目,当然个别元件处理上有点细节没注意到会导致部分测试点过不去,另外相比第二次大作业,难度相比于上一次大了很多还加入了互斥开关和新元件受控窗帘,相比于第一次大题目只需要用一些基础知识点就可以完成,这一次还需要利用多态继承来设计类,类之间关系也变得愈加复杂这个等到踩坑心得部分具体说一下
  • 第七次大作业
    难度非常大,我也没有解决出来这道题,加入新元件二极管,难度很大,我有点没读懂题的感觉,另外还增加了增加管脚电压的显示在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压,还有电流限制 电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。还有一个点是短路检测 如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”,难度还是很大很大的
    2.设计与分析

一开始我没看懂题目本意导致走了很多弯路,觉得处理对象太多也太过于复杂,看懂了之后就还好,对于每个电器我都设计了对应的类,分别是开关(成员对象:编号,状态 成员方法:构造方法,修改器和访问器,调节开关的方法,输出电压的方法,输出设备信息的方法)状态默认是开着的,分档调速器(成员变量:编号,档位 成员方法:构造方法,修改器和访问器,调节档位,输出电压,输出设备信息),连续调速器(成员变量:编号 成员方法:构造方法,修改器和访问器,输出电压,输出设备信息),白炽灯(成员变量:编号 成员方法:构造方法,修改器和访问器,输出设备工作状态,输出设备信息),吊扇(成员变量:编号 成员方法:构造方法,修改器和访问器,输出设备工作状态,输出设备信息),日光灯(成员变量:编号 成员方法:构造方法,修改器和访问器,输出设备工作状态,输出设备信息),以下是大致类图,其中控制设备即为分档调速器和连续调速器,受控设备为日光灯,白炽灯,互斥开关和吊扇,受控窗帘

以下是串联电路的设计
class T{
private Elefather[] elefathers=new Elefather[100];
int num;
int count=0;
int h=1;//判断电路是否有效的标志变量,默认无效,因为默认开关是断开的
int s=0;//这是一个和互斥开关有关的变量
int r=0;

public T(int num){this.num=num;
//    this.r=r;
}
public int getNum(){return num;
}
public void setR(int r){this.r=r;
}
public void setS(int s){this.s=s;
}
public int getS(){return this.s;
}
public int getH(){return this.h;
}
public void addElefather(Elefather elefather){elefathers[count]=elefather;count++;// if(elefather.getBp()==0)// {kk[kp]=(K)elefather;// kp++;}
}
//计算这条电路电阻
public int getR(){// int r=0;for(int i=0;i<count;i++){r=r+elefathers[i].getR();}

// System.out.println(r);
return r;
}
// public int setR(int r){
// return this.getR()+r;
// }
public int getCount(){
return this.count;
}
public Elefather getElefather(int num){
return elefathers[num];
}
//将得到的这条电路总电压分配到具体的电器中去,就可以输出相关的电器信息了,不可以在这里输出
public void fenpei(double d){//0k,1b,2r,3d,4a
double h=0;
for(int i=0;i<count;i++)
{
h=(elefathers[i].getR()/this.getR())*d;
elefathers[i].setD(h);
}
}
//判断该电路是否有效,互斥开关闭合再这条线路上且其他普通开关全部闭合
public void PanduanY(){
if(s-1)
h=-1;
for(int i=0;i<count;i++){
if(elefathers[i].getR()
0)
{
K k=(K)elefathers[i];
if(k.getOn()false)
h=-1;
}
}
}
}
以下是并联电路的设计
class M{
private T[] tt=new T[100];
int count=0
public void addT(T t){//把串联电路添加进去
tt[count]=t;
count++;
}
//计算这条并联电路的总电阻
public double getR(){
double a1=0.0;
double a2=0.0;
double a3=0.0;
for(int i=0;i<count;i++){
if(tt[i].getH()
1)//电路有效才加上它的电阻
{a3=(double)tt[i].getR();a1=a1+1.0/(a3);}
// System.out.println(tt[i].getR());
}

a2=1.0/a1;

// System.out.println(a2);
// int h=(int)a2;

return a2;

}
//收到总电路给这条并联电路返回的电压要分到各串联电路中,无效电路电压为0,这一步也把这条电路上的元件信息全部输出
public void fenPeidianya(double d){
for(int i=0;i<count;i++){
if(tt[i].getH()1)//电路有效才进行分配
{tt[i].fenpei(d);}
else
tt[i].fenpei(0);
}
}
//需要一个判断整个并联电路是否有效的方法,只要其中有一条串联电路有效即可
public int panduanB(){
int h=0;//默认无效
for(int i=0;i<count;i++){
if(tt[i].getH()
1)//只要有一个有效即可
{h=1;break;}
}
return h;//0代表无效,1代表有效
}
简要从几个方面分析一下我的并联电路的设计
1.成员变量
T[] tt:一个数组,用于存储多个串联电路(T对象)。
count:用于追踪已添加到tt数组中的T对象的数量。
num:这个变量的用途在类中没有明确说明,但从构造函数来看,它可能是用来标识或分类这个并联电路的。
2.构造函数:
M(int num):接收一个整数参数num,并将其设置为类的num成员变量。
3.方法:
addT(T t):将一个串联电路(T对象)添加到并联电路中。
getR():计算并联电路的总电阻。它首先检查每个串联电路是否有效(通过getH()方法),然后只将有效的串联电路的电阻用于计算总电阻。这里使用了并联电阻的计算公式:(\frac{1}{R_{total}} = \frac{1}{R_1} + \frac{1}{R_2} + \cdots)。
fenPeidianya(double d):根据并联电路接收到的总电压d,将电压分配给每个有效的串联电路。无效的串联电路接收到的电压为0。
panduanB():判断整个并联电路是否有效。只要有一个串联电路是有效的,那么整个并联电路就被认为是有效的。

设计思路为

读取电路连接信息之后就开始进行线路连接(将元件添加至串并联电路中),再然后是对所有开关进行判断,判断串并联连通性,计算串并联电路总电阻,逐层分压,计算电路元件的工作状态,最后是排序并输出
3.踩坑心得

  • 我的串联电路代码中以下问题需要改进
    Elefather[] elefathers = new Elefather[100]; 使用了一个固定大小的数组来存储Elefather对象,但通常建议使用动态数据结构(如ArrayList)来避免固定大小的限制。
    int num; 这个变量在构造函数中被设置,但不清楚它在类的其他地方的具体用途。
    int count = 0; 用于跟踪已添加到elefathers数组中的Elefather对象数量。
    int h = 1; 用来判断电路是否有效,但更好的方式可能是使用布尔值(boolean)或枚举(enum)。
    int s = 0; 和互斥开关有关,但不清楚其确切作用。
    int r = 0; 被用作一个累加器来计算总电阻,但在类的其他地方有另一个名为getR()的方法,它可能会与这个变量混淆。

因为计算并联电路电阻会要求用多次除法,所以一般都是小数不是整数,我最开始使用的表达式时r=1/a,这样就不对,会出现计算错误,要用r=1.0/a,这样才能得出正确的小数,否则就是计算错误,比如下面这段计算并联电路总电阻的代码

public double getR(){
double a1=0.0;
double a2=0.0;
double a3=0.0;
for(int i=0;i<count;i++){
if(tt[i].getH()==1)//电路有效才加上它的电阻
{a3=(double)tt[i].getR();a1=a1+1.0/(a3);}
// System.out.println(tt[i].getR());
}

a2=1.0/a1;

// System.out.println(a2);
// int h=(int)a2;

return a2;

}

  • 家居强电电路模拟程序中很容易忽略的一个点就是容易没有考虑到总电路上开关和分电路开关上的区别,总电路开关没有闭合整条电路都是无效电压为0,单分电路开关无效可能只是这一条电路无效,不影响其他元件电压输入,所以我设计了一个串联电路方法用来判断开关是不是分电路上的,设计了专门数组来存储分电路上的开关,具体代码实现如下

//判断开启关闭的开关是不是这条电路里的
public int PanduanK(int num)//把开关的编号传入即可
{
int a=0;//不存在则保持值为0
for(int i=0;i<count;i++){
if(elefathers[i].getBp()0&&elefathers[i].getNum()num)
{a=1;//存在则返回1
}
}
return a;
}

4.改进建议
1.类设计的更为清晰简练,像本次作业我很多类设计了方法但又没有使用,这样降低了代码的可读性和美观,很拖沓
2.使用更高效的方法,像本次作业大题目我一开始考虑用动态数组来储存多张试卷答卷,这样不会有错但是并不方便,后来我改用了HashMap来储存,键存的是试卷号等等,这样查找起来更方便快捷高效
3.错误处理和异常管理,合理地处理潜在的错误情况,避免程序崩溃。使用异常来处理异常情况,而不是返回错误代码。(崩溃无数次非零返回无数次了
4.代码需要精进,像家居强电电路模拟程序2中我无效代码太多
5.类的成员变量和方法应该具有清晰的文档注释,解释它们的用途和行为。
6.考虑使用Java的接口和抽象类来定义电路元件的通用行为。
7.使用Java的集合框架(如List, Set等)来简化数据结构的管理。
5.总结
通过本三次作业集我学会了类的基本设计,类之间的关系设计,Java语言中接口的基本概念及使用方法,输入数据分析分割(正则表达式),已封装类的使用,类继承多态,程序设计中常用数据结构的用法等等,仍需学习改进的部分是对HashMap特殊类和类多态的使用,这部分我并不熟练,与此同时在分析数据时经常碰到的空格问题也需要进一步去解决,因为经常导致非零返回。

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

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

相关文章

日志采集/分析

目录EFK1. 日志系统2. 部署ElasticSearch2.1 创建handless服务2.2 创建sts3. 部署kibana4. 部署ilogtail(docker-compose)4.1 编写docker-compose4.2 配置ilogtail采集4.3 查看容器采集的日志4.4 采集容器标准输出日志(可选)4.5 查看采集的容器日志5. 部署kafka5.1 kafka介绍…

AOD始终显示时间和信息(Dream)简析

AOD始终显示时间和信息(Dream)简析DreamManagerService启动在SystemServer的startOtherServices方法中会启动DreamManagerService服务这里是调用SystemServiceManager的startService方法显然,在SystemServiceManager的startService方法中首先将要启动的系统服务添加到其mSer…

操作系统——学习笔记(2)CPU虚拟化

学习黑皮书的一些呆瓜行为hhhhh

免费的攻击面管理平台-森罗

产品简介 森罗是有安科技推出的一款全新综合网络安全攻击面管理平台,集网络空间测绘与漏洞扫描于一体。森罗自带万象漏洞扫描器,与Nessus和Nuclei等许多产品一样,但它更现代,具有免等待的OOB测试策略、高级漏洞PoC IDE和强大的VDSL(漏洞域特定语言)引擎,使您能够轻松快速…

Fake权限验证小例子

前言 关于本地测试如何进行Fake权限验证 正文 在我们使用swagger调试本地接口的时候,我们常常因为每次需要填写token而耽误工作,不可能每次调试的时候都去本地测试环境请求一个token进行验证吧。上图可能是我们本地测试的时候需要填写的一个token位置,本地测试不方便。 那么…

41、linux-yum源管理-阿里云仓库配置

yum的管理1、清理原有的yum配置 把本地或者官方的/etc/yum.repos.d/路径下的所有repo配置文件移走确保/etc/yum.repos.d/这里没有其它文件2、下载配置阿里巴巴开源镜像站官网配置:https://developer.aliyun.com/mirror/在这个位置/etc/yum.repos.d/下载阿里云的yum源文件登陆…

vim基础使用

五、vim编辑器的使用 所有的Linux系统都默认有vi编译器,它就相当于Windows的记事本,当然,你也可以选择更好用的vim编译器,需要下载 yum install vim -y vim 有三种模式 使用vim filename wq!之后 这个命令如果filename不存在则 创建文件 [root@bogon opt]# vim zhanghaow…

【YOLOv8改进 - 注意力机制】NAM:基于归一化的注意力模块,将权重稀疏惩罚应用于注意力机制中,提高效率性能

**NAM: 提升模型效率的新颖归一化注意力模块,抑制非显著权重,结合通道和空间注意力,通过批量归一化衡量重要性。在Resnet和Mobilenet上的实验显示优于其他三种机制。源码见[GitHub](https://github.com/Christian-lyc/NAM)。**介绍摘要 识别较不显著的特征是模型压缩的关键。…

VP记录

我是真的红温了受打击了,他妈难受死了,遂记录这玩意儿,就算他妈没几个月就要退役。 ABC360 就是这场把我打击到了。之前15min切完ABCD,这回25min切B题,幽默🤡頑張って

视野修炼-技术周刊第90期 | 豆包AI IDE

① 豆包 MarsCode 正式发布 ② ECMAScript 2024 正式发布 ③ Mako 开源 - 蚂蚁的 Rust 力作 ④ CSDN批量搬运Github项目伪造开发者主页 ⑤ HTML 旋转图像实现示例 ⑥ 一组看着糙的组件库 ⑦ Chrome 126 中 DevTools 的新增功能 ⑧ 纯 CSS 实现环形文本欢迎来到第 90 期的【视野…

3.2

3.2 一键部署多台linux 1. 背景: 一般的机房的几十台甚至上百台电脑都需要统一部署操作系统。人工一个一个太费力,所以需要用到批量部署技术。 2. 实现原理:安装一台服务器后,通过交换机连接同一个网络方式还有结合自动应答文件的方式来实现。 ​ 网络拓扑图如下:这需要先…

ASRPRO语音控制开发板

近来想做语音控制,于是拼多多上淘了块语音控制开发板,记录下开发板相关的信息。 1.开发板信息 模块概述 开发板板载CH340K芯片,一根Type-C线就可以下载程序,并且开发板上有自动断电电路可以实现一键下载。 开发板需要外接喇叭,喇叭为PH2.0接口。 下图为开发板实物图开发板…

Prompt-Tuning、P-Tuning和Prefix-Tuning区别和代码实现【转】

原文:https://blog.csdn.net/weixin_43863869/article/details/134760405

OPP第三次博客作业

1.前言 这次博客不出意外是我们Java课程的最后一次博客了,不过这次博客pta只有两题,但真的挺难的,尤其是最后一个,我自己的设计也有很大的问题,第七次pta遗留下了一点点问题,导致第八次出现了很多问题,导致在后面要大篇幅的改,之后改完以后又不明白之前的写的代码有啥用…

Vue - 入门

零:前端目前形势 前端的发展史HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 -> 在浏览器中查看Ajax的出现 -> 后台发送异步请求,Render+Ajax混合…

(线段树,最小值不能低于0的)北京建筑大学2024年程序设计竞赛 A 寿命修改

题意:code: #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; using i64 = long long; using u64 = unsigned long long; using PII = …