Blog2-题目集4~6

news/2024/11/20 22:41:32/文章来源:https://www.cnblogs.com/Ansel09/p/18559511

一、前言:

本次的大作业,包含了两个部分,一个是之前的1-3大作业(答题程序)还剩余的一次迭代,另外两个是最近做的电路设计的迭代,总而来说,这些大作业都是对于自己能力的考验,也是对自己的提升。


二、设计与分析:

大作业4最后一题:

1.源码分析:

这次的迭代相比于上次的内容,主要是增加了如下

  • 题目:增加了题目类型,包括多选题,填空题了
  • 对于类的设计,主要是需要使用继承的思想,这些多选题,填空题都是可以继承于题目类,然后重写其中的方法。
  • 对于判分,就需要增加多选题的判分逻辑,填空题的判分逻辑。因为会有半对的情况产生,所以需要考虑。

其实我这里也是使用小巧思

class MCQuestion extends Question { // 定义选择题类,继承题目类public MCQuestion(int number, String content, String standardAnswer) {super(number, content, standardAnswer);}
}class FQuestion extends Question { // 定义填空题类,继承题目类public FQuestion(int number, String content, String standardAnswer) {super(number, content, standardAnswer);}
}

其实不难发现,我这个完全就是一个虚假的继承,因为我其实还是把他当那种单选题做了,不过能出一个半对的情况。只是我分开存储了答案,然后就会有我如下的判定:


boolean isAllCorrect = standardAns.equals(providedAns); // 对于一模一样的答案直接通过,针对填空题
boolean isCorrect = containsAllCharacters(MstandardAns, MproviedAns); // 对于错序的选择题,如标准答案是:ABD,给出答案是:DBA
boolean ishalfCorrect = containspartCharacters(MstandardAns, MproviedAns); // 判断是否有包含,针对半对的情况,不能有多余字符

可以看见我的是有三种情况的,然后分开判定,这样就能处理多选题和半对的情况。也算是一个投机取巧的办法?

2.SourceMontor分析结果:

3.UML图:

4.时序图


大作业5最后一题:

1.源码分析

