目录

1 实验目标概述··· 1

2 实验环境配置··· 1

3 实验过程··· 1

3.1 Poetic Walks· 1

3.1.1 Get the code and prepare Git repository· 2

3.1.2 Problem 1: Test Graph <String>· 2

3.1.3 Problem 2: Implement Graph <String>· 3

3.1.3.1 Implement ConcreteEdgesGraph· 3

3.1.3.2 Implement ConcreteVerticesGraph· 5

3.1.4 Problem 3: Implement generic Graph<L>· 7

3.1.4.1 Make the implementations generic· 7

3.1.4.2 Implement Graph.empty()· 7

3.1.5 Problem 4: Poetic walks· 9

3.1.5.1 Test GraphPoet· 9

3.1.5.2 Implement GraphPoet· 10

3.1.5.3 Graph poetry slam·· 10

3.1.6 使用Eclemma检查测试的代码覆盖度··· 11

3.1.7 Before you’re done· 11

3.2 Re-implement the Social Network in Lab1· 12

3.2.1 FriendshipGraph类··· 13

3.2.2 Person类··· 13

3.2.3 客户端main()· 13

3.2.4 测试用例··· 13

3.2.5 提交至Git仓库··· 14

4 实验进度记录··· 15

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

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

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

6.2 针对以下方面的感受··· 15

  1. 实验目标概述

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

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

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

设计 ADT 规约(pre-condition、post-condition)并评估规约的质量;

根据 ADT 的规约设计测试用例;

ADT 的泛型化;

根据规约设计 ADT 的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstractionfunction)

使用 OOP 实现 ADT,并判定表示不变性是否违反、各实现是否存在表

示泄露(rep exposure);

测试 ADT 的实现并评估测试的覆盖度;

使用 ADT 及其实现,为应用问题开发程序;

在测试代码中,能够写出 testing strategy 并据此设计测试用例。

  1. 实验环境配置

简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。

特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

实验所需的环境在以前的学习中就已经配好。

在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。

https://github.com/ComputerScienceHIT/HIT-Lab2-1190200704

  1. 实验过程

请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。

  1. Poetic Walks

需要构造一个Graph,实现或完善规约要求的内容。以边和点两种方式实现接口,需要将String拓展为泛型L。实现ConcretEdgesGrap和ConcreteVertexGraph中接口中定义的各个函数。问题四中,根据文件输入,如果相邻两个词之间构成一条有向边,从而构成一棵树,再输入给定的句子,若相邻两个词之间有一个词,则插入,有多个,则选取边权重较大者。

  1. Get the code and prepare Git repository

从GitHub获取该任务的代码

在 powershell 下生成公私钥, 复制生成的公钥到 github

复制 github 仓库的 ssh 地址, 在 intellij 中添加远程到 github 仓库

  1. Problem 1: Test Graph <String>

该部分就是将Graph.java接口中的empty函数修改为

如果想通过GraphStaticTest的话, 需要将ConcreteEdgesGraph.java中的vertices函数修改,我们将其补全,返回 Hashset()。

  1. Problem 2: Implement Graph <String>

这一部分主要是要求我们分别基于边为主和点为主来实现图的存储和基本操作。

  1. Implement ConcreteEdgesGraph

首先设计edge

edge类的成员变量如下所示

然后设计方法

方法如下:

Edge:利用传入的参数创建一条新的边

getSource:返回边的源顶点

getTarget:返回边的目标顶点

getWeight:返回边的权值

checkRep:检测edges里是否有重复元素

toString:按照指定格式打印边

由于ConcreteEdgeGraph类需要实现接口Graph中的函数, 忽略empty函数,接下来便一一介绍并实现Graph接口中的函数:

1. add(L vertex) 函数
该函数的作用是向点集中加入一个点. 由于Set类型的性质, 如果向Set里加入重复的元素会返回false, 所以不需要查重, 直接返回set.add()的值即可

2. set(L source, L target, int weight) 函数

