HIT软件构造lab2报告
1. 实验目标概述
本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象 编程(OOP)技术实现 ADT。具体来说:
l 针对给定的应用问题,从问题描述中识别所需的 ADT;
l 设计 ADT 规约(pre-condition、post-condition)并评估规约的质量;
l 根据 ADT 的规约设计测试用例;
l ADT 的泛型化;
l 根据规约设计 ADT 的多种不同的实现;针对每种实现,设计其表示 (representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
l 使用 OOP 实现 ADT,并判定表示不变性是否违反、各实现是否存在表 示泄露(rep exposure);
l 测试 ADT 的实现并评估测试的覆盖度;
l 使用 ADT 及其实现,为应用问题开发程序;
l 在测试代码中,能够写出 testing strategy 并据此设计测试用例。
2. 实验环境配置
安装配置EclEmma:
/参考https://www.eclemma.org/installation.html中Option2/
打开Eclipse,Help->Install New Software,在Work with中add http://update.eclemma.org/,检查最新的EclEmma的版本,Next,遵循安装向导完成安装。
3. 实验过程
3.1 Poetic Walks
需要构造一个Graph,实现或完善规约要求的内容。以边和点两种方式实现接口,需要将String拓展为泛型L。实现ConcretEdgesGrap和ConcreteVertexGraph中接口中定义的各个函数。问题四中,根据文件输入,如果相邻两个词之间构成一条有向边,从而构成一棵树,再输入给定的句子,若相邻两个词之间有一个词,则插入,有多个,则选取边权重较大者。
3.1.1 Get the code and prepare Git repository
在git bash中输入命令:
git clone https://github.com/rainywang/Spring2020_HITCS_SC_Lab2.git
3.1.2 Problem 1: Test Graph
将Graph empty()方法修改为
测试结果:
3.1.3 Problem 2: Implement Graph
3.1.3.1 Implement ConcreteEdgesGraph
先写Edge类:
属性有source, target, weight,注意Edge不可变,只有Getter,分别是getSource, getTarget. getWeight。
Edge函数初始化Edge的三个成员变量。
checkRep函数在Getter返回前,检查三个成员变量是否有空。
toString函数以字符串的形式展示该边的起点、终点和边权。
再实现ConcreteEdgesGraph类:
上实现保存图中所有顶点和所有边。
函数checkRep在每个函数返回前检查成员变量。
函数add使用HashSet的add方法,向vertices集合中添加点,返回前调用checkRep检查。
函数set向edges集合中添加边。weight大于零,判断source和target是否在图中,不在则添加,不存在该边则添加,若存在在则更新权重。weight为零,判断该边是否存在,若存在,则删除,返回0。
函数remove调用HashSet的remove方法实现删除该点,删除以该点为起点或者终点的边。
函数vertices返回封装后的vertices。
函数sources在edges中遍历,在target存在且weight不为0的情况下,返回该点的起点的集合。
函数targets在edges中遍历,在source存在且weight不为0的情况下,返回该点的终点的集合。
函数toString输出所有的边。
3.1.3.2 Implement ConcreteVerticesGraph
先设计Vertex类:
属性有存储源节点的source和存储边的终结点和权值的HashMap类型的edge中,有两个Getter,getSource和getEdge。
在constructor中初始化source。
函数checkRep判断源节点是否为空,权值是否大于零。
函数update更新结点。
函数newEdge新建边。
函数toString显式边和权重。
再设计ConcreteVerticesGraph类:
上实现保存所有的结点。
函数checkRep检查是否有重复元素。
函数add实现加点,通过遍历vertices,若点不存在则加入,若存在则返回false。
函数set实现在集合中找到两点,添加边。权重大于零,判断source和target是否在图中,不在则加入。查看边是否在图中,在则update权重,不在则新建边。权重为零,判断该边是否存在,存在则删除,不存在返回零。
函数remove删除该点和该点相关的边。若不包含该结点则返回false。遍历vertices,如果存在就删除。
函数vertices返回vertices,注意不要直接返回。
函数sources遍历vertices,若终结点存在且权重不为零,将source和weight存入一个HashMap中,最后返回。
函数targets遍历vertices,若源节点存在且权重不为零,将target和weight存入一个HashMap中,最后返回。
函数toString显式结点,边,权重。
3.1.4 Problem 3: Implement generic Graph
3.1.4.1 Make the implementations generic
将基于Graph的实现改为基于Graph的实现即可。
3.1.4.2 Implement Graph.empty()
可以选择ConcreteEdgesGraph作为emptyGraph的实现,返回一个新的ConcreteEdgesGraph<>。
3.1.5 Problem 4: Poetic walks
3.1.5.1 Test GraphPoet
利用提供的例子对函数进行测试。
3.1.5.2 Implement GraphPoet
关于GraphPoet函数:
将文件输入按行读入,按空格分开,读取每个字符串,调用Graph类建立一个有向带权图。
关于poem函数:
在输入的字符串中添加bridge word,根据Graph类中的source和target函数进行判断,若前者的target和后者的source有重合,读取最大权重的边作为bridgeWord加入。
3.1.5.3 Graph poetry slam
采用的测试用例是:
输出结果:
3.1.6 Before you’re done
通过Git提交当前版本到GitHub上你的Lab2仓库:
git add *
git commit -u “”
git push -u origin master
项目的目录结构树状示意图:
3.2 Re-implement the Social Network in Lab1
利用P1中ConcreteEdgesGraph或者ConcreteVerticesGraph类实现FriendshipGraph,以及 addVertex,addEdge和getDistance三个接口。
3.2.1 FriendshipGraph类
addVertex检查人是否存在,不存在则通过调用graph的add方法添加。addEdge通过调用graph的set方法加入边。getDistance检查两个person是否存在,若存在使用BFS算法求两人间的最短距离。
3.2.2 Person类
先定义一个String类型的变量name来存储人名,通过构造函数初始化变量。另定义一个getter来获取人名。equals方法用来判断人名是否相等。
3.2.3 客户端main()
利用实验一的例子:
3.2.4 测试用例
同利用实验一,首先定义一个FriendshipGraph类型的graph然后定义四个Person类型的人,然后调用graph的addVertex方法来将四个人加入graph,然后再调用graph的addEdge来将好友关系图加入graph,最后调用getDistance方法来求出所测试的人之间的距离。
3.2.5 提交至Git仓库
通过Git提交当前版本到GitHub上你的Lab2仓库:
git add *
git commit -u “”
git push -u origin master
项目的目录结构树状示意图:
3.3 Playing Chess
3.3.1 ADT设计/实现方案
3.3.2 主程序MyChessAndGoGame设计/实现方案
3.3.3 ADT和主程序的测试方案
HIT软件构造lab2报告相关推荐
- HIT 软件构造 lab2实验报告
2020年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 学号 1180300223 班号 1803002 目录 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3 ...
- HIT 软件构造LAB2
2022年春季学期 计算学部<软件构造>课程 Lab 2实验报告 姓名 薄文 学号 120L020513 班号 2003004 电子邮件 604094538@qq.com 手机号码 181 ...
- HIT 软件构造 lab2
1 实验目标概述··· 1 2 实验环境配置··· 1 3 实验过程··· 1 3.1 Poetic Walks· 1 3.1.1 Get the code and prepare Git repos ...
- 关于hit软件构造lab2实验后回顾
1 实验目标概述 本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象编程(OOP)技术实现ADT.具体来说: 针对给定的应用问题,从问题描述中识别所需的ADT: 设计ADT规 ...
- HIT软件构造lab2
实验目标概述 根据实验手册简要撰写.本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象 编程(OOP)技术实现 ADT.具体来说:针对给定的应用问题,从问题描述中识别所需的 ADT: ...
- 软件构造lab2 - 实验报告
软件构造lab2 - 实验报告 1.实验目标概述 2.环境配置 3.实验过程 3.1Poetic Walks 3.1.1Get the code and prepare Git repository ...
- HIT软件构造Lab1--过程分析
HIT 软件构造Lab1–过程分析 由于实验中要求代码必须是个人完成,所以这里仅提供方法和部分代码. 文章目录 HIT 软件构造Lab1--过程分析 1 实验目标概述 2 实验环境配置 3.1 Mag ...
- HIT 软件构造 lab3实验报告
2020年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 赵旭东 学号 1180300223 班号 1803002 电子邮件 1264887178@qq.com 手机号码 ...
- 哈工大2020软件构造Lab2实验报告
本项目于3.17日实验课验收,请放心参考 参考时文中有给出一些建议,请查看 基本更新完成 2020春计算机学院<软件构造>课程Lab2实验报告 Software Construction ...
最新文章
- 用php获取本周,上周,本月,上月,本季度日期的代码
- 网站建设案例欣赏_网站制作设计案例_成都辰星建站
- 【数字智能三篇】之一: 一页纸说清楚“什么是大数据”
- 一个略显复杂的transformation算子_distinct
- 博物馆守卫问题(世界名画展览馆)
- 神奇的国度(HYSBZ-1006)
- IaaS、PaaS、SaaS
- Tensorflow图像编码处理
- 遊戲是這樣寫成的 (第三篇: 簡單的遊戲框架)
- mysql 存储过程
- 2020年全国大学生数学建模B题题目概要
- 率辉c语言,C语言真题
- Java中NIO详解
- matlab怎么新建文件运行不了,关于:Matlab中直接双击fig文件运行出错,而从.m文件运行却不会出错问题的一点心得...
- 服务器数据库文件恢复,数据库数据恢复
- c语言 源文件未编译,源文件未编译什么意思
- 大数据技术之_13_Azkaban学习_Azkaban(阿兹卡班)介绍 + Azkaban 安装部署 + Azkaban 实战...
- android 清除通知栏,android startForeground去除通知栏
- Python 爬取迷你MP4电影网,电影名称保存到本地,Requests+lxml框架
- Lync 客户端:无法登陆到Lync,验证服务器中的证书时遇到问题