3.1.1 Get the code and prepare Git repository 3
3.1.2 Problem 1: Test Graph <String> 3
3.1.3 Problem 2: Implement Graph <String> 4
3.1.3.1 Implement ConcreteEdgesGraph 4
3.1.3.2 Implement ConcreteVerticesGraph 5
3.1.4 Problem 3: Implement generic Graph<L> 6
3.1.4.1 Make the implementations generic 6
3.1.4.2 Implement Graph.empty() 6
3.1.5 Problem 4: Poetic walks 7
3.2 Re-implement the Social Network in Lab1 9
实验目标概述
本次实验训练抽象数据类型(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
实验环境配置
根据老师给的实验材料,安装了EclEmma,截图如下:
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
地址略
实验过程
请仔细对照实验手册,针对两个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
Poetic Walks
该任务主要是实验一个图的模块,并基于此使用。
完善Graph接口类,并运用泛型的思想,将String拓展为泛型L类;
实现Graph类的方法:add、set、remove、vertices、sources、targets;
利用实现的Graph类,应用图的思想,实现GraphPoet类,如果输入的文本的两个单词之间存在桥接词,则插入该桥接词;若存在多个单一桥接词,则选取边权重较大者。
Get the code and prepare Git repository
Git指令如下:
(1)git init
(2)Git remote add origin git@github.com:ComputerScienceHIT/Lab2-1190201322.git pull origin master
(3)git add .
(4)git commit -m “init”
(5)git push origin master
(6)git clone https://github.com/rainywang/Spring2021_HITCS_SC_Lab2.git
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
Problem 1: Test Graph <String>
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
将Graph里的empty()方法修改为:
并运行GraphStaticTest进行测试:
Problem 2: Implement Graph <String>
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
Implement ConcreteEdgesGraph
1.实现Edge<L>
Fileds | 作用 |
Private L source | 起始节点 |
Private L target | 目标节点 |
Private int weight | 边权重值 |
Method | 作用 |
getsource() | 返回有向边起始节点 |
gettarget() | 返回有向边目标节点 |
getweight() | 返回边权值 |
@Override toString() | 用@Override注释toString以确保正确覆盖Object方法的toString方法 |
2.实现ConcreteEdgeGraph
method | 作用 |
add (L vertex) | 调用vertices.add ,返回结果为布尔类型,并且满足spec定义 |
set(L source,L target,int weight) | 检查输入满足weight!=0,若满足,则调用edges.add添加边并返回其weight;若不满足,则把该边存于edges中 |
remove(L vertex) | 检查输入满足vertex存在于vertices,如果存在,则删除该节点和与之相连的所有的边 |
set vertices | 返回vertices |
sources(L target) | 遍历edges,调用gettarget方法,如果找到与target相同的,则将该边加入map中 |
targets(L source) | 遍历edges,调用geysource方法,如果找到与source相同的,就加入到map中 |
@Override toString() |
|
Implement ConcreteVerticesGraph
1.实现vertex<L>
field | 作用 |
Private L label | 节点名字 |
Private Map<L,Integer>sources | 所有以label为目标节点的边<起始节点label,边的权重> |
Private Map<L,Integer>targets | 所有以label为起始节点的边<目标节点label,边的权重> |
Interface | 作用 |
setSource(L source,int weight) | 检查输入满足source!=null,weight>=0,当weight==0时,调用this.removeSource;当weight>0时,调用Map.put修改source并记录初始值。 |
removeSource(L source) | 检查输入满足source!=null调用source.remove并返回。 |
setTarget(L target,int weight) | 检查输入满足target!=null,weight>=0;当weight==0时,调用this.removeTarget;当weight>0时,调用targets.put并返回。 |
removeTarget(L target) | 检查输入满足target!=null,调用targets.remove,并返回。 |
Remove(final L vertex) | 调用removeSource和removeTarget。 |
2.实现ConcreteVerticeGraph
method | 实现思路 |
Add(L vertex) | 检查输入满足vertex!=null,遍历点集vertices,若已存在vertex,就返回false;否则调用vertices.add返回true。 |
Set(L source,L target,int weight) | 遍历点集两次,分别检查vertices中是否存在 source vertex 和target vertex,若都不存在,就调用vertices.add,并调用source.setTarget和target.setSource设置边和权值。 |
Remove(L vertex) | 检查输入满足vertex!=null,如果节点不存在就返回false,否则。遍历vertices中每一个节点调用v.remove在sources和targets中删除该节点。 |
Set vertices(L vertex) | 遍历点集,找到label与vertex相同的节点并加入setans中,返回ans。 |
Sources(L target) | 遍历点集,若没有target就返回空集合;否则调用targetVertex.getSources(target)。 |
Targets(L source) | 遍历点集,若没有target就返回空集合;否则调用sourceVertex.getTargets(source)。 |
Problem 3: Implement generic Graph<L>
Make the implementations generic
把类ConcreteEdgesGraph中接口改为:
把类ConcreteVerticesGraph接口改为:
并且将类中的所有方法中的String改为L。
Implement Graph.empty()
将 Graph.empty()改为:
Problem 4: Poetic walks
Test GraphPoet
Implement GraphPoet
Before you’re done
请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
用一下git指令:
git add Lab2-1190201322
git commit -m “first commit”
git push origin master
即可。
在这里给出你的项目的目录结构树状示意图。
Re-implement the Social Network in Lab1
继承P1中ConcreteEdgesGraph或者ConcreteVerticesGraph类 实现FriendshipGraph,通过基本操作实现FriendshipGraph中addVertex,addEdge和getDistance三个接口,要求不能修改父类rep。
FriendshipGraph类
将以前的邻接表结构改为新的有向图结构。
作为存放person点的有向图,这里采用ConcreteVerticesGraph这一实现,更加符合我们对关注的是每一个“人”的抽象。
method | 作用 |
public void addVertex(Person newPerson) | 遍历父类的vertices(),如果存在一个元素的name域与Person的name域相等,证明这个点已经存在,输出提示,否则调用父类的add(person)将该点加入 |
public void addEdge(Person a, Person b) | 先调用父类的set(a,b,1),如果返回值为0证明这两个点之间不存在边,否则证明这两个点之间已经有边存在,输出提示 |
public int getDistance(Person sta, Person end) | 使用BFS算法求a与b之间的最短距离,BFS需要遍历邻居节点时调用父类接口的targets(a)就可以获得a的所有邻居节点。 |
public static void main(String[] args) | 与Lab1相同 |
Person类
由于继承了ConcreteVerticesGraph,所以可以调用父类的rep和function,因此Person类就不需要过多的修饰。
由于继承了ConcreteVerticesGraph,所以可以调用父类的rep和function,因此Person类就不需要过多的修饰。
客户端main()
给出你的设计和实现思路/过程/结果。
测试用例
提交至Git仓库
如何通过Git提交当前版本到GitHub上你的Lab3仓库。
与p1提交方式相同。
在这里给出你的项目的目录结构树状示意图。
整个实验二的报告差不多就这样,有很多不足的地方,以后会慢慢改善的。