Blog-3 题目集7~8的总结

22207203-陈思思
一、前言
(一)第7次题目集(家居强电电路模拟程序-3)

  1. 知识点:
    串联电路:电流相同,电压分配。
    并联电路:电压相同,电流分配。
    类的设计:电路设备类、受控设备类、控制设备类、串联电路类、并联电路类。
    数据结构:使用列表或字典存储电路信息、设备状态。
    算法:递归或迭代计算电压、电流和设备状态。
    输入输出:读取并解析输入信息,按指定格式输出设备状态。
  2. 题量:
    输入信息涉及多个串联和并联电路,每条信息可能包含多个设备。
    设备种类较多,包括开关、调速器、灯、风扇、窗帘等。
    每种设备都有不同的工作原理和状态展示方式。
  3. 难度中等:
    需要理解电路基本原理,并正确模拟不同设备的行为。
    需要设计合理的类结构和算法,以处理复杂的电路连接关系。
    根据输入信息动态调整设备状态,并输出结果,要求有一定的逻辑处理能力。
  4. 挑战点:
    互斥开关的状态管理和电流分配。
    调速器的档位控制和计算其输出电压。
    窗帘的开启比例计算依赖于电路中所有灯的亮度总和。
    多条串联电路的并联关系处理,确保电压和电流分配正确。
    输入信息的解析和电路结构的构建,需要细致的编码和调试。

(二) 第8次题目集(家居强电电路模拟程序-4)

  1. 知识点:
    面向对象编程:需要设计多个类来表示不同的设备(如开关、调速器、灯、风扇、窗帘和二极管)及其公共特征。
    电路模拟:理解基本电路原理,如串联和并联电路的工作方式、电压分配和电流计算。
    状态管理:每个设备有不同的状态和参数,需要管理这些状态的变化。
    输入解析:从输入文本中解析出设备信息、连接信息以及控制命令。
    异常处理:包括电流限制和短路检测。
    电压计算:根据输入电压和各设备的特性计算各引脚的电压。
    数据结构:使用合适的数据结构(如字典、列表)来存储设备信息和电路连接关系。
  2. 题量:
    输入信息中包括设备信息、连接信息、控制信息等多个方面,需要解析和处理这些信息。
    输出信息要求详细记录各个设备的状态和参数,以及每个引脚的电压。
    示例提供了不同类型的电路配置,从简单的到复杂的,可以用于测试程序的鲁棒性。
  3. 难度高:
    难度高:题目虽然涉及电路模拟,但没有涉及复杂的物理模型或电路特性,非常适合用于学习和练习面向对象设计。
    逻辑复杂度:需要设计复杂的逻辑来处理电路中的串联和并联关系,以及设备之间的相互影响。
    异常检测:需要实现电流限制和短路检测,增加了程序的复杂性。
    细节处理:题目对输出格式要求很详细,需要仔细处理每个设备的状态和参数的输出。

二、 设计与分析

(一) 第7次题目集

  1. 类图
    家居强电电路模拟程序-2的基础上增加了受控类和控制类,分担基类的功能,增添了控制设备互斥开关类和受控设备窗帘类。

    Electric类:作为所有设备的基类,定义了设备的基本属性和方法。
    Switch、ME_Switch、FenDangSwitch、LianXuSwitch、Lump、Riguang、Diaoshan、LuodiFan、DayLight类:继承自Electric类,实现了具体设备的功能。
    Bi和Chuan类:用于实现串联电路与并联电路。
    Complain类:负责根据输入信息创建相应的电路设备。
    Main类:程序的入口,负责整个流程的控制,包括读取输入、解析输入、计算电压、更新电压和输出结果。

  2. SourceMonitor报表分析

    复杂度:AnswerSheet.gradeAnswers() 方法的复杂度最高,为19,这表明该方法可能需要进一步优化以提高可维护性。
    注释:只有7.7%的代码行包含注释,建议增加注释以提高代码的可读性和可维护性。
    分支语句:13.2%的语句是分支语句,这表明代码中存在一定的逻辑分支,但整体上处于合理范围内。
    方法调用:共有255个方法调用语句,表明代码具有较好的模块化和重用性。

