# 中级实训
**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种模式的切换**:

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库来完成。
**计算器小程序的运行演示**:

输入两个操作数,点击运算符按钮,然后点击OK按钮,就能得到运算结果。
### Gridworld Part1
在本阶段中,开始了Gridworld的学习。
Part1对Gridworld的基本代码进行了运行,对Gridworld有了初步的了解。
首先是运行了**firstProject**中的**BugRunner**:

然后对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运行**:

* **SpiralBug运行**:

* **ZBug运行**:

* **DancingBug运行**:

* Gridworld Part2问题回答
* [part2](step2/gridworld_part2/part2.md)
### Gridworld Part3
本阶段,学习了`Actor`类,并继承`Actor`类编写了可以跳跃移动的`Jumper`类。
* **Jumper类运行效果**:


* `Jumper`类设计文档与测试文档
* [设计文档](step2/gridworld_part3/designreport.md)
* [测试文档](step2/gridworld_part3/testreport.md)
* Gridworld Part3问题回答
* [part3](step2/gridworld_part3/part3.md)
### Gridworld Part4
本阶段,学习了`Critter`类,并继承`Critter`类编写了相关子类。
* **ModifiedChameleonCritter运行**:

* **ChameleonKid运行**:

* **BlusterCritter运行**:

* **RockHound运行**:

* **QuickCrab运行**:

* **KingCrab运行**:

* 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运行**:

### MazeBug
本阶段,扩展了Gridworld基本代码,实现了虫子走迷宫的功能。
* 编写代码,实现了基于DFS的虫子走迷宫流程
* DFS需要使用栈结构来存储将要访问的结点。
* 实现了`selectRandom`:虫子在岔路口时随机选择前进方向。
* 实现了`selectProbability`:根据基于方向的概率估计来选择前进方向。
* 最终的测试结果说明一般情况下,概率估计的效果比随机选择要好。
* **MazeBug运行**
* **随机选择**:

* **概率估计**:

### Jigsaw
本阶段,基于存在的Jigsaw代码,编写了`Solution`类来解决**N-Puzzle**问题。
* 实现了基于BFS的搜索算法,寻找**N-Puzzle**问题的解。
* open表记录将要访问的结点,close表记录已经访问的结点。
* BFS中,open表使用队列实现,close表使用HashSet实现。
* 基于Jigsaw实现的启发式搜索算法,设计启发式函数,求解**N-Puzzle**问题。
**Jigsaw运行**:

## 总结
通过本次中级实训,学习了Java以及相关的工具使用。利用Gridworld软件包来强化对Java语言的学习,对Java开发有了更进一步的了解。