第二次大作业Blog

news/2025/3/15 21:22:45/文章来源:https://www.cnblogs.com/qianemng406/p/18228494

目录
  • 前言
  • 设计与分析
  • 踩坑心得
  • 改进建议
  • 总结

前言

  • 知识点:
  1. 类与对象的应用:
    在三次大作业中,类与对象的应用无疑是核心和基础。这充分体现了Java作为一种面向对象编程语言的特性。通过定义类,我们可以创建具有特定属性和行为的对象,从而构建出复杂的程序逻辑。在每次大作业中,我们都需要根据题目要求定义不同的类,如学生类、课程类、电器类等,并为这些类创建对象以进行实际操作。对象的创建、属性的设置和方法的调用是我们在大作业中最常进行的基本操作,它们共同构成了程序运行的基石。

  2. 字符串与数组的应用:
    在第四次大作业中,字符串与数组的应用显得尤为重要。字符数组作为存储char类型数据的基本结构,在处理输入信息时发挥了关键作用。我们可以利用字符数组来存储用户的输入,然后通过访问、声明和初始化等操作对信息进行提取和处理。此外,字符串之间的对比和转换操作也是处理输入信息时必不可少的步骤。这些操作帮助我们筛选出需要的信息,为后续的正则表达式匹配和数据处理提供了基础。

  3. 正则表达式的应用:
    在处理输入信息时,正则表达式提供了一种高效且系统的方法。它能够精确地匹配特定字符和截取特定字符串,使得信息处理的过程更加便捷和准确。通过将正则表达式与字符串转换相结合,我们可以轻松地对输入信息进行格式化和提取,从而满足大作业中的特定需求。正则表达式的应用不仅提高了代码的可读性和可维护性,还大大提高了程序运行的效率。

  4. ArrayList的使用:
    在新的系列大作业中,我开始使用ArrayList来替代传统的数组进行数据存储和调用。这一改变带来了诸多好处。首先,ArrayList具有动态调整大小的能力,可以根据需要自动扩展或缩小容量,从而避免了数组越界的问题。其次,ArrayList提供了丰富的API供我们调用,使得数据的添加、删除和查找等操作变得更加便捷和高效。最后,ArrayList的使用使得代码更加灵活和可扩展,能够适应更多的场景和需求。

  5. 抽象与继承的应用:
    在对数据类进行定义时,抽象与继承的应用使得代码结构更加清晰和易于维护。通过定义抽象类,我们可以提取出不同子类之间的共同属性和方法,从而减少了代码的冗余和重复。同时,继承机制使得子类能够继承父类的属性和方法,并在此基础上进行扩展和重写。这使得我们在对各个对象进行统一操作时,只需要使用父类对象即可,提高了代码的复用性和可维护性。此外,抽象与继承的应用还有助于我们更好地组织和管理代码,使得程序结构更加合理和易于理解。

  • 题量:这三次大作业的题量相比上三次要变大了一些,代码的行数也逐渐增加到了千行,但对我来说不存在做不完的情况。

  • 难度:除开第四次大作业没有涉计完整拿了79分以外,第五次和第六次都及时地完成拿到了满分,所已难度方面我觉得还可以,主要还是因为自己的java水平在不断提升,近两次大作业做起来都得心应手。

设计与分析

  • 第四次大作业:

第四次大作业在第三次的基础上进行了显著的改进和优化,不仅在数据存储机制和类关系设计上有所提升,而且在信息处理和匹配上也采用了更加高效的正则表达式方法。这些改动使得代码结构更加规整,提高了代码的可读性和可维护性。

在这次作业中,通过使用继承关系,代码成功地对单选、多选和填空题的信息存储和处理进行了统一处理,从而减少了代码的冗余和重复。这种设计思路不仅提高了代码的效率,也使得代码更加灵活,能够适应更多类型的题目。

然而,这次作业也存在一些不足之处。其中,最显著的问题是没有对多试卷进行判定处理。这导致在多试卷测试点上全败,只拿了单试卷的分。这个问题可能是由于对需求理解不够深入或者时间紧迫等原因导致的,需要在后续的改进中加以解决,但是解决起来好像会需要重写底层逻辑,心累。。。