该函数规约很长, 作用也很多, 主要有四个作用:

(1) 如果输入的点不存在且输入的权值为正数, 则需要加点加边并返回0

(2) 如果输入的点存在边不存在且输入的权值为正数, 则需要加边并返回0

(3) 如果输入的点和边存在且输入的权值为正数, 则需要更新这条边的权值并返回之前边的权值

(4) 如果输入的点和边存在且输入的权值为0, 则需要删除该边并返回之前边的权值

3. remove(L vertex) 函数
该函数的作用是删除该点以及以该点为起点或终点的边, 具体思想就是遍历edges, 如果edges里有边以该点为起点或终点, 那么删除该边, 最后删除该点

4. vertices() 函数
该函数会返回图中的点集

5. sources(L target) 函数
该函数会返回图中以target为终点的边的起点source与边的权值的映射关系(就是Map类型)

6. targets(L source) 函数
该函数会返回图中以source为起点的边的终点target与边的权值的映射关系(就是Map类型)

对于Abstraction function:

由source,target,weight组成的抽象数据型表示从源顶点到目标顶点具有权重的有向边

对于Representation invariant:

weight > 0 source和target不为空

对于Safety from rep exposure:

变量都由private和final关键字修饰,类中并没有定义set方法,成员变量都不能从类外部获取或者赋值,保证了数组不会外泄。

测试策略如下:

public String getSource() 返回边的String类型的源节点
public String getTarget() 返回边的String类型的目标节点
public int getWeight()  返回边的int类型的权值
public String toString() 返回一个字符串 格式如下:边的源节点->边的目标节点 权值为:x

进行测试:

运行测试全部通过

覆盖率测试如上图所示,覆盖率为100%

  1. Implement ConcreteVerticesGraph

如果想要用vertex来实现图, 那么需要Java中的Map类型来存放与该点连接的点以及该边对应的权值, 所以需要的参数不仅有点的标签, 还需要有以该点为终点的边的起点及边的权值映射sources_map, 以及以该点为起点的边的终点及边的权值映射targets_map

首先设计vertex

vertex类的成员变量如下所示

对于类的设计实际上与edge类似

Vertex:含参构造函数

checkRep:检测顶点的name不为空或者””并且要求边的权值>0

getName:获取顶点名称

getConnec:获取顶点的边集

remove:删除某条边

put:加边或者修改权值

getWeight:获取指定边的权值

toString:按指定格式打印

对于Abstraction function:

代表有权值的有向边中的源点

对于Representation invariant:

顶点名不为空或者””,边的权值大于0

对于Safety from rep exposure:

变量都由private和final关键字修饰,类中并没有定义set方法,成员变量都不能从类外部获取或者赋值,保证了数组不会外泄。函数返回时创建一个新的对象

测试策略如下:

public String getName(): 返回顶点的名字
public Map<String,Integer> getConnec():返回顶点的边的情况(目标定点,权值)
public void remove(final String target): target顶点和该顶点间之前有边相连 target顶点和该顶点间之前没有边相连
public void put(final String target, final int weight) 为顶点添加新的边
public int getWeight(final String target) 获得这条边的权值,如果这条边与该顶点相连就返回权值,如果边不相连就返回0
public String toString() 返回一个字符串

进行测试:

运行测试全部通过

覆盖率测试如上图所示,覆盖率为100%

  1. Problem 3: Implement generic Graph<L>

将已有的两个 Graph<String>的实现改为Graph<L>的泛型实现。

  1. Make the implementations generic

只需要将原本是String的地方改为L以及加即可

在ConcreteEdgesGraph和ConcreteVerticesGraph都用泛型实现后,重新跑测试

运行测试全部通过

覆盖率测试如上图所示,覆盖率为100%

  1. Implement Graph.empty()

首先选择ConcreteEdgesGraph 作为返回对象实现Graph.empty()函数:

然后进行测试,分别尝试label为long的情况和label为double的情况

