哈工大软件构造实验2

2020年春季学期
计算机学院《软件构造》课程

Lab 2实验报告

姓名 高翔
学号 1180300828
班号 1803008
电子邮件 [email protected]
手机号码 18845771713

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Poetic Walks 1
3.1.1 Get the code and prepare Git repository 1
3.1.2 Problem 1: Test Graph 1
3.1.3 Problem 2: Implement Graph 1
3.1.3.1 Implement ConcreteEdgesGraph 2
3.1.3.2 Implement ConcreteVerticesGraph 2
3.1.4 Problem 3: Implement generic Graph 2
3.1.4.1 Make the implementations generic 2
3.1.4.2 Implement Graph.empty() 2
3.1.5 Problem 4: Poetic walks 2
3.1.5.1 Test GraphPoet 2
3.1.5.2 Implement GraphPoet 2
3.1.5.3 Graph poetry slam 2
3.1.6 Before you’re done 2
3.2 Re-implement the Social Network in Lab1 2
3.2.1 FriendshipGraph类 2
3.2.2 Person类 3
3.2.3 客户端main() 3
3.2.4 测试用例 3
3.2.5 提交至Git仓库 3
3.3 Playing Chess 3
3.3.1 ADT设计/实现方案 3
3.3.2 主程序MyChessAndGoGame设计/实现方案 3
3.3.3 ADT和主程序的测试方案 3
4 实验进度记录 4
5 实验过程中遇到的困难与解决途径 4
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4

1实验目标概述
本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说:
针对给定的应用问题,从问题描述中识别所需的ADT;
设计ADT规约(pre-condition、post-condition)并评估规约的质量;
根据ADT的规约设计测试用例;
ADT的泛型化;
根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
测试ADT的实现并评估测试的覆盖度;
使用ADT及其实现,为应用问题开发程序;
在测试代码中,能够写出testing strategy并据此设计测试用例。
2实验环境配置
依据https://www.eclemma.org/installation.html内容,从更新站点进行安装。
1.从Eclipse菜单中选择帮助,安装新软件;
2.在“安装”对话框中,在“工作日期”字段中输入https://update.eclemma.org/;

3.检查最新的EclEmma版本,然后按“下一步”;
4.重启eclipse,即可在Java的透视图工具栏中找到coverage启动器,表示安装成功。

https://github.com/ComputerScienceHIT/Lab2-1180300828.git
3实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1Poetic Walks
该任务主要是实验一个图的模块,并基于此使用。
完善Graph接口类,并运用泛型的思想,将String拓展为泛型L类;
实现Graph类的方法:add、set、remove、vertices、sources、targets;
利用实现的Graph类,应用图的思想,实现GraphPoet类,如果输入的文本的两个单词之间存在桥接词,则插入该桥接词;若存在多个单一桥接词,则选取边权重较大者。
git clone https://github.com/rainywang/Spring2020_HITCS_SC_Lab2.git
3.1.1Problem 1: Test Graph
测试静态方法生成String类型的Graph。

3.1.2Problem 2: Implement Graph
3.1.2.1Implement ConcreteEdgesGraph
Edge实现
1.功能主要是为了存储边的三个信息
ConcreteEdgesGraph实现
该类以Edge为基础重写Graph,用集合来存储点和边,每有Edge的增加就会影响到集合的更改
Set()

Remove()

Junit测试

3.1.2.2Implement ConcreteVerticesGraph
Vertex实现
Vertex是点的抽象类,包含3个信息:点的标识,指向该点的边、由该点引出的边。Vertex需要能访问这3个信息,以及增加/删除进边/出边。
ConcreteVerticesGraph实现
ConcreteVerticesGraph是以点为基础的图,每个点通过唯一的标识进行区分,set和remove都依赖Vertex类中的添加和删除操作,sources和targets也调用了Vertex类的方法。
Set()

Remove()

Junit测试

3.1.3Problem 3: Implement generic Graph
3.1.3.1Make the implementations generic
在程序中选择“重构”或选择“String”并选择更改所有匹配项(要注意toString),即可实现泛化类型。
3.1.3.2Implement Graph.empty()
使其可以返回一个新的空实例。

3.1.4Problem 4: Poetic walks
问题简述:
给定一个语料库corpus,根据corpus中的文本生成一个单词图,然后给定一条语句输入,在图中搜索词之间的关系,自动补全语句中可能可以完善的部分。
图的构建规则是,在corpus中,对每一个不一样的单词看作一个顶点,相邻的单词之间,建立一条有向边,相邻单词对出现的次数,作为这条有向边的权值。在输入信息补全时,对相邻单词A和B做检查,如果存在一个单词C,在图中可以由前一个单词A通过这个单词C到达单词B,那么就在A和B之间补全C,补全的优先级按照权值越大者优先。
3.1.4.1Test GraphPoet
在基于预设的测试用例基础上,增加等价类划分的多种情况。
3.1.4.2Implement GraphPoet
1.获得单词x的所有字符小写

2.GraphPoet

3.Poem

3.1.4.3Graph poetry slam
Junit测试

3.1.5Before you’re done
如何通过Git提交当前版本到GitHub上你的Lab2仓库。

