2020软件构造Lab2报告(原3.1问题)

1.1 Poetic Walks的实现

本问题采用了先写测试样例再写具体方法的的顺序,静态测试全在GraphStaticTest.java中,实例方法测试在GraphInstanceTest.java中。

写出相应的测试文件,再分别用点和边实现一个图,以Graph为接口在ConcretEdgesGraph和ConcreteVertexGraph中实现定义的各个函数。

在poet中读入给定文本,相邻词之间构成一条有向边,从而构成一棵树,再输入给定的句子,若相邻词之间有一个词,则插入,有多个,选择插入权值最大的。

1.1.1 Get the code and prepare Git repository

git init 进行本地初始化

git clone +URL 获取初始代码,由于github连接问题,我是直接下载zip包获得初始代码。

1.1.2 Problem 1: Test
Graph

思路及过程:

add函数:判断vertex是已存入Graph的点还是为存入的点

set函数:source,target:已存入Graph的点、未存入Graph的点

     weight:是否未0

remove函数:判断vertex是已存入的点、未存入的点还是与其他点相连的点

vertices函数:判断Graph是否为空图

sources函数:建立一个空Map,遍历edges,找出以target为终点的边edge;

weight=0时表示该边不存在,跳过;将edge.source->edge.weight加入Map。 遍历结束后返回这个Map。

targets函数:建立一个空Map,遍历edges,找出以source为起点的边edge;

weight=0时表示该边不存在,跳过;将edge.source->edge.weight加入Map,遍历结束后返回这个Map

并编写覆盖以上条件的测试用例

1.1.3 Problem 2: Implement
Graph

以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。

1.1.3.1 Implement ConcreteEdgesGraph

3.1.3.1.1ConcreteEdgesGraph实现

该类以Edge为基础重写Graph,用集合来存储点和边(Edge),每有Edge的增加就会影响到集合的更改,而点的删除也需要在集合中查询匹配。

public boolean add(String vertex)

思路:如果在vertices的Set集合中成功添加了顶点string,则返回true

public int set(String source, String
target, int weight)

思路:输入source,target,weight,确定一条有向边。

如weight!=0,移去可能已经存在的相同起始点的边,然后加入新的边,如weight=0,寻找可能已经存在的相同起始点的边,删去。

在这里插入图片描述

public boolean remove(String vertex)

思路:从vertices中删去,传入的参数vertex点,遍历edges,寻找是否有边的起点或者是终点是该vertex,删去。

public Map<String, Integer>
sources(String target)

思路:根据传入的target参数寻找以targe为终点的边。返回一个键值对为(点,权重)的map。利用迭代器实现。

其余较简单,略。

3.1.3.1.2 Edge实现

Edge的功能主要为存储边的3个信息。此外,为了Graph实现方便,增加了判断两条边是否相等的方法。

Edge:使用三个数据域声明一条新边

  private String source;

   private String target;

   private int weight;

getSource:返回source

getTarget:返回target域

getWeight域:返回

toString:交代边的各参数

checkRep:检查不变量,source、target非空,weight>0

在这里插入图片描述

1.1.3.2 Implement ConcreteVerticesGraph

1.1.3.2.1
ConcreteVerticesGraph实现

ConcreteVerticesGraph是以点为基础的图,每个点通过唯一的标识进行区分,set和remove都依赖与Vertex类中的添加和删除操作,sources和targets也调用了Vertex类的方法。

add

参数:vertex,判断vertices中无重复点就加入

set

参数:source, target, weight。先将可能不在vertices中的source点和target加入vertices。随后遍历vertices,找到source对它增加一个target,找到target为它增加一个source,并设置距离。

remove

参数:vertex。遍历vertices,如果当前点是vertex,删去(使用iterator.remove方法,有要求)。若不是,检查它的source和target是否包含vertex,有就删去。

sources

参数:target。遍历vertices找到target点返回它的sources map(注意防御性拷贝)

targets

参数:source。遍历vertices找到source点返回它的targets map(注意防御性拷贝)

toString

输出一个字符串表示当前图

在这里插入图片描述
在这里插入图片描述

1.1.3.2.2
Vertex类

Vertex是点的抽象类,包含3个信息域:点的标识、进入边、走出边。Vertex需要能访问这3个信息,以及增加/删除进边/出边。

Vertex:构造方法,传入参数name创建新的点。

checkRep:检查表示不变性,各边weight的值应该永远大于0

removeSource:删去当前点的指定source

removeTarget:删去当前点的指定target

toString :输出能看懂的当前点信息

setTarget:为当前点新增一个target,如果weight=0,删去当前点的target,成功返回删去target的weight,不存在返回0。如果weight!=0,为当前点新增一个target,长度为weight,如果该点已存在,返回旧的weight,否则返回0。setSouce 为当前点新增一个source,

如果weight=0,删去当前点的source,成功返回删去source的weight,不存在返回0。如果weight!=0,为当前点新增一个source,长度为weight,如果该点已存在,返回旧的weight,否则返回0

实现方法同上
在这里插入图片描述

Safety form rep exposure:设置vertices为private final,必要时防御性拷贝

防御性拷贝:

在这里插入图片描述
在这里插入图片描述

1.1.4 Problem 3: Implement generic Graph

1.1.4.1 Make the implementations generic

诸如此类,修改成为泛型实现。

1.1.4.2 Implement Graph.empty()

覆盖率:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Junit:
在这里插入图片描述
在这里插入图片描述

1.1.5 Problem 4: Poetic walks

利用之前实现的图结构,完成利用已经存在的诗句对一个新的句子进行扩充的任务。

1.1.5.1 Test GraphPoet

在基于预设的测试用例基础上,增加等价类划分的多种情况。主要进行了以下的测试,有Constructor、poem、toString,采用“最少一次覆盖的策略进行策略”。

Constructor
构造器

Graph the poem
由诗所生成的图

poem(in)

toString

带环的有向图可能存在不同的bridge word,需要在其中选择权值最大的一个。

1.1.5.2 Implement GraphPoet

1、对于GraphPoet的构造器

将文件中字符按行读入,利用空格将其分开,去掉空字符串,在任何相邻的两个中间加入一条边,按边出现的数量更新权值建图。

2、对于poem函数

利用已有的诗歌生成的图,在输入的input字符串中增加bridge word。根据Graph已有的target和source函数进行判断,若前词target和后词的source有重合,从中读取最大权值的一边作为bridge word加入即可。

3、在完成GraphPoet进行测试

1.1.5.3 Graph poetry slam

原有的测试样例测试成功。

我的诗:“This is a world.” 变成This is still a beautiful world.

1.1.6 Before you’re done

请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。

运行下列命令即可。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值