进行测试:

运行测试全部通过

覆盖率测试如上图所示,覆盖率为100%

  1. Problem 4: Poetic walks

这个问题一部分是用给的语料生成图,相邻的单词间用一条有向边连接,另一部分是给定一个输入字符串,通过在图中判断它们之间是否有bridge来对字符串进行扩充。

  1. Test GraphPoet

构建文本, 输入一串文字, 如果两个词之间存在一个词, 就会添加到其中,若存在多个, 选择权值最高的. 但需要注意的是, 若两个词之间没有这样的路径(即中间词的sources(起点)不包含第一个词或中间词的targets(终点)不包含第二个词)的话, 则不添加词

测试策略如下:

对于构造函数:

1、传入不存在的文件

2、传入的文件为空

3、传入的语料文件只有一行单词

4、传入具有多行的语料文件

对于poem函数:

1、传入的字符串为null

2、传入的字符串!=null,但只有一个单词

3、传入的字符串!=null,不止一个单词(还可以再设计根据权值选bridge的情形)

对于toString函数:

1、graph为空

2、graph不为空,但没有边

3、graph有顶点有边

  1. Implement GraphPoet

对于变量graph

对于构造函数

关于GraphPoet函数:

将文件输入按行读入,按空格分开,读取每个字符串,调用Graph类建立一个有向带权图。

关于poem函数:

在输入的字符串中添加bridge word,根据Graph类中的source和target函数进行判断,若前者的target和后者的source有重合,读取最大权重的边作为bridgeWord加入。

对于Abstraction function:

将文本文件转化成有向图,图的顶点就是文件中的单词,相邻单词在图中对应的顶点间有有向边

对于Representation invariant:

图中的顶点不为空或者"",边的权值要大于0

对于Safety from rep exposure:

变量都由private和final关键字修饰,类中并没有定义set方法,成员变量都不能从类外部获取或者赋值,保证了数组不会外泄。函数返回时创建一个新的对象

进行测试:

运行测试全部通过

覆盖率测试如上图所示,覆盖率为100%

  1. Graph poetry slam

节选均出自Edgar Allan Poe的Annabel Lee

输入字符串为” angels heaven”,扩充后的结果为” angels in heaven”

进行测试:

运行测试通过

  1. 使用Eclemma检查测试的代码覆盖度

覆盖度都是100%

  1. Before you’re done

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

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

git add *

git commit -u “”

git-push –u origin master

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

  1. Re-implement the Social Network in Lab1

这个任务主要是重新实现 Lab1 中的 Social Network,利用在P1中已经写好的 Graph<L>接口来实现,尽量重用已有的函数。

  1. FriendshipGraph类

成员变量Vertex:

用来保存图中的各顶点。

对于addVertex方法:

使用 Graph<L>里面提供的函数 add,即可实现增加顶点的功能。如果顶点名重复,打印错误信息,程序直接退出。

对于addEdge方法:

利用 Graph<L>里面提供的函数 set,即可实现增加顶点的功能,不过要先判断两个顶点是否相同。如果顶点名重复,打印错误信息,程序直接退出。

对于getDistance方法:

利用BFS算法来求两个顶点之间的最短距离。

  1. Person类

对于Abstraction function:

代表图中顶点

对于Representation invariant:

顶点之间不能有相同的name

对于Safety from rep exposure:

变量都由private和final关键字修饰,只使用了get方法,成员变量都不能从类外部获取或者赋值,保证了数组不会外泄。函数返回时创建一个新的对象

  1. 客户端main()

利用 Lab1 中已有的 main 客户端即可。

  1. 测试用例

测试策略如下:

1.空图的测试

2.仅有顶点的图的测试

3.复杂图的测试

开始测试:

测试全部通过

代码覆盖率为100%

  1. 提交至Git仓库

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

git add *

git commit -u “”

git-push –u origin master

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