在这里给出你的项目的目录结构树状示意图。

3.2Re-implement the Social Network in Lab1
这部分任务就是用我们在3.1中写的ADT,把第一次实验中的FriendshipGraph重新实现一遍,图中的节点仍然是Person类型,所以泛型L一律为Person。而对于已经写好的FriendshipGraph中的方法,要用3.1中的Graph ADT中的方法来实现它们。
3.2.1FriendshipGraph类
Graph < Person > graph:
直接调用Graph的静态方法.empty()生成一个空的图。
boolean addVertex():
直接调用graph.add()添加点。
int addEdge():
调用graph.set()两次,添加双向边,默认权值为1,并记录可能存在的旧边的权值。
int getDistance():

3.2.2客户端main()

设计一个图,然后输出距离,测试是否正确即可。
3.2.3测试用例
对于点和边的添加以及距离的输出分别测试

3.2.4提交至Git仓库
如何通过Git提交当前版本到GitHub上你的Lab2仓库。

在这里给出你的项目的目录结构树状示意图。

3.3Playing Chess
3.3.1ADT设计/实现方案
3.3.1.1类 Action
1.public boolean put//放子
根据棋盘位置信息,判断这个位置是否有棋子,若没有,则添加该位置的棋子信息。
2.public boolean Chessmove//国际象棋
根据移动前后的两个位置的信息,判断移动后位置上是否有棋子且移动前的位置上是否有棋子,若符合条件,则添加相应信息。
3.public boolean Goeat//围棋提子
判断是否有对手棋子,然后删除信息。
4.public boolean Chesseat//国际象棋吃子
判断是否符合条件,然后删除信息。
5.public int theposition//查询该位置信息
提取该位置信息内容。
6.public int thesum查询数量
依次将某位玩家的棋子信息添加。

3.3.1.2类 Board
存储棋盘信息。

3.3.1.3类 Game
通过游戏名字确定游戏类型。

3.3.1.4类 Piece
存储棋子的相应信息,包括位置、棋手类别以及种类。
1.public Piece//初始化
2.public Position getposition() //获得棋子的位置
3.public boolean getflag() //获得棋手类别
4.public String getkind()//获得类别
5.public void setposition(int x, int y) //修改棋子位置
3.3.1.5类 Player
存储玩家的信息
1.public Player(String name, boolean flag)//初始化
2.public String getname()//获得名字
3.public boolean getflag()//获得类别

3.3.1.6类 Position
获得位置信息。

3.3.2主程序MyChessAndGoGame设计/实现方案
运行覆盖度:

3.3.2.1public static void printboard//打印棋盘
编写函数打印棋盘,在每次选手选择操作后都会进行打印棋盘。

3.2.2.2main函数
一.国际象棋
初始化:

行动:
1.End
结束程序

2.Move
提取玩家输入的位置信息,之后调用类Action中的chessmove函数进行相应的行动。

3.Eat
提取玩家输入的位置信息,之后调用类Action中的chesseat函数进行相应的行动。

4.Position
提取玩家输入的位置信息,之后调用类Action中的theposition函数进行相应的行动。
同时判断玩家输入的信息是否合法。

5.Sum
调用调用类Action中的thesum函数输出相应的棋子个数。

二.围棋
初始化:

1.End
结束程序
2.Put
提取玩家输入的位置信息,之后调用类Action中的put函数进行相应的行动。

3.Eat
提取玩家输入的位置信息,之后调用类Action中的put函数进行相应的行动。
之后调用类Action中的Goeat函数进行提子。

4.Position
提取玩家输入的位置信息,之后调用类Action中的theposition函数进行相应的行动。
同时判断玩家输入的信息是否合法。

5.Sum
调用调用类Action中的thesum函数输出相应的棋子个数。

3.3.3ADT和主程序的测试方案
测试覆盖度:

3.3.3.1ActionTest
1.象棋初始化

2.public void testPut()
主要放置十字,用来测试围棋的提子。

3.public void testChessmove()
主要测试超界、位置相同、目的位置已存在棋子、初始位置不存在棋子等报错的情况。

4.public void testGoeat()
测试提子是否可以正常执行或者是否报错。

5.public void testChesseat()
测试吃子的时候一些特殊情况是否会报错。

6.public void testTheposition()
测试是否正常。

7.public void testThesum()
测试数目是否正确。

测试结果:

3.3.3.2BoardTest
测试棋盘是否正常

测试结果:

3.3.3.3PieceTest
1.testGetposition()//获得棋子的位置

2.testGetflag()//获得棋手类别

3.testGetkind()//获得类别

4.testSetposition()//修改棋子位置

测试结果:

3.3.3.4PlayerTest
1.testGetname()
测试玩家建立是否正常。

2.testGetflag()
测试类别是否正确。

测试结果:

3.3.3.5PositionTest
分别测试新建位置信息以及提取位置信息。

测试结果:

3.3.3.6GameTest
测试两种游戏输入的大小写是否可以正常运行。(true为围棋,false为象棋)

测试结果:

你可能感兴趣的:(哈工大软件构造实验2)