HIT软件构造复习 lab篇

本文总结了Java实验lab1 - lab6中犯的错误与收获。lab1熟悉Java编程和JUnit;lab2要求规范,理解了特殊类的封装;lab3设计ADT,体会到设计模式和泛型编程的重要性;lab4解决了logger设计问题;lab5研究工具使用;lab6接触多线程,处理了线程打架问题。

这里集中以下lab中犯的错误

lab1

印象中这个实验是最简单的,主要是熟悉java编程和junit

幻方那个,写的挺恶心的,因为可能出现空格 tab 浮点数等一系列问题,所以需要对每种情况做处理…………记得助教验收的时候还改了我的测试数据,幸亏是能跑起来,处理的不错

之后是那个小乌龟,因为之前大一暑假小学期选过java课所以对这个还算比较熟悉,写起来还行

然后是写一个图上的最短路,因为我本身就是搞算法竞赛的,所以这玩意写的很熟,但是还是被java坑了,因为忘记了equals要自己重写不然自动调用 == …………然后这里就写的比较坑,但还是写出来了

最后是写一个tweet的统计,数据每天都会更新,所以时不时跑一跑会有有趣的结果。这个写的东西如果搞得很强大还是有点厉害的,我写的就是单纯的转发 at 还有内容重复的时候会认为两个人有较为紧密的关系,虽然限制比较弱但是还是能看出来一些社交网络。尤其是一些大流量账号,粉丝数是前列的。

总的说lab1还是没啥东西

lab2

此时开始要求规范,比如对每个类写ADT RI之类的,并且要写test
这里首先要写一个图类,用泛型,泛型之后我会另写博客这里就不讲了。然后用实现的图类写一个写诗的东西,这其实也是在用java的基本操作,还有一些库里提供的类(Map,Set之类的)

之后要写一个模拟下象棋和下围棋,此时事情就复杂了。
首先有一个客户端,接受用户的输入,负责解析命令和执行操作,这个就不说了。
之后设计了一堆类来实现功能,实验报告里写的很详细。

其实这里最让我费解的是Action类,我之前理解的一个类是要有对象的,而对于一系列看似没有对象(也就是抽象)的类,只认为它是放在那里用来继承的(就是提供接口,比如interface和abstract class),然后发现也可以用一个类来封装一些函数,而它的对象没有意义(这个东西之前写c++的时候是直接写在main外面的,大概是对于java这种以类为单元的编程语言不太习惯吧)
理解了这个类,对之后的lab设计也有很大帮助。

其他的设计就没啥讲的意思了

lab3

到了重头戏,3~5都要基于这个东西写。曾经想一口气写完lab5,后来因为ACM训练耽误了,一直用lab3差点没写完,肝了好几个通宵…………

这里是要自己设计ADT了,但是指导书上也给了很多提示。

首先有一个抽象类来提供接口,之后实现该类的具体类,和lab2一样
之后对于三个应用,继承并完善其内部功能……完了
其实没这么轻松……问题在于设计。而很多需求会对设计提出较高的要求。
比如说,我要支持在轨道上添加物品,如果轨道是可变的显然可以,但如果采用更安全的不可变该怎么实现?这里我就在实现类里写了个Map<Track,List>来实现,这样只会让轨道系统是可变的,安全性更高。

对于轨道的半径,有时是整数有时是浮点数,怎么办?显然可以搞一个抽象类然后实现两个具体类,但后来我觉得这么写有点小题大做了,因为一个轨道其实只有半径这一个参数,我让他是Number类型不就好了。

对于每个电子,它们都是一样的,这里如果直接放多个电子上去内存占用会比较高,这里就可以用到Flyweight设计模式来降低内存占用(虽然到lab5才用到)

当时为了实现给行星加卫星的操作,使用了decorator设计模式。只修改了三个地方(读入卫星信息,加个实现decorator设计模式的类,GUI的显示)就完成了这个操作,深刻体会到设计模式的重要性

中间还有个小插曲。因为图省事写的HashMap,后来发现要对Track从小到大遍历,这意味着要对Track排序,那么就不能HashMap了。幸亏当初定义的是Map类,所以改动特别少(大概几B的字符吧,又对Track实现了个比较器就没了),这也说明泛型编程有多么方便。

顺便一提,实现关系网用到了代码级复用——lab2写的graph可以直接用

因为实现的比较好,所以大数据也跑得动,就很开心。

lab4

这个实验也比较轻松,我唯一出现问题的地方就是logger的设计。因为不想修改太多的代码,只想添加代码,所以专门写了个logger类用来记录产生的日志信息,并自动输出到文件中。之后只需要在类中加入这个成员,然后在每个操作时直接记录log即可。

lab5

这个做的真的顺风顺水,我发现我的程序内存规模始终是输入规模,并没有太大的浮动,所以更多的是在研究各种工具咋用

lab6

接触了多线程。其实在lab3中的行星GUI也用到了多线程,因为在GUI中让它转起来,显然是要重写那个多线程函数的

其实写lab的时候就发现了,这东西其实是一个CPU的任务分配,每个猴子相当于一个任务……所以猴子之间不知道任何信息就很显然了

这里比较坑的是猴子的状态输出,如果要记录它的状态那么在它内部就要记录很多东西。对于每个梯子,也要记录它上面有多少个猴子。

这里很容易出现线程打架的情况,我就被这个坑了,代码边跑边报错…就好像明明知道自己软件构造要考挂还在刻苦复习的我一样……处理办法是对梯子的访问加锁(每次只有一个猴子访问梯子和梯子上的猴子)就可以了

多线程这个东西真的挺坑的,有机会可以多说说

源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力与改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现与拓展。; 适合人群:具备一定机器学习和优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性与收敛速度;②研究混合智能优化算法(如GA与PSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及与LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值