这是第一次新的题,就是对于电路电器的模拟
我做出了如下设计:

  1. 电气设备类(Electrical_equipment)
  • 属性:
    • identifier: 设备的唯一标识符(例如,VCC、GND等)。
    • inputVoltage: 输入电压(默认值为0V)。
    • outputVoltage: 输出电压(默认值为0V)。
    • number: 设备编号。
      input 和 output: 分别表示设备的输入和输出端口。
  • 方法:
    • getOutputVoltage(): 返回输出电压,调用 computeOutput() 进行计算。
    • setInputVoltage(double inputVoltage): 设置输入电压。
    • computeOutput(): 抽象方法,用于每个设备根据输入电压计算输出电压,具体实现由子类提供。
  1. 具体设备类
  • 电压源(Voltage_source): 输出固定电压220V,表示电源设备。
  • 接地(Ground): 输出固定电压0V,表示接地设备。
  • 控制设备(如 Switch, Binning_governor, Continuous_governor): 用于调节电路的开关状态、调速或调节电压输出。
  1. 受控设备(如 Light, Fan): 由电压控制,执行具体的控制操作,如灯的亮度或风扇的转速。
    每个设备类继承自 Electrical_equipment 并实现了 computeOutput() 方法,计算设备的输出电压或亮度等。
  • 控制设备类
    Switch: 用于控制电路开关状态。电路的状态(开或关)会影响设备的电压输出。toggle() 方法改变开关状态。
    Binning_governor: 分档调速器,通过切换档位控制电压输出的比例。共有4档,档位0至3。
    Continuous_governor: 连续调速器,输出电压比例在0至1之间,可以细粒度调整输出电压。
    这些设备通过输入调节命令(例如 #K1, #F2+ 等)来控制设备的状态。

  • 电路连接和设备控制
    ProcessSystem 类负责解析输入命令并管理设备。输入包括设备连接(例如 [VCC 1])和设备控制命令(如 #K2, #F3+ 等)。
    解析设备连接:parseConnection() 方法通过正则表达式解析输入的设备连接命令。根据设备连接,更新设备列表 deviceList。
    设备控制:parseControlEquipment() 方法解析并执行控制命令,比如切换开关状态或调整调速器档位。

串联电路(SeriesCircuit): 设备通过 SeriesCircuit 类连接,模拟串联电路的行为。电压从 VCC(电压源)流向其他设备,并根据设备的状态计算每个设备的输出电压。

在串联电路中,电流流过每个设备时,可能会遇到开关(Switch),若开关关闭,则电路中断,电压为0V。

输出计算:computeSystemOutput() 方法会计算整个系统的输出,并将结果按设备编号排序输出。

其实是以巨大的继承关系,
如图:

可以见到总的父类是Electrical_equipment,然后是Voltage_source、Ground、Switch、Binning_governor、Continuous_governor、Light、Fan等具体设备类,最后是ProcessSystem类负责管理设备。

2.SourceMontor分析结果:

3.UML图

4.时序图

大作业6最后一题:

1.源码分析

此次迭代基于上次的基础上添加了并联电路,以及新的受控设备,对于新的受控设备来说,改的不多,只是增加了一个新的类来继承Fan,然后重写了computeOutput()方法,计算风扇的转速。并且在处理设备的时候增加对于落地扇的操作即可。
最主要的是新增的并联,思路也比较简单,我是计算电阻分压来做的,在并联的类里,有
private List< SeriesCircuit > seriesCircuits; 来存放串联电路,通过computeOutput()计算分压,然后再计算总电压。
另外,我把之前的设备里的comouteOutput()方法改成了compute(),因为现在同一以compute()来计算设备的各种参数值。comouteOutput()就主要用于处理电压,以及电阻等了。

2.SourceMontor分析结果:

3.UML图

4.时序图


三、踩坑心得

  • 在大作业4的实现中,尝试通过继承关系来简化多种题型的设计(如选择题、填空题等)。虽然这种设计看起来符合面向对象的设计原则,但实际上并没有充分利用继承的优势,而是出现了“虚假的继承”——多选题和填空题本质上和单选题差别不大,继承只是为了区分不同的题型。然而,这种设计使得代码的可扩展性变差,因为后续若需要对新类型的题目进行扩展(如判断对错规则),则不得不修改现有类。但是那一次我也只会这样考虑了
  • 在大作业5和大作业6的电路模拟中,涉及到了设备之间的数据流和控制逻辑。尤其是在串联和并联电路的实现过程中,需要仔细设计每个设备的输入输出接口以及控制命令的解析。最初在设计控制命令的解析时,难以保证命令的顺序和格式的一致性,导致程序出错或行为不符合预期。
  • 电路模拟中的每个设备都有不同的计算逻辑,如电压源、电压控制器、负载设备等,而每个设备的输出都可能受到其他设备的影响。调试时发现电路在某些情况下输出不正常,往往是因为某个设备的状态或参数没有正确传递。比如在串联电路中,若一个开关状态未被正确更新,可能导致电路中断,输出为零。在并联电路中,之前没有分开compute()和computeOutput(),导致在计算分压的时候,没有考虑到电阻的值,导致计算错误。
  • 大作业6中,我实现了并联电路的模拟。并联电路的输出电压需要通过电阻分压来计算,虽然思路清晰,但实际编码时,如何准确模拟电流分流和电压分配,尤其是在不同设备和电路组合时,给我带来了一些困惑。起初,我没能很好地处理串联电路和并联电路之间的相互影响,导致某些情况下计算结果不准确。

四、改进建议

  • 尽量避免为了继承而继承,特别是在子类和父类之间差异不大的情况下。可以考虑通过接口或者策略模式来提高代码的灵活性和可维护性。
  • 对于大作业4的答题程序来说,应该是进一步优化进程的,可以增加属性:答案的集合等信息,以便于判分。这样相对于我的程序更加优良
  • 对于大作业6来说,我的成绩是94分的样子,在今天走的时候想到,似乎有个地方没有改掉,就是在sort中,没有把A(落地扇)加上去,导致其实落地扇是没有加入排序的。

总结

通过这次的大作业,我不仅巩固了面向对象的设计思维,也深入理解了如何将抽象的电路模型转化为具体的代码实现。从设计继承关系到电路的模拟,每一部分都考验了我的编程能力和解决问题的思路。通过这次迭代,我收获了很多实践经验,也发现了自己的不足之处,特别是在如何设计灵活、可扩展的系统方面。

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

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

相关文章

面试题精选04-使用Linq怎么将数据分组之后按时间排序取最新1条数据

实体类 public class Movie {public string Name { get; set; }public string Area { get; set; }public DateTime ProductTime { get; set; } }初始化数据 public static List<Movie> InitData() {List<Movie> data = new List<Movie>(){new Movie(){ Name=…

WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

什么是文件包含 1、原理 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时, 直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。 在包含文件的过程中,如果文件能进行控制(如进行替换和修改),则存储文件包含漏洞白盒发现: 在php…

局部变量和成员变量的区别

1,区别2.内存位置不同如图,主方法里的变量stu1和stu2在栈内存,new开辟空间后,name变量在堆内存 . 3.生命周期不同 1.随着对象的消失而消失 https://kdocs.cn/l/cuQvFYJirzaR?linkname=150996495 主方法进栈,遇到method,method进栈,有new进堆,name成员变量进入空间 随着…

53.8 MB/s,新晋开源神器榨干你的网速:Gopeed!

软件介绍 今天给大家推荐一款全平台多线程高速下载器(支持磁力BT):Gopeed !Gopeed(全称 Go Speed),中文名叫做够快下载器,是一款由 Golang + Flutter 开发的现代化高速下载器,它是一款全平台多线程高速下载器,支持Windows、Macos、Linux、Android、iOS、Web、Docker、…

几个实用渲染技术原理和实现

一、快速高斯模糊 1.1 背景 ​ ​​  高斯模糊在wiki上定义为一种图像模糊滤波器,使用正态分布计算每个像素输出颜色。正态分布函数和图像如下所示: \[G(u,v)=\frac{1}{2\pi\delta^2}e^{(-u^2+v^2)/(2\delta^2)} \] ​ ​​  由图可以发现,当x在\(-3\delta\)到\(3\del…

STM32F103嵌套向量中断控制器

一、STM32F103中断介绍 1.1 什么是中断 中断:打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行;举例:当你正在写作业时,做到一半又去吃饭,吃完饭后又回来接着原来的作业继续完成。 对于单片机来说,中断是指CPU正在处理某个事件A,发生了另一件事件…

NFLS贪心与数据结构题单笔记(未完结)

A. 奶牛飞车贪心,把最慢的放前面#include <bits/stdc++.h> using namespace std; constexpr int maxn = 1e6 + 10; int n, m, d, L; int s[maxn]; int ans = 0; inline bool cmp(int x, int y) { return x > y; } int main() {cin >> n >> m >> d …

提取图片中目标物轮廓的像素尺寸

利用OpenCV库,对图片空间转化、灰度处理、二值化处理等,寻找图片中目标物轮廓像素尺寸。1.导入数据库 import cv2 import numpy as np from PIL import Image2.导入图片 image_tif = Image.open(1.tif) #导入tif图像 image_tif.convert(RGB).save(1p.png,PNG) # 转换为png格…

[极客大挑战 2019]BuyFlag

点击右上角的菜单,有一个payflag,直接点击,进入到了pay.php页面发现,需要得到flag有两个要求:必须是该校的学生,密码必须正确。在该页面的网页底部,有代码提示,要求密码不能是纯数字,最后又要==404密码才正确。我们可以想到利用php的弱类型比较:只要前缀有404就好。那…

Thinkpad P14s 的 archlinux 成长手册(i3-wm 窗口管理器)

目录电脑信息i3-wm 快捷键分辨率调整终端版文件管理器壁纸设置触摸板配置合盖后不休眠i3 配置文件截图工具剪切板i3lock-color卸载 i3lock安装 i3lock-color定义配置文件i3 配置文件增加锁屏配置i3 主题和图标修改i3 工作区配置分配应用程序到工作区工作区字体修改i3 启用透明效…

一键生成美观的彩页演示+AI的训练过程科普

一键生成美观彩页 + AI训练揭秘:让你的内容瞬间高大上! 阅读时间: 8分钟 | 字数: 1300+ 你是否曾为制作精美的演示文稿而烦恼?是否对AI的训练过程充满好奇?今天,让我们一起探索如何用AI一键生成美观彩页,同时揭秘ChatGPT的训练过程! 🌟 天工AI彩页:内容创作的革命 🤔事情…

2个月搞定计算机二级C语言——真题(12)解析

1. 前言 本篇我们讲解2个月搞定计算机二级C语言——真题122. 程序填空题 2.1 题目要求2.2 提供的代码 #include <stdio.h> #define N 3 int fun(int (*a)[N]) {int i, j, m1, m2, row, colum;m1 = m2 = 0;for (i = 0; i < N; i++){j = N - i - 1; m1 += a[i][…