另外,这次作业依然没有使用ArrayList进行信息的存储,而是采用了大量的数组定义。虽然数组在某些情况下能够满足需求,但相比之下,ArrayList具有更加灵活和强大的功能,能够动态地调整大小,使得代码更加简洁和易于管理。如果像第五次和第六次大作业一样使用ArrayList进行信息存储,相信会进一步提升代码的质量和效率。

综上所述,第四次大作业在第三次的基础上取得了显著的进步,但在多试卷处理和数据存储机制上还有待改进。通过进一步深入理解和分析需求,采用更加灵活和高效的数据结构和方法,相信可以在未来的作业中取得更好的成绩。

  • 第五次大作业

第五次大作业进入全新系列-家电电路控制模拟,乍一看很复杂,实则做起来还不及第四次大作业,可能是因为是第一次迭代。

第五次大作业终于开始用ArrayList存储数据和处理数据了,这样对代码的的数据管理就更加灵活和系统,真棒。对信息的处理全部都是用正则表达式进行匹配和录入,对于正则表达式的应用已经得心应手了。

该次大作业定义了一个父类Machine,思路上将所有电器和控制开关都设为子类,这样可以方便进行数据处理。主线所有的电器连通状态都用了一个特征值tlj来判定,对线路是否通畅进行判断和处理。主线路直接定义一条参数化为Machine的链表进行存储各个电器和控制装置,方便逐一处理他们的电压和工作状态。

最后在排序输出时是单纯的按电器种类循环匹配输出,没有做电器编号大小排序,不过这一点在第六次大作业中得到了解决。

  • 第六次大作业

第六次大作业真的开始复杂起来了,用了我总计14个小时的时间对第五次的代码进行改进,然后用了4个小时对数据进行排查和改正,最终在室友的提醒下改进数据精度之后拿下满分。第六次大作业光看类图就能看出其难度,这也是我大作业第一次上千行代码,不过好多代码的运算逻辑都是重复的,估计学会用接口之后会方便一点吧。第六次大作业相比第五次大作业新增思路有:
1.将并联电路看成Machine的子类,再定义一个独有属性ArrayList来存储并联电路中电器的信息。

2.计算总电流和并联电路电流来计算各个电器电压,这个计算建立在第六次大作业增加了电阻机制,计算完总电流和并联电路总电阻后可以开始对并联电路电压开始计算。

3.并联电路的通路判定也增加btlj特征值,这样便于判断分路的通路和主路的通路的状态。

4.对于电器输出做了提前排序,现在的排序代码示例:
for(int i=0;i<tid;i++)
{
for(int j=0;j<tid-1;j++)
{
char[] fid1=ids[j].toCharArray();
char[] fid2=ids[j+1].toCharArray();
int t1=Character.getNumericValue(fid1[1]);
int t2=Character.getNumericValue(fid2[1]);
String ft;
if(t1>t2)
{
ft=ids[j+1];
ids[j+1]=ids[j];
ids[j]=ft;
}
}
}
逻辑把所有电器都存到一个ids数组里,用冒泡排完序之后同种电器的后缀编号肯定就分前后了,然后用匹配输出代码把每种电器都匹配循环输出一遍。不过在输出时还是和第五次大作业一样每一种电器种类都循环了一遍。

踩坑心得

  • 第四次大作业
    第四次大作业感觉除了没做多试卷处理之外对单试卷的处理已经差不多了,没有什么问题,就是数组存数据容易产生越界报错和警告,有以下小问题:
    1.在对多选题进行答题判定时初代逻辑仅仅是只要出现了部分正确答案就判断为部分正确,导致答案多选时也判定为部分正确。
    解决方法:只要修改一下判定逻辑就好了。
    2.和前三次大作业一样没有做空格判定,导致好多次都是格式错误。。。

  • 第五次大作业
    第五次大作业由于第一次使用ArrayList有点不熟练,产生了很多警告和错误,比如
    ArrayList machines;

然后直接machines.add(a)或machines.set(1,a),出现machines is null 的错误,一直以为是越界问题,结果是没有new定义,仅仅抽象定义是不够的,然后改成了:
ArrayList machines=new ArrayList<>();