(二) 第8次题目集

  1. 类图
    在家居强电电路模拟程序-3的基础上增加了电子设备二极管

  2. SourceMonitor报表分析

    基瓦特图 (Kiviat Graph):显示了不同指标的分布情况,包括平均复杂度、平均深度、最大深度等。
    块直方图 (Block Histogram):显示了代码块的分布情况,有助于理解代码结构。
    复杂度:Calculate_shuV.calculate_shuV() 方法的复杂度最高,为28,这表明该方法可能需要进一步优化以提高可维护性。
    注释:只有5.6%的代码行包含注释,建议增加注释以提高代码的可读性和可维护性。
    分支语句:27.8%的语句是分支语句,这表明代码中存在较多的逻辑分支,但整体上处于合理范围内。
    方法调用:共有340个方法调用语句,表明代码具有较好的模块化和重用性。

三、 踩坑心得
(一) 第7次题目集

  1. 受控开关的实现
    题目要求互斥开关有3个引脚,并且只有两种状态:接通2号引脚或接通3号引脚。初始状态为接通2号引脚。
    解决方法:需要为互斥开关创建一个新的类ME_Switch,并实现其状态切换和电压计算逻辑。
    定义3个属性及状态的切换:
public int state = 0; // 0: 接通2号引脚, 1: 接通3号引脚
public int resistance12 = 5; // 1、2引脚之间的电阻
public int resistance13 = 10; // 1、3引脚之间的电阻
public void regulate(String vs) {
        if (vs.equals("+")) {
            state = 1 - state; // 切换状态
        }
    }
//计算电压
public void reshuV(double shuop) {
        if (state == 0) {
            shuV = shuop * resistance12 / (resistance12 + resistance13); // 计算电压
        } else {
            shuV = shuop * resistance13 / (resistance12 + resistance13);
        }
    }
  1. 窗帘的实现
    (二) 第8次题目集
  2. 题目要求二极管有正向导通和反向截止两种状态。
    解决方法:需要为二极管创建一个新的类Diode,并实现其导通和截止逻辑。
    定义一个属性来判断二极管的导通还是截止:
public boolean conduction = true; // true: 导通, false: 截止
//计算二极管的电压并判断
public void reshuV(double shuop, double shuop2) {
        if (shuop == shuop2) {
            conduction = (shuop != 0); // 两端电压相等时,如果电压不为0,则导通
        } else {
            conduction = true; // 两端电压不相等时,导通
        }
        if (conduction) {
            shuV = shuop;
        } else {
            shuV = 0;
        }
    }
  1. 短路检测
    短路检测
    总电阻计算:遍历电路中的所有设备,累加每个设备的电阻值。
    短路判断:如果总电阻为0,则电路发生短路,返回true;否则返回false。
    应用场景:在计算电压之前调用此方法,如果检测到短路,则输出错误信息并终止程序。
    public static boolean isShortCircuit(Map<String, Electric> circuit) {
        double totalResistance = 0;
        for (Electric dev : circuit.values()) {
            totalResistance += dev.resistance;
        }
        return totalResistance == 0;
    }

