# 中级实训 **Repository Path**: han-tingchen/intermediate-training ## Basic Information - **Project Name**: 中级实训 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-10-10 - **Last Updated**: 2024-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 软件工程中级实训总结报告 ## 目录 * [软件工程中级实训总结报告](#软件工程中级实训总结报告) * [目录](#目录) * [阶段一](#阶段一) * [vi, Java, Ant, Junit自学](#vi-java-ant-junit自学) * [vi/vim](#vivim) * [Java](#java) * [Ant](#ant) * [Junit](#junit) * [Java计算器小程序的编写](#java计算器小程序的编写) * [Gridworld Part1](#gridworld-part1) * [阶段二](#阶段二) * [Gridworld Part2](#gridworld-part2) * [Gridworld Part3](#gridworld-part3) * [Gridworld Part4](#gridworld-part4) * [Gridworld Part5](#gridworld-part5) * [阶段三](#阶段三) * [ImageReader](#imagereader) * [MazeBug](#mazebug) * [Jigsaw](#jigsaw) * [总结](#总结) ## 阶段一 ### vi, Java, Ant, Junit自学 在实训的第一阶段,自学了vi, Java, Ant, Junit的使用,对本次实训的基本工具的使用有了一定的了解。 #### vi/vim vi是许多linux自带的编辑器,vi/vim具有丰富的程序编辑功能。 vi/vim有许多的命令提供给用户使用。一共有3种模式:命令模式、输入模式、底线命令模式。 **3种模式的切换**: ![vim.png](step1/img/vim.png) vi/vim的命令功能非常强大,熟悉vi/vim的命令使用,可以大大提高编辑的速度。 #### Java Java是经典的面向对象的编程语言,jdk是Java的编译器。 在本阶段的学习中,掌握了Java的环境配置以及编写并编译运行HelloWorld小程序。 **环境配置**: ```bash export JAVA_HOME="jdk安装目录" export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib ``` **HelloWorld小程序**: ```java // HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } } ``` **Java程序的运行**: ```bash javac HelloWorld.java java HelloWorld.class ``` #### Ant Ant是Java的生成工具,类似于C/C++的Makefile。使用Ant可以完成Java的自动编译,在大型的Java项目中使用非常方便。 Ant的默认生成文件为"bulid.xml",命令行输入ant后,会在当前目录下查找"bulid.xml"文件,若存在则运行。 **bulid.xml文件结构**: ```xml ``` 在本阶段中,为HelloWorld小程序编写了bulid.xml文件,完成了ant的自动编译。 #### Junit xUnit是用于单元测试的工具,JUnit是xUnit的子集,用于Java的单元测试。 在本阶段中,使用了Junit来为HelloWorld小程序进行了单元测试。 **Junit测试代码**: ```java // HelloWorldTest.java package hello; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class HelloWorldTest extends TestCase { public HelloWorldTest(String name) { super(name); } public static void main(String[] args) { junit.textui.TestRunner.run(HelloWorldTest.class); } public void testHello() { assertEquals("hello world", HelloWorld.hello()); } } ``` ### Java计算器小程序的编写 学习了基本工具的使用之后,使用Java编写了一个计算器小程序,熟悉Java的使用。 计算器小程序的关键在于Java GUI编程,需要使用awt和swing库来完成。 **计算器小程序的运行演示**: ![calulator](./img/calulator.png) 输入两个操作数,点击运算符按钮,然后点击OK按钮,就能得到运算结果。 ### Gridworld Part1 在本阶段中,开始了Gridworld的学习。 Part1对Gridworld的基本代码进行了运行,对Gridworld有了初步的了解。 首先是运行了**firstProject**中的**BugRunner**: ![BugRunner](./img/BugRunner.png) 然后对Gridworld的问题在Matrix上进行了回答,对Gridworld的运行有了进一步的了解。 * Gridworld Part1问题回答 * [Stage1_1](step1/gridworld_part1/Stage1_1.md) * [Stage1_2](step1/gridworld_part1/Stage1_2.md) ## 阶段二 ### Gridworld Part2 本阶段,对Gridworld中的`Bug`类进行了学习,并继承了`Bug`类,编写了相应的代码。 * **CircleBug运行**: ![CircleBug](img/CircleBug.png) * **SpiralBug运行**: ![SpiralBug](img/SpiralBug.png) * **ZBug运行**: ![ZBug](img/ZBug.png) * **DancingBug运行**: ![DancingBug](img/DancingBug.png) * Gridworld Part2问题回答 * [part2](step2/gridworld_part2/part2.md) ### Gridworld Part3 本阶段,学习了`Actor`类,并继承`Actor`类编写了可以跳跃移动的`Jumper`类。 * **Jumper类运行效果**: ![Jumper1](step2/gridworld_part3/img/test1.png) ![Jumper2](step2/gridworld_part3/img/test2.png) * `Jumper`类设计文档与测试文档 * [设计文档](step2/gridworld_part3/designreport.md) * [测试文档](step2/gridworld_part3/testreport.md) * Gridworld Part3问题回答 * [part3](step2/gridworld_part3/part3.md) ### Gridworld Part4 本阶段,学习了`Critter`类,并继承`Critter`类编写了相关子类。 * **ModifiedChameleonCritter运行**: ![ModifiedChameleonCritter](img/ModifiedChameleonCritter.png) * **ChameleonKid运行**: ![ChameleonKid](img/ChameleonKid.png) * **BlusterCritter运行**: ![BlusterCritter](img/BlusterCritter.png) * **RockHound运行**: ![RockHound](img/RockHound.png) * **QuickCrab运行**: ![QuickCrab](img/QuickCrab.png) * **KingCrab运行**: ![KingCrab](img/KingCrab.png) * Gridworld Part4问题回答 * [part4](step2/gridworld_part4/part4.md) ### Gridworld Part5 本阶段,学习了`Grid`接口,以及实现了该接口的子类。 编写了程序实现了**基于`LinkedList`的稀疏BoundedGrid**、**基于`TreeMap`的稀疏BoundedGrid**、以及**基于动态扩张的二维i数组的UnboundedGrid**。 * **几种实现中基本操作的复杂度比较**: |Methods|`SparseGridNode`
version|`LinkedList`
version|`HashMap`
version|`TreeMap`
version| |--|--|--|--|--| |getNeighbors|$O(c/2)$|$O(c/2)$|$O(n/2)$|$O(\log(n))$| |getEmptyAdjacentLocations|$O(c/2)$|$O(c/2)$|$O(n/2)$|$O(\log(n))$| |getOccupiedAdjacentLocations|$O(c/2)$|$O(c/2)$|$O(n/2)$|$O(\log(n))$| |getOccupiedLocations|$O(r+n)$|$O(r+n)$|$O(r+n)$|$O(r+n)$| |get|$O(c/2)$|$O(c/2)$|$O(n/2)$|$O(\log(n))$| |put|$O(c/2)$|$O(c/2)$|$O(n/2)$|$O(\log(n))$| |remove|$O(c/2)$|$O(c/2)$|$O(n/2)$|$O(\log(n))$| * Gridworld Part5问题回答 * [part5](step2/gridworld_part5/part5.md) ## 阶段三 ### ImageReader * 本阶段,对图像的读取与处理进行了学习。 * 利用Java实现了24bits的bmp图片的二进制流读取,以及图片的输出。 * 实现了基本的图像处理:图像RGB色彩通道的提取和转换为黑白图像。 **ImageReader运行**: ![ImageReader](img/ImageReader.png) ### MazeBug 本阶段,扩展了Gridworld基本代码,实现了虫子走迷宫的功能。 * 编写代码,实现了基于DFS的虫子走迷宫流程 * DFS需要使用栈结构来存储将要访问的结点。 * 实现了`selectRandom`:虫子在岔路口时随机选择前进方向。 * 实现了`selectProbability`:根据基于方向的概率估计来选择前进方向。 * 最终的测试结果说明一般情况下,概率估计的效果比随机选择要好。 * **MazeBug运行** * **随机选择**: ![MazeBug1](img/MazeBug1.png) * **概率估计**: ![MazeBug2](img/MazeBug2.png) ### Jigsaw 本阶段,基于存在的Jigsaw代码,编写了`Solution`类来解决**N-Puzzle**问题。 * 实现了基于BFS的搜索算法,寻找**N-Puzzle**问题的解。 * open表记录将要访问的结点,close表记录已经访问的结点。 * BFS中,open表使用队列实现,close表使用HashSet实现。 * 基于Jigsaw实现的启发式搜索算法,设计启发式函数,求解**N-Puzzle**问题。 **Jigsaw运行**: ![Jigsaw](img/Jigsaw.png) ## 总结 通过本次中级实训,学习了Java以及相关的工具使用。利用Gridworld软件包来强化对Java语言的学习,对Java开发有了更进一步的了解。