还有就是定义了一个light的子类继承Machine,然后定义blight(白炽灯)和rlight(日光灯)来继承light,结果导致出现:
Machine machine=machines.get(i);
machines.display();
时不能正确按对应类的display输出,问题出在二次继承时light没有写入display()来继承Machine的属性.
改正措施:将light父类直接删掉,rlight和blight直接继承Machine。

在对分档调节器进行处理时,初代代码的逻辑是换挡就算一次电压,结果导致电压计算错误,我还查了好久的数据。
改正措施:在判断到分档调节器的状态改变信息时,先改变完分档调节器的档位,在状态信息处理完之后再对分档调节器的电压进行计算。

  • 第六次大作业
    第六次大作业因为是在第五次大作业上改进,没有出现什么大错误,但还是有小问题,由于该次迭代没有给测试点特征,所以好多种情况一开始真没想到,有下:
    1.电源VCC后直接接并联电路

    #T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
    #T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
    #M1:[T1 T2]
    #T3:[VCC M1-IN] [M1-OUT D3-1] [D3-2 GND]
    #K1
    #K2
    end
    这种情况对于我的初代代码会有匹配错误,因为我的正则表达式只做了VCC之后接控制器和电器的判断,没有做接并联。

2.并联电路之后接开关。

#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT K3-1] [K3-2 GND]
#K1
#K2
#L1:1.00
end
这种情况会越过我初代代码的通路判定。

3.多并联电路

#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#T3:[IN D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT K3-1] [K3-2 GND]
#K1
#K2
#L1:1.00
end
对于这一点,初代代码是仅仅对二并联进行了处理,结果仅仅拿了个48分,我还纳闷为啥只有这点分,结果细想之后悟了,又花了大把时间开始进行多并联判定的代码改正。

还有就是在计算并联电路总电阻时,使用倒数之和相加会出现测试点18和21出错,这是数据精度问题,在和其他一样出错的人商讨之后改用两两相乘除以相加的运算逻辑进行计算,然后就过了。

改进建议

1.我的每一次大作业代码都会出现重复逻辑的循环或者是判断,导致代码行数大增,改起来看得我眼睛痛,最近正在学习接口的使用,希望情况能有所好转。
好像可以把输出时做一个接口,我现在的输出代码是(示例):
for(int i=0;i<tid;i++)
{
Pattern pattern=Pattern.compile(电器匹配字符串);
Matcher matcher=pattern.matcher(匹配电器);
if(matcher.find())
{
for(int j=0;j<n;j++)
{
Machine machine=pl.get(j);
pattern=Pattern.compile(M);
matcher=pattern.matcher(machine.id);
if(matcher.find())
{
for(int k=0;k<machine.bl.length;k++)
{
if(machine.bl[k]!=null)
{
for(int q=0;q<machine.bl[k].size();q++)
{
if(machine.bl[k].get(q).id.equals(ids[i]))
{
电器类 mc=new 电器类(ids[i],machine.bl[k].get(q).cl1);
mc.setspeed();
mc.display();
break;
}
}
}
}
}
if(machine.id.equals(匹配电器))
{
电器类 mc=new 电器类(machine.id,machine.cl1);
mc.setspeed();
mc.display();
}
}
}
}
以上代码要对每一种电器都改一下对象循环一次,好像加起来有300行差不多。。。。
还有对ids[]进行排序时好像可以在Machine类里定义一个Comparator接口,把ids[]改成ArrayList ids=new ArrayList<>(),这样主函数里排序时只要Colletions.sort(ids)就好了,看上去更系统一点。

2.第四次大作业没有做多试卷的判定,这一点我一直耿耿于怀,最近补练集出了,我得好好改一下。

总结

第四次大作业拿了79分,第五次和第六次都是满分,这说明我的java水平在不断精进,真不错。在完成第五次和第六次大作业时学会了继承和链表的使用,不过代码还是出现了像前四次一样的赘余,室友代码只有1000多行,我有1300多行。。。。
代码还是缺乏系统性,因为我还是习惯于面向过程,因为不会接口,不会排序类的使用,啥都不会。但是相比上一次总结时还是大有长进,不会出现被大作业难倒的情况。

对实验的建议:
要是能延长一下实验的提交时间就好了。

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

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

