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类:

  1.  属性有source, target, weight,注意Edge不可变,只有Getter,分别是getSource, getTarget. getWeight。
    
  2.  Edge函数初始化Edge的三个成员变量。
    
  3.  checkRep函数在Getter返回前,检查三个成员变量是否有空。
    
  4.  toString函数以字符串的形式展示该边的起点、终点和边权。
    

再实现ConcreteEdgesGraph类:

  1.  上实现保存图中所有顶点和所有边。
    
  2.  函数checkRep在每个函数返回前检查成员变量。
    
  3.  函数add使用HashSet的add方法,向vertices集合中添加点,返回前调用checkRep检查。
    
  4.  函数set向edges集合中添加边。weight大于零,判断source和target是否在图中,不在则添加,不存在该边则添加,若存在在则更新权重。weight为零,判断该边是否存在,若存在,则删除,返回0。
    
  5.  函数remove调用HashSet的remove方法实现删除该点,删除以该点为起点或者终点的边。
    
  6.  函数vertices返回封装后的vertices。
    
  7.  函数sources在edges中遍历,在target存在且weight不为0的情况下,返回该点的起点的集合。
    
  8.  函数targets在edges中遍历,在source存在且weight不为0的情况下,返回该点的终点的集合。
    
  9.  函数toString输出所有的边。
    

3.1.3.2 Implement ConcreteVerticesGraph

先设计Vertex类:

  1.  属性有存储源节点的source和存储边的终结点和权值的HashMap类型的edge中,有两个Getter,getSource和getEdge。
    
  2.  在constructor中初始化source。
    
  3.  函数checkRep判断源节点是否为空,权值是否大于零。
    
  4.  函数update更新结点。
    
  5.  函数newEdge新建边。
    
  6.  函数toString显式边和权重。
    

再设计ConcreteVerticesGraph类:

  1.  上实现保存所有的结点。
    
  2.  函数checkRep检查是否有重复元素。
    
  3.  函数add实现加点,通过遍历vertices,若点不存在则加入,若存在则返回false。
    
  4.  函数set实现在集合中找到两点,添加边。权重大于零,判断source和target是否在图中,不在则加入。查看边是否在图中,在则update权重,不在则新建边。权重为零,判断该边是否存在,存在则删除,不存在返回零。
    
  5.  函数remove删除该点和该点相关的边。若不包含该结点则返回false。遍历vertices,如果存在就删除。
    
  6.  函数vertices返回vertices,注意不要直接返回。
    
  7.  函数sources遍历vertices,若终结点存在且权重不为零,将source和weight存入一个HashMap中,最后返回。
    
  8.  函数targets遍历vertices,若源节点存在且权重不为零,将target和weight存入一个HashMap中,最后返回。
    
  9.  函数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函数:

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

关于poem函数:

  1. 在输入的字符串中添加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仓库:

  1. git add *
    
  2. git commit -u “”
    
  3. 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仓库:

  1. git add *
    
  2. git commit -u “”
    
  3. git push -u origin master
    

项目的目录结构树状示意图:

3.3 Playing Chess

3.3.1 ADT设计/实现方案







3.3.2 主程序MyChessAndGoGame设计/实现方案


3.3.3 ADT和主程序的测试方案





HIT软件构造lab2报告相关推荐

  1. HIT 软件构造 lab2实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 学号 1180300223 班号 1803002 目录 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3 ...

  2. HIT 软件构造LAB2

    2022年春季学期 计算学部<软件构造>课程 Lab 2实验报告 姓名 薄文 学号 120L020513 班号 2003004 电子邮件 604094538@qq.com 手机号码 181 ...

  3. HIT 软件构造 lab2

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

  4. 关于hit软件构造lab2实验后回顾

    1 实验目标概述 本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象编程(OOP)技术实现ADT.具体来说:  针对给定的应用问题,从问题描述中识别所需的ADT:  设计ADT规 ...

  5. HIT软件构造lab2

    实验目标概述 根据实验手册简要撰写.本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象 编程(OOP)技术实现 ADT.具体来说:针对给定的应用问题,从问题描述中识别所需的 ADT: ...

  6. 软件构造lab2 - 实验报告

    软件构造lab2 - 实验报告 1.实验目标概述 2.环境配置 3.实验过程 3.1Poetic Walks 3.1.1Get the code and prepare Git repository ...

  7. HIT软件构造Lab1--过程分析

    HIT 软件构造Lab1–过程分析 由于实验中要求代码必须是个人完成,所以这里仅提供方法和部分代码. 文章目录 HIT 软件构造Lab1--过程分析 1 实验目标概述 2 实验环境配置 3.1 Mag ...

  8. HIT 软件构造 lab3实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 赵旭东 学号 1180300223 班号 1803002 电子邮件 1264887178@qq.com 手机号码 ...

  9. 哈工大2020软件构造Lab2实验报告

    本项目于3.17日实验课验收,请放心参考 参考时文中有给出一些建议,请查看 基本更新完成 2020春计算机学院<软件构造>课程Lab2实验报告 Software Construction ...

最新文章

  1. 用php获取本周,上周,本月,上月,本季度日期的代码
  2. 网站建设案例欣赏_网站制作设计案例_成都辰星建站
  3. 【数字智能三篇】之一: 一页纸说清楚“什么是大数据”
  4. 一个略显复杂的transformation算子_distinct
  5. 博物馆守卫问题(世界名画展览馆)
  6. 神奇的国度(HYSBZ-1006)
  7. IaaS、PaaS、SaaS
  8. Tensorflow图像编码处理
  9. 遊戲是這樣寫成的 (第三篇: 簡單的遊戲框架)
  10. mysql 存储过程
  11. 2020年全国大学生数学建模B题题目概要
  12. 率辉c语言,C语言真题
  13. Java中NIO详解
  14. matlab怎么新建文件运行不了,关于:Matlab中直接双击fig文件运行出错,而从.m文件运行却不会出错问题的一点心得...
  15. 服务器数据库文件恢复,数据库数据恢复
  16. c语言 源文件未编译,源文件未编译什么意思
  17. 大数据技术之_13_Azkaban学习_Azkaban(阿兹卡班)介绍 + Azkaban 安装部署 + Azkaban 实战...
  18. android 清除通知栏,android startForeground去除通知栏
  19. Python 爬取迷你MP4电影网,电影名称保存到本地,Requests+lxml框架
  20. Lync 客户端:无法登陆到Lync,验证服务器中的证书时遇到问题

热门文章

  1. 淘宝网商品SKU系统设计经验分享
  2. Linux内核Adaptive-RED实现
  3. Centos7 Docker无法重启
  4. 电脑移动热点无法开启,一直显示正在断开;没有要共享的网络连接,但你的Internet仍打开
  5. 前端学习案例-初识docker
  6. 计算机高国家线50分调剂,这些考生注意,即使初试分数再高,超过国家线,也只能调剂读研!...
  7. 如何在SOLIDWORKS中实现装配体缩放
  8. Mac导出微信聊天记录到world
  9. Scala错误:找不到或无法加载主类 xxx解决方法
  10. 六十星系之44天梁独坐巳亥