面向对象程序设计期中与中三次作业的总结

news/2025/2/25 19:01:10/文章来源:https://www.cnblogs.com/22207205-dkj/p/18565273

前言

这篇博客是完成《面向对象程序设计》(java)课程的中三次PTA作业后的总结。主要内容有:

  1. 最后一次的答题判题程序和前两次家庭电路模拟程序的分析。
  2. 面向对象程序设计思想的一些学习总结
  3. 学习到的一些调试方法

题目分析

最后一次答题判题程序的分析

说实话已经过去三周了,有点忘了,现在看一下之前的作答其实并不是很好。这道题的题目要求是按照五种可能会打乱的,不同的输入去创建或所有类的对象。这个题目需要正确地解析和处理不规则的输入数据,并且结合类之间的关系(Exam, Question, Student, AnswerSheet)完成答题判分的过程。我是采用了AnswerSheet类、Question类和Student类三个使用的类和一个Main类(用于程序逻辑)。类的依赖如下图

数据结构上我设计了四个类,并且用集合类来存储信息。题目信息 (Question) 存储在 Map<Integer, Question> 中,其中题目的编号为键,题目对象为值。试卷信息 (Exam) 存储在 Map<Integer, Exam> 中,试卷编号为键,试卷对象为值。学生信息 (Student) 存储在 Map<String, Student> 中,学生的学号为键,学生对象为值。答卷信息 (AnswerSheet) 存储在 List 中,每个答卷对象包含了学生的答题信息。
对于输入的解析,我根据每一行的内容判断输入类型(题目信息、试卷信息、学生信息、答卷信息、删除题目信息),添加到后续的数据结构里。
运行时,每个题目都会被装成一个Question对象,然后存入questions表。试卷的内容用Exam类来表示,试卷中包含了多个题目及其分值。这些试卷信息存储在exams表。学生的基本信息输入后存储到 students 映射表中。每个学生的答题情况解析后存储在 AnswerSheet 中,最终进行判断与评分,有问题的可以后续处理。在解析过程中,如果某一输入无法匹配预定格式,记录格式错误信息。
最后一次的答题判题程序还需需要使用继承,这样可以提升类的多样性(但是我其实不太懂怎么用在这里?)

家庭电路模拟程序分析

家庭电路模拟程序需要完成模拟家庭电路中的各种设备的连接和调节。
设备包括:控制设备(开关、调速器)和受控设备(如灯具、风扇)。模拟电路的连接关系及电压、电位差对设备状态的影响。电路中包含多个控制设备、受控设备以及它们之间的连接。控制设备调整受控设备的状态(如灯的亮度、风扇的转速)。电路连接信息提供了设备之间的电气连接关系。电源(VCC)提供220V电压,接地(GND)为0V电压。
那对于这种设备的模拟,比较合适的面向对象的设计的方法是继承。继承关系体现了面向对象的多态性,不同的设备可以有不同的行为和属性。最基本的类有两个:

  1. 设备类包含设备的基本属性,如设备名、输入引脚、输出引脚、状态等。
  2. 引脚类包含连接信息。
    设备类和引脚类采用组合模式,设备类内含有输入和输出引脚的变量(应该没有三个脚的)。设备的行为(如开关、调速器等)是由这些引脚的电位差来决定的。

第一次家庭电路模拟程序

第一次家庭电路模拟程序不含有并联电路,只有一条线路,所有元件串联。我的类图如下(带有方法的话太复杂了,先放个不带方法的)

所有器件的基类都是electricDevice。继承出三个:控制器Controller、风扇Fan、灯light的类。electricDevice会有inJunction和outJunction两个变量,用于存储junction类的对象。junction类就是一个公共的交点,可以多个设备连接。设备引脚电压就是junction类中的voltage属性。使用继承来定义不同类型的设备(如控制器、风扇和灯具),并在基类electricDevice中处理设备的基础功能。设备的输入和输出通过Junction类来管理,Junction类存储了电压信息。
对于整个程序的逻辑,创建了一个circuitManagement类。它的运行逻辑为:输入字符串->分解为创建和调节命令->分别执行创建和调节命令->计算电压输出。存储方面,为了把“首字母”+“数字”转换为对象,采用了一个Map<String, electricDevice>进行映射。
控制器类上,其实核心是档位的概念:0就是关,>0就是开。分档调速器就是根据档位调整输出电压;连续调速器就是连续的分档调速器。
风扇类和灯类都是可使用的器件,具有输出值。风扇类就是速度,灯类就是亮度。灯类下还有不同的细分灯类,继承灯类并且重写了亮度计算。