哈工大软件构造Lab2相关推荐

  1. (软件构造)2022哈工大软件构造 lab2内容以及心得

    2022年春季学期 计算学部<软件构造>课程 Lab 2实验报告 姓名 艾浩林 学号 120L021917 班号 2003006 电子邮件 2017869860@qq.com 手机号码 1 ...

  2. 哈工大软件构造lab2总结

    目录 1 实验目标概述··· 1 2 实验环境配置··· 1 3 实验过程··· 1 3.1 Poetic Walks· 1 3.1.1 Get the code and prepare Git re ...

  3. 哈工大软件构造Lab2实验

  4. 哈工大软件构造lab2实验报告

    1 实验目标概述 2 实验环境配置 3 实验过程 3.1 Poetic Walks 3.1.1 Get the code and prepare Git repository 3.1.2 Proble ...

  5. 哈工大软件构造期末知识点总结

    哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...

  6. 2022哈工大软件构造lab1小结(知识点)

    哈工大软件构造lab1小结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 问题一 使用的库 异常处理机制 字符串内容检查 写入文件 问题二 problem 3:画一 ...

  7. 哈工大软件构造 复习

    哈工大软件构造试题构成: 1.30分的选择题 2.70分的简答题 2019考试知识点(重要的,但不涵盖全部考试范围): 1.git工具的知识点(没有考察命令行,考察的主要是git的演变及各部分的作用) ...

  8. 哈工大软件构造课程知识点总结(一)

    系列文章目录 哈工大软件构造课程知识点总结(一) 哈工大软件构造课程知识点总结(二) 哈工大软件构造课程知识点总结(三) 哈工大软件构造课程知识点总结(四) 哈工大软件构造课程知识点总结(五) 哈工大 ...

  9. 哈工大软件构造课程知识点总结(二)

    系列文章目录 哈工大软件构造课程知识点总结(一) 哈工大软件构造课程知识点总结(二) 哈工大软件构造课程知识点总结(三) 哈工大软件构造课程知识点总结(四) 哈工大软件构造课程知识点总结(五) 哈工大 ...

最新文章

  1. 武汉工程大学认识实习报告计算机,武汉工程大学化工认识实习报告
  2. 容器 vector :为何要有reserve
  3. linux命令chmod
  4. android uri获取参数,android-无法从深度链接获取Uri数据
  5. 汇编-debug结果正确与执行结果错误
  6. 别再说找不到Python练手项目了,这80个拿去过冬
  7. 抽走超大桌布之后保持桌面物体不掉,需要多快的速度?
  8. react 父子组件之间相互传值
  9. INNODB表快速迁移
  10. MySQL存储过程-2019/7/18
  11. 快速掌握 JavaScript 库必备的 5 大技巧!
  12. 判刑不应区分未成年、精神病
  13. ubuntu创建“新建文本文档”的快捷方式
  14. 我的世界服务器水流动配置文件,我的世界后台的水流动命令是什么
  15. threejs中几种挖洞方式
  16. cf Educational Codeforces Round 49 D. Mouse Hunt
  17. 我父亲给我姐姐带来了一台计算机英语,写我的家人的作文400字
  18. 小红书主页爬取_小红书数据爬取教程
  19. 大数据技术闲侃之岗位选择解惑
  20. termux安装配置

热门文章

  1. 【1错笔记】psd面试——最长回文子序列 动态规划(2000字超详细解题)
  2. 晚上几点睡觉算熬夜?没有睡够,“白天补觉”有效果?终于知道了
  3. BUUCTF not_the_same_3dsctf_2016
  4. JavaScript实现令人放松的小游戏_艾孜尔江撰
  5. 搭建网校教育系统平台的四种方式
  6. Kafka(二):生产者
  7. 林纳斯·托瓦兹和Linux行为准则:揭穿7个谬论
  8. 普通青年、文艺青年、2B青年---最近老火了
  9. [转载] 七龙珠第一部——第036话 恐怖的玛斯鲁塔
  10. R3空间曲线坐标系变换及向量分析