相关文章

C#.Net筑基-String字符串超全总结 [深度好文]

字符串是日常编码中最常用的引用类型了,可能没有之一,加上字符串的不可变性、驻留性,很容易产生性能问题,因此必须全面了解一下。字符串是日常编码中最常用的引用类型了,可能没有之一,加上字符串的不可变性、驻留性,很容易产生性能问题,因此必须全面了解一下。01、字符…

类的继承,接口的使用

1-知识点,题量,难度总结 1.this与super的区分与使用,如何正确使用多态(用父类类型创建子类对象,并调用子类中重写父类中的抽象方法)(在大作业5中的第二道修改学生信息中)(第三道中父类向下转型,另外还有子类向上转型)。 2接口的使用,多态的具体体现(例如在第一次家…

The University of Sydney

QS大学排名QS世界大学排名 QS大学学科排名 QS亚洲大学排名 QS商科硕士排名 QS就业竞争力排名 QS全球MBA排名软科ARWU大学排名 泰晤士大学排名 USNEWS大学排名 金融时报(FT)商学院排名 EduRank大学排名 CWUR世界大学排名 武书连大学排名 校友会大学排名 登录 去除广告?下载大…

QS世界大学排名 2025

大学排名 发现 展会活动 留学准备 申请 职业发展中文免费注册排名方法什么是QS之星? QS世界大学排名 2025通过2025年的QS世界大学排名,发现世界顶尖大学。展开In partnership with 排名榜单 排名指标 年份 2025…

chrome浏览器被360导航劫持解决办法

右键单击桌面浏览器图标 点击属性 修改目标,去点360的导航url,ok

读AI未来进行式笔记04数字医疗与机器人

读AI未来进行式笔记04数字医疗与机器人1. 数字医疗 1.1. 20世纪的“现代医学”得益于史无前例的科学突破,使得医疗的方方面面都得到改善,让人类预期寿命从1900年的31岁提高到2017年的72岁 1.2. 现有的医疗数据库和流程将实现数字化 1.2.1. 患…

linux启动

1. BIOS BIOS 代表基本输入/输出系统。简单来说,BIOS 会加载并执行主引导记录 (MBR) 引导加载程序。 首次打开计算机时,BIOS 首先对 HDD 或 SSD 执行一些完整性检查。 然后,BIOS 搜索、加载并执行引导加载程序,该程序可以在主引导记录 (MBR) 中找到。MBR 有时位于 USB 记忆…

Grid布局

目录Grid布局概述Grid 布局和 flex 布局网格布局的属性容器和项目网格轨道网格线 Grid布局 概述 Grid 布局即网格布局,目前css布局方案中,网格布局可以算得上是最强大的布局方案了。它可以将网页分为一个个网格,然后利用这些网格组合做出各种各样的布局。比较擅长将一个页面划…

产品功能架构图

产品功能架构图的绘制可以帮助团队更清晰地了解产品的功能结构,有助于沟通和协作。它也可以用于指导产品开发过程,帮助开发团队更好地理解产品需求和功能实现方式。现实情况是,很多产品初期都是在公司阶段,非常的模糊,这个时候boss让你画个产品架构图,你很抓瞎,大千UI工…

GPU与DSA架构分析

GPU与DSA架构分析GPU、GPGPU、DSA、FPGA、ASIC等AI芯片特性及对比GPUGPU(Graphics Processing Unit,图形处理器)是一种专门用于处理图形和图像的处理器。它是计算机的重要组成部分,主要用于加速图形和图像的处理和渲染。与传统的中央处理器(CPU)相比,GPU具有更多的并行处…

k8s组件和网络插件挂掉,演示已有的pod是否正常运行

环境 03 master ,05 06是node[root@mcwk8s03 mcwtest]# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME mcwk8s05 Ready <none> 58…

W801单片机入门开发环境设置

W801单片机入门开发环境设置开发软件下载 烧录工具和SDK 在 WinnerMicro的网站 https://www.winnermicro.com/html/1/156/158/558.htmlch340 USB串口驱动 如果没有的话 https://www.onlinedown.net/soft/1164748.htm开发用的IDE CDK 在平头哥的网站 https://www.xrvm.cn/soft-t…