四、 改进建议
在题目集7中,有很多异常处理,我是用的是在相应的类中自行处理,之后可以引入自定义异常类来处理不同类型的错误。例如:InputFormatException:处理输入格式错误的情况。QuestionNotFoundException:处理试卷中引用了不存在题号的情况。StudentNotFoundException:处理学生信息中不存在的学号。在处理题型的整理时,有些逻辑是重复的。之后改进可以将重复的逻辑提取成辅助方法或函数。例如,处理输入的逻辑可以整合到一个方法中,通过参数区分不同的处理方式,减少代码的冗余。当前支持的题型是选择题、填空题、多选题,可以考虑实现其他题型,如:简答题、排序题等。
题目集7和8中,一些类(如 Electric 类)包含多个职能,可能会造成类的职责不明确,之后会考虑改进将设备的每个功能(如状态管理、电压调整)进一步抽象为小的类。可以创建接口或抽象类,以提供设备状态和行为的一致框架。当前题目只支持开关、调速器、灯具和风扇。如果需要增加新设备,需大幅修改现有代码。之后会使用工厂模式来创建电器对象,以便能够轻松添加新的电器类型而不需更改现有代码结构。
五、总结
在本次实验中,我们完成了两个题目集的任务,分别是家居强电电路模拟程序-3和家居强电电路模拟程序-4。这些任务涵盖了类与对象、继承与多态、集合、正则表达式、业务逻辑处理和设计模式的应用。
首先,在答题判题程序中,我们定义了多个类来封装不同类型的题目,如单选题、多选题和填空题。通过使用Map、Set和List等集合类,实现了对题目、考试卷和学生信息的高效管理。策略模式和命令模式的应用使评分逻辑和输入处理更加灵活。不过,代码中存在一些复杂方法和较低的注释覆盖率,需要增加注释并优化这些方法。
其次,在家居强电电路模拟程序7中,我们在原有基础上增加了混合电路,使系统的逻辑更加复杂。我们设计了一个基类Electric和多个子类,如开关、分档、连续、白炽灯、日光灯和吊扇。通过继承关系,复用了基类的代码,避免了重复。输入处理方面,通过正则表达式和字符串解析技术,成功处理了多种格式的输入,并实现了设备的连接和状态管理。尽管如此,主函数的复杂度较高,需要进行功能拆分,降低复杂度。
最后,在家居强电电路模拟程序8中,通过引入不同的前缀字符和标签化的方式,区分了串联和并联电路,简化了电路管理。尽管如此,代码中仍存在重复的逻辑和复杂的控制结构,计划引入工厂模式来创建电器对象,并进一步抽象设备功能。
在整个实验过程中,我深刻体会到设计模式的重要性。合理运用设计模式可以提高代码的灵活性和可扩展性,降低系统复杂度。此外,异常处理也不可忽视。在答题判题程序中,通过自定义异常类处理各种错误情况,提高了系统的健壮性和错误处理的清晰度。
总之,通过这次实验,我在面向对象编程和设计模式方面有了更深的理解和实践。未来,我将继续优化代码结构,提高代码的可读性和可维护性,争取在实际项目中应用所学知识,解决更复杂的问题。
六、 学期总结
本学期最大的收获是学会了java的编程,可能水平不是很够看,但简单的编程还是能够实现的。就java这一门课而言,与我大一所学的C语言和C++都有所不同,看待问题的角度从这个问题怎么解决用什么方法解决变成了,想完成这件事情需要有几个角色,每一个角色承担什么功能,而具体的功能是怎么实现的是封装好的,对用户不可见的,使得使用变得简单方便理解。因此,java的学习与使用更重要的是从一个设计者统筹者的角度去看待问题,去思考问题的解决方案,通过创建类,实例化类来充当角色去使用某一单一功能。老师在上课时也注重于培养我们这一方面的能力,通过写代码前,仔细阅读题目,分析问题,抽象出几个具体的角色,然后绘制类图与顺序图使得脑海中的设计思路更加明晰,有了思路就可以像涂色一样,一块一块的去实现具体的功能,而整过过程最重要的就是设计和掌握类与类与类之间的关系,如此,才能适应之后的问题升级复杂化,实现一次次的迭代与优化。
以上是我对于java学习的感悟,但是对于java课程的安排我还是会感到疑惑。一门重要的编程语言课,竟然与C语言的安排时间差了这么久,C语言被安排在大一进行学习,java却在大三,尤其是大三的课程安排实在太紧凑,都是难度很大专业课,而且每一门专业课都配备有相应的实验课。而代码编程我个人认为需要非常多的时间,解决一道题需要耗费短则两三天长则四五天的时间,而且是每天都在思考和解决问题的情况下(有时候思考很久改了很久却没有任何进展,放上去还是错的,真的会难过),作业确实宽裕了很多时间,但因为每一节课都很重要每一节课都需要时间,不够分也没有那么多的精力。(假如是放在大一大二选修课较多的时候进行学习,会是很好的选择,可以有大把的时间耗在上面,因为其他课程不会太费心神,当然,好像听说下一届的进行了课程安排的改进,他们挺好的,我们不太好。)

posted @   blog666  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示