运行流程:

  1. 程序将输入存储。
  2. 从存储的输入里面解析数据,根据输入的连接信息创建设备electricDevice对象并连接它们,并连接和创建junction 类用于存储和设备间的电压。
  3. 通过 processCommands() 方法解析并执行控制命令(例如开关设备、调节档位等)
  4. 通过 propagateVoltage() 方法,程序将初始电压通过电路传递到各个设备,并根据设备类型计算输出结果(如亮度、转速等)。
  5. 最后,outputStatus() 方法输出所有设备的当前状态。

当然,这个设计肯定有很多问题,比如他不能处理并联电路;并且在开关上没有做到统一(开关和调档是不同的计算方式)。

第二次家庭电路模拟程序

第二次家庭电路模拟程序中,需要继续构建并改进上一个程序的设计,重点是需要并联电路的支持。这次迭代我们将支持并联电路的输入。在并联电路中,多个串联电路将一起工作,电压会分布到并联电路的每个子串联电路上。所以在计算方法上需要修改很多地方。
在设计上,我们需要对现有类图进行一些调整,主要是增加对并联电路的支持。electricDevice类将继续为基类,但是要增加电路子类(因为电路Circuit类也具有输入和输出节点)。junction类用于管理电压信息,支持多个引脚的电压信息共享。在并联电路中,不同的串联电路会共享同一电压,junction类需要能处理这一点。计算方法上,舍弃原有的一路计算过去的方案,需要进行子电路的迭代。这种就是组合模式设计的思想体现作用的时候。因为整个电路可以看做一个串联电路,而内部的并联电路可以看做是串联电路的并联,因此我们可以抽象出串联电路类(维护一个存储着电路上的设备的表)和并联电路类(维护一个存储并联的串联电路的表)。
这次我的程序改进点主要是:

  1. 增加电路类,具有并联电路和串联电路子类。并联电路中,每个支路上的电压相同,而电流则根据支路电阻进行分配。因此需要处理并联电路的电压分配和等效电阻计算。
  2. 为了支持并联电路,我们采用了组合模式,将串联电路(serialCircuit)作为并联电路的子组件。串联电路维护一个存储电路对象的表。因为电路类也是继承electricDevice的,因此串联电路的存储电路对象的表也可以存储串联电路或并联电路对象,实现方便的递归式调用处理。这种层级结构使得电路模型更加灵活,可以模拟更复杂的电路拓扑结构。circuit类作为serialCircuit和parallelCircuit的父类,抽象了电路的共同特性,例如输入输出节点(junction)。并联电路类维护一个List,存储串联电路serialCircuit对象。
  3. 由于引入了并联电路,原有的电压计算方法需要进行修改。现在采用了一种递归的电压计算方法(VoltageCalculation),能够处理包含并联结构的复杂电路。首先计算等效电阻,然后根据电路结构和元件参数,逐级计算各节点的电压。
  4. 对于并联电路中的开关,switch_class类模拟了开关的断开和闭合状态,serialCircuit类在计算等效电阻时会检查电路中是否存在断开的开关,如果存在则将电路标记为断路状态,并停止后续计算。
  5. 连接点junction类来表示电路中的连接点,并通过connectDevices和mergeParallelJunction方法来连接不同的设备和电路。添加设备时,运行这两个方法可以合并连接点。同时因为Java的方便的内存管理,我们不太需要手动对junction对象进行释放。

electricDevice类和Junction类的关系如下:

electricDevice类通过injunction和outjunction两个属性与junction类关联,表示设备的输入和输出连接点。一个junction对象可以连接多个electricDevice对象,实现了多个设备的连接和电压共享。
electricDevice类与它的子类关系如下:

类的依赖关系:

一些学到的调试方法分享

多存信息,方便打印

面向对象程序设计中,类很方便的可以帮我们进行资源管理。因此,我们可以把很多东西放心的存在里面。比如:我们可以给很多东西命个名。
在这次的家庭电路模拟程序第二次中,非常复杂的电路计算往往需要打印(System.out.print...)。这时候如果我们把创建对象的名字存起来,就很方便打印了。
例如:调试递归调用calVoltage()时,我需要知道计算顺序、电阻和电压,这时候对象名字就很有用。

