最后两次oop作业总结

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特殊类和类多态的使用,这部分我并不熟练,与此同时在分析数据时经常碰到的空格问题也需要进一步去解决,因为经常导致非零返回。

posted @   刘玲2  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示