软件构造实验二

目录

 

 

1 实验目标概述 1

2 实验环境配置 1

3 实验过程 2

3.1 Poetic Walks 2

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.1.5.1 Test GraphPoet 7

3.1.5.2 Implement GraphPoet 7

3.1.5.3 Graph poetry slam 8

3.1.6 Before you’re done 8

3.2 Re-implement the Social Network in Lab1 9

3.2.1 FriendshipGraph类 9

3.2.2 Person类 9

3.2.3 客户端main() 10

3.2.4 测试用例 10

3.2.5 提交至Git仓库 11

4 实验进度记录 11

5 实验过程中遇到的困难与解决途径 11

Test Graph过程中,JUnit测试一直失败。 12

6 实验过程中收获的经验、教训、感想 12

6.1 实验过程中收获的经验和教训 12

6.2 针对以下方面的感受 12

实验目标概述

本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象

编程(OOP)技术实现 ADT。具体来说:

针对给定的应用问题,从问题描述中识别所需的 ADT

设计 ADT 规约(pre-conditionpost-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提交方式相同。

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

 

整个实验二的报告差不多就这样,有很多不足的地方,以后会慢慢改善的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值