使用IF条件控制调试信息打印

用IF语句,在某个参数为True时才打印调试信息,这样在提交时只需要修改那一个变量就可以关闭所有的调试信息打印了,剩下的就是题目信息。

后记

最近还在学习面向对象设计模式,我个人应用比较多的还是组合模式。对于其他设计模式也不熟悉,需要再涉猎多一点,多写一些程序来训练训练。

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

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

相关文章

高级语言程序第8次作业

高级语言程序设计课程第八次个人作业 这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/2024C/homework/13303 学号:102300303 姓名:梁佳 第11章第1题第2题第3题第6题第7题第12章第1题

Logisim-CRC简单介绍

简介 CRC(Cyclic Redundancy Check)即循环冗余校验是一种既能检错也能纠错的校验码,校验的原理是基于模2运算; 编码/解码过程 这里以一个示例来进行说明编码过程,假设原始数据为:1101、计算校验位的位数 根据公式 k + r ≤ 2r - 1 计算,其中【r】为校验位位数,【k】为…

第四-六次作业总结

一、前言 该系列题目均为设计与实现一个小型的答题判题程序,题目难度从简单到复杂逐步提升,题目数量和输入信息也逐步增加。以下是对这三道题的总结: 1. 知识点第4次题目集在第3次题目集的基础上又增加了难度,该题目集主要考察编程技巧和算法设计,特别是在答题系统中如何通…

2024/11/22日工作总结

完成java请假条管理系统: 实现web页面的增删改查操作; 项目结构如图:mapper:点击查看代码 package com.vivy.mapper;import com.vivy.pojo.Application;import java.util.List;public interface ApplicationMapper {void add(Application application);Application selectB…

若依Ruoyi分离版替换 MyBatis-Plus

若依项目:Ruoyi-vue 3.8.8 MyBatis-Plus:3.5.9 目标:用 MyBatis-Plus 替换项目中 MyBatis 建立分支 新建分支switch-mybatisplus以防万一 改造依赖 在项目的根pom.xml中引入依赖 <properties> ... <mybatis-plus.version>3.5.9</mybatis-plus.version> &l…

ABP aspnetzero power toole 最新 4.4.0 和谐记录

参照之前的记录 .net zero power toole 破解日志在用工具创建模型后,点击生成的过程.会在代码目录生成 AspNetZeroRadTool 的文件夹.总是会覆盖. AspNetZeroRadTool 的文件夹 中 生成当前模型的json文件 执行 dotnet AspNetZeroRadTool 模型.json 生成文件所以 要处理的文件只…

Docker:Docker部署Jenkins并共用宿主机Docker部署微服务多模块(一)Jenkins部署及插件环境搭建

前言 公司项目多忙着开发,所有项目服务都是博主一个个部署的,时间久了也是心累,所以抽时间把Jenkins部署上,之后让其他开发人员自己部署(让我解脱吧!!)。 部署Jenkins容器 Docker安装就不在赘述了,可以看我之前的文章(懒了);直接开始拉取jenkins镜像。 拉取镜像 docker…

题目集4~6总结

前言 经过三周的Java开发课程,我们逐渐从基础的逻辑实现过渡到更复杂的系统设计,这不仅强化了我们对Java语言基础的理解,还深入实践了面向对象设计、异常处理、多线程和复杂数据结构等核心知识点。以下是对这三次作业的总结和反思。 第一次作业 题目开始引入复杂逻辑,包括试…

22207320-王攀-Blog2

题目集4~6的总结性Blog 一、前言 经过题目集4至6的练习,我对Java编程的理解和实践能力都有了显著的提升。题目集4主要考察了继承与正则表达式的知识点,题目集5引入了家庭电路的模拟,题目集6则在前者的基础上增加了并联电路的处理。三次题目集的题量逐步增加,难度也有所提升…

博客园管理记录

2024年11月11.20入园时间~ 【这个时间我在上大三欸~ 】大道至简,知易行难。从今天开始改变,这是对平庸生活最好的回击。 点击右上角即可分享@media (max-width: 767px) { #set_btn_box { width: 100vw; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255,…

高级语言程序设计课程第八次作业

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第八次作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13307 学号:072303426 姓名:王子博 按照老师要求展示截图 11-1到11-311-6与11-712-1到12-312-8与12-9