题目集4~6的总结性Blog
4~6次大作业总结
前言
在题目的开始设计好类和结构真的很重要,之前一直上来就开始写,后来就变得吃力,这样不能很好的一次性完成代码,发现应该先设计,在着手编写代码之前,可以先绘制类图,明确每个类的属性和方法,以及它们之间的关系。这有助于构建清晰的代码结构和逻辑,避免在编码过程中陷入混乱。
也发现了每个类单一职责,这有助于代码的模块化和解耦,提高代码的灵活性和可维护性。将主函数保持简短和清晰,只包含必要的代码逻辑,避免过多繁琐的操作和计算。主函数应该主要负责程序的启动和控制流程的引导,具体的业务逻辑应该封装在各个类的方法中完,让代码更条理清晰,也便于之后的修改迭代。如果都交织在一起,那可就真是剪不断理还乱了。主函数太过冗长也不是java应该有的特点,要记得java是面向对象。
第四次大作业
1.知识点:
在处理错误情况时,针对不同类型的错误,可以采取不同的处理方式,选择题和多选题,需要检查学生的答案是否在规定的选项范围内,并且需要考虑部分正确的情况。可以根据题目的要求和答案的匹配程度给予不同的分数。填空题是根据填写的答案与标准答案的匹配程度来确定的。可以使用字符串匹配算法来比较学生填写的答案和标准答案之间的相似度,并根据相似度给予不同的分数。对于多个学生多个试卷的情况,需要分别处理每个学生的试卷,并将每个学生的成绩记录下来。可以使用循环来处理每个学生的试卷,并使用数据结构来存储每个学生的成绩信息。
7-4 答题判题程序-4
部分正确给分判定,在满足一定条件下对分数进行处理并输出,根据题目的状态和正确与否来计算得分。其中包含了对题目是否存在、是否被删除以及是否为正确答案的判断逻辑。通过逐步解析条件并执行相应的操作
if (judge2)//部分正确
{ if(!deletes.contains(question.getNu mber())&&!(question.getNumber()>=100))//题目存在,且没被删除
{
int judge3 = questionscore.get(i)/2;
totalScore=totalScore+judge3;
if(k==paperquestion.size())
System.out.print(judge3);
else
System.out.print(judge3+" ");//
}
else
{
totalScore=totalScore+0;
if(k==paperquestion.size())
System.out.print("0");
else
System.out.print("0 ");//
}
} else {//含错误答案
totalScore=totalScore+0;
if(k==paperquestion.size())
System.out.print("0");
else
System.out.print("0 ");//
}
第五次大作业
知识点:
要考虑到它们之间的关系以及如何利用多态性。比如,在设计电路的模型时,可以创建一个抽象的电路类作为父类,然后创建不同类型的子类来表示具体的电路组件,如串联电路和并联电路。通过继承和多态,可以实现对不同类型电路的统一管理和操作。对输入数据的处理需要考虑到数据的合法性和格式化。对串联电路的连接可以采用链式连接的方式。即将多个电路组件按顺序连接起来,形成一个完整的串联电路。在保留整数部分时,可以使用取整函数或者字符串处理方法来实现。可以使用排序算法对数据进行排序
7-5 家居强电电路模拟程序-1
部分截取代码
class Device {
String id; // 设备标识符
int num;//序号
double pin1Voltage; // 输入引脚电压
double pin2Voltage; // 输出引脚电压
// 构造函数
public Device(String id) {
}
// 更新设备状态
public void updateState() {
// 根据输入引脚电压更新设备状态
}
// 输出设备状态
public void printState() {
// 输出设备状态
}
}
// 开关类
class Switch extends Device {
boolean state; // 开关状态,true为1,false为0
// 构造函数
public Switch(String id) {
super(id);
this.state = false; // 默认为关闭状态
}
// 切换开关状态
public void toggle() {
this.state = !this.state;
}
// 更新设备状态
@Override
public void updateState() {
if (state) {
this.pin2Voltage = this.pin1Voltage;
} else {
this.pin2Voltage = 0;
}
}
public double getOutV() {//返回输出电压
return state ? pin1Voltage : 0;
}
}
// 分档调速器类
class SpeedController extends Device {
}
// 连续调速器类
class ContinuousSpeedController extends Device {
}
// 灯类
class Light extends Device {
}
// 风扇类
class Fan extends Device {
}
class WhiteLight extends Light//白炽灯
{
}
class SunLight extends Light//日光灯
{
}
class CeilingFan extends Fan//吊扇
{
}
public static void input(String line) {
// 解析输入信息并执行相应操作
if (line.startsWith("[")) {
String[] pats = line.substring(1, line.length() - 1).split(" ");//去除【】和根据空格分开
switch (pats[1].charAt(0)) {
case 'K': {
String id = pats[1].substring(0, 2);
Switch K =new Switch(id);
K.setPin1Voltage(220.0);
devices.add(K);
break;
}
.........
} else if (line.startsWith("#")) {
// 调节设备状态
switch (line.charAt(1)) {
case 'K': {
String id = line.substring(1, 3);
for (Device device : devices) {
if (device instanceof Switch) {
if (device.id.equals(id)) {
Switch subDevice = (Switch) device;
subDevice.toggle();// 对子类进行修改
}
}
}
break;
}
......
}
}
这是一些主要的类,包括设备父类,开关子类,调速器子类和一些用电器类及其相应函数。
还有输入部分的函数,判断这一行的开头是什么标志,分情况进行后续的操作,将信息存入或是别的操作。不过我认为这里太长太复杂了,还需进一步修改。
第六次大作业
知识点:
在设计电路模型时,将每个用电器的电阻通过计算得出电势差。串联电路中,多个电路组件按顺序连接,形成一个链式结构。可以设计一个串联电路类,用于管理和连接多个电路组件。通过重写连接方法,实现将多个电路组件串联起来,形成一个完整的串联电路模型
为了实现多个串联电路组成的并联电路,并联电路类,其中包含多个串联电路作为子组件。
7-6 家居强电电路模拟程序-2
有了串联并联,就不得不新增电路类,串联类,并联类。将电路看做一个元件,用电器。通过引入电路、串联电路和并联电路的类,可以更好地建模和模拟复杂电路系统,可以使代码更具扩展性和灵活性。以下是部分删减代码
class Circuit{//电路设备
double i;//电流
double diff;//电压差
double r;//电阻
boolean state=false;//开关闭合状态
public Circuit()
{
}
}
class SeriesCircuit extends Circuit{//串联电路
List<Device> devices;
public SeriesCircuit() {
devices = new ArrayList<>();
this.diff=0.0;
}
public void addDevices(Device device){ //将设备添入串联带路
this.devices.add(device);
}
public void addr(double r)
{
this.r=this.r+r;
}
public void judgestate(){ //计算是否子串电路是否闭合
int a=1;
for(Device device : devices) {
if (device instanceof Switch) {
Switch Devicess = (Switch) device;
if (!Devicess.state) {
a = 0;
}
}
if(device instanceof SpeedController){
SpeedController Devicess = (SpeedController) device;
if(Devicess.currentLevel==0)
a=0;
}
if(device instanceof ContinuousSpeedController){
ContinuousSpeedController Devicess = (ContinuousSpeedController) device;
if(Devicess.position==0.0) {
a = 0;
}
}
}
int b=0;
for(Device device : devices) { //判断串联电路中是否含有控制设备,如果不含则也是true
if(device instanceof Switch||device instanceof SpeedController||device instanceof ContinuousSpeedController) {
b=1;
}
}
if (a == 1){
this.setstate(true);
}
if (b == 0){
this.setstate(true);
}
}
public void connectDevices() {//连接元件
for (int i = 1; i < devices.size(); i++) {
Device device1 = devices.get(i - 1);
Device device2 = devices.get(i);
// device2.voltage = device1.voltage;
}
}
}
class ParallelCircuit extends Circuit{//并联电路
List<SeriesCircuit> seriesCircuits;//并联中串联
public ParallelCircuit() {
seriesCircuits = new ArrayList<>();
}
public void setV(){
for(SeriesCircuit series:seriesCircuits){
series.setdiff(this.diff);
}
}//并联电路电压相等
public void addseriesCircuit(SeriesCircuit seriesCircuit) {//加入串联电路
seriesCircuits.add(seriesCircuit);
}
public double getr(){
double r=0.0;
for(SeriesCircuit series:seriesCircuits){
series.judgestate();
if(series.state){
r=r+(1/series.r);
}
}
this.r=1/r;
return this.r;//并联的总电阻
}//
}
设计与分析
7-4 答题判题程序-4
作为第一次大作业的最后一次迭代,难度自然是不必说,新增了选择题和填空题两种题型,尤其是多选题和填空题,有部分正确的判分方式,和之前非对即错的不同,需要加入新的判断。
7-5 家居强电电路模拟程序-1
又是一次全新的大作业,以智能家居为背景,要为后面的迭代打下基础就要设计好类,每个类的功能单一,简单。对大体格局要求较高
7-6 家居强电电路模拟程序-2
增加了并联电路,并联由多个串联组成,根据电阻和串并联特性计算电压,这次的输入和之前大有不同,需要做许多修改
踩坑心得
-
在源码提交过程中遇到编译错误和字段不可见等问题,这提示了我们在编写代码时要注意访问权限的设置。合理的访问权限能够保护代码的安全性和封装性,防止未经授权的访问和修改。通过合理地使用 private、protected、public 等关键字来控制字段和方法的可见性,可以有效地避免类成员被误用或者篡改,有助于提高代码的健壮性和可维护性。
-
输入信息处理不当很可能引发意想不到的错误,比如导致函数返回非零值而后续代码无法执行。为了避免这种问题,需要对输入数据进行有效的验证和处理。在处理用户输入时,应该考虑各种可能的情况,并采取适当的措施来确保数据的完整性和准确性。对于可能导致非零返回的情况,可以通过添加适当的异常处理或错误检测机制来及时发现和处理问题,从而确保代码的正常执行。
-
函数计算错误可能导致程序逻辑出现偏差,进而影响到答案的正确在。在处理设备状态或用电器控制时,如果函数计算错误可能导致用电器状态不正确。为了避免这种问题,需要对涉及到设备状态的函数进行仔细检查和验证,确保函数逻辑正确并输出正确的结果。
点击查看代码
class WhiteLight extends Light//白炽灯
{
public WhiteLight(String id)
{
super(id);
}
public int getbright()
{
if (pin1Voltage < 10.0) {
return 0;
} else if (pin1Voltage <= 220.0) {
return (int)( (15.0/21.0)*pin1Voltage+(900.0/21.0) ); // 按比例计算亮度
} else {
return 200; // 超过220V亮度为最大值200lux
}
}
}
改进建议
简化主函数,主函数太过冗长会导致后续的修改十分不方便,建议将个各类分工明确,尽量减少在住函数中进行大量计算
在设计类和字段时要考虑良好的封装性,避免字段不可见等问题的出现。建议合理使用访问修饰符,将字段设置为私有(private)并通过公有(public)方法来访问,从而保证良好的封装性,提高代码的可维护性和安全性。
过本阶段的三次题目集,我学会了在编码过程中如何处理编译错误和访问权限等问题,也学会了如何通过逐步调试和修改代码来解决这些问题。在以后的学习中,我需要进一步加强对Java编程语言的理解,尤其是关于面向对象编程中封装、继承和多态等概念的学习。此外,我也需要更多地练习编程,提升自己的编程能力。
总结
仔细审查错误信息:对于每一个编译错误或异常信息,都要仔细阅读并理解其含义。错误信息通常会指出出错的位置以及可能的原因,因此要耐心地一步步解决问题。
强调代码质量:在编写代码时,要注意语法规范、命名规范和代码风格,这有助于减少出现错误的可能性。另外,及时进行代码审查和测试也是确保代码质量的重要手段。
要逐步尝试脱离测试点提示,靠自己思考得出测试点,为以后工作打下基础
考虑到大作业的迭代性质,在第一次写的时候就要考虑到后面的变化,尽可能的少量修改代码,避免每一次做大量改动
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现