中大中级实训 Summary Report

本文总结了一个为期四周的软件实训经历,涉及Java编程、单元测试、代码质量管理等多个方面。实训内容包括计算器应用程序开发、GridWorld操作、图像处理及迷宫寻路等任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Summary Report

为期四周的实训结束啦,托五一的福拖了一周的时间。凭良心说这次实训没有大一的难,因为自己是个菜鸡所以大一总要问这问那,这次的很顺利的就打下来了。

Week 1 项目启动

计算器
第一周首先要打一个计算器 因为上学期上过Java课打过类似的,而且逻辑也很简单所以基本没什么问题。常用的Java GUI有两种JavaFX 和 Swing,因为Swing上学期就接触过所以继续用的Swing,使用Swing的话可以用MyEclipse (IDE)或在Eclipse中添加windowbuilder插件。Swing一个重要的组成部分是实现逻辑的ActionListener,搞清楚这个之后别的就很容易了。还有需要注意的是程序的鲁棒性,包括输入空、符号空、被除数是0等等各种条件,可以用exception并弹出文本框提示的方法来处理。和Grid World的联系可能是计算器可以写成Grid Layout(一种布局格式)?还能让我们熟悉Java。
如果有机会的话可以试一试JavaFX,JavaFX组件更新更好看而且支持web,推荐使用JavaFX Scene Builder进行可视化编程。


Ant & Vi

Ant其实我都没有搞懂…尝试着将编译和JUnit都写进Ant里因为自己懒所以最后也没实现。详细的Ant和Vi/Vim可以见这篇博客 Part1 自学报告


JUnit

JUnit在每周都要用到,超级好用,不用跑程序就能知道自己的程序有没有问题。怎么写的话自己百度照着写就好,逻辑非常清楚,很简单。如果是在终端运行需要在Classpath中加入JUnit的jar,在Eclipse中的话右键项目,new->JUnit Test Case就能新建一个JUnit Test类,还会自动帮你把JUnit5的jar加到项目中,很方便,并且可以直接在Eclipse中运行并图形化的查看执行结果。我果然还是喜欢Eclipse多一点。


Sonar
Sonar是检查代码质量的工具,非常搞事,特别是Magic number。不过真的能让我们知道很多好习惯,比如if/else/while语句之后要加花括号,一个函数尽量在十行之内,catch中使用logger等等,还有Comment超过十行,不要Deduction。总的来说我觉得Sonar是让我收益最大的,因为这次打的代码没有实现底层所以相对来说简单,但Sonar教给我的良好的编程习惯想必一辈子都会记得吧。

Week 2 基本任务

这周就正式的开始对Grid world相关进行操作,因为大部分目标是只限定了部分规则,所以要自己想出一些合理的规则。这一阶段感觉主要考察的是我们读API的能力,也让我们接触了工程化的构建软件的方法,毕竟软件工程不只是打代码嘛。
搞懂已有的基础代码之后这个部分打起来其实很简单,Java代码的注释规范也是在这部分学到的。写GridWorld底层的大神真的很厉害,想做什么都有对应的可调用的方法,我们写软件的目标也是这个吧。
也是这个阶段,查资料的时候无意间发现了叶嘉祺大佬知乎上的问答 如何评价中山大学vmatrix评测系统? 看见他们做Matrix的时候甚至还没有中级实训,钦佩又惭愧,人与人的差距好大。嘉祺说:“我们没有同学们想的那么厉害,参加 ACM 可能也拿不了奖。我们只是在不断学习并掌握基本的软件工程学的知识、计算机理论。”自己经常看见他早上很早自己啃个包子去实验室,真的很佩服,做出的东西也真的好厉害。可能和实训无关,不过毕竟是因为实训发现的,感觉写到Summary里面也没毛病,也想分享给各位。


Week 3 扩展任务

终于用到了IDE!感觉IDE比终端方便很多。


Image Processing
我感觉这个其实实现起来很简单,只要读懂了bmp的文件结构很快就能打出来,容易出错的点(群里说的bmp的空字节、RGB的设置等)在wiki中已经说的很明白了,不过要搞清楚Java的位操作和文件读写操作(文件读写在wiki中已经给出了API)。也是这里感觉JUnit巨方便!直接对几个Goal比较,相比一遍遍运行还看不出来对不对方便很多。


Maze Bug
这个自己绕了很大的圈子……以为目标是找到到迷宫的出口的最短路径,所以刚开始写出来的是当最短路径未找到时小虫停滞不前…后来听别人说才明白要干什么。这里我自己觉得需要注意的就是储存结点的stack – crossLoction大小为0或1时的情况(pop之后),我的做法是将花的路径也当作一个参数保存并一定程度上特别是crossLoction大小为0或1时根据花来决定前进方向。DFS在使用Stack过程中不知不觉就应用了…进阶部分可以用一个int数组保存各个方向的个数,因为底层API很齐全实现都很简单。


N-Puzzle
BFS实现很简单,大家都写过无数遍;启发式搜索中估价函数的调整要自己来试,建议加入JigsawNode.getNodeDepth()作为一个参数,因为我们的目的本就是找到最优解。注意这道题只能改动solution类,好多朋友改Jigsaw或者Runner类应该是不行的…因为自己周日要去赶车,感觉在云平台上跑的test不太满意,但也没时间去改了…
然后菜鸡的一点看法:感觉N-Puzzle的文件结构有点问题…Jigsaw按理说是不是应该是Inteface好一点(Jigsaw应该是Solution实现的一个功能恰当一点…)?就算是类的话感觉也应该有对各个private参数的get set方法(我相信很多人都会纠结getSearchedNodesNum无法改动,只得在solution中再写一个print函数,造成了不必要的重复)…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值