HIT软件构造lab2总结

在这里插入图片描述
2022年春季学期
计算学部《软件构造》课程

1 实验目标概述

本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说:

  1. 针对给定的应用问题,从问题描述中识别所需的ADT;
  2. 设计ADT规约(pre-condition、post-condition)并评估规约的质量;
  3. 根据ADT的规约设计测试用例;
  4. ADT的泛型化;
  5. 根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
  6. 使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
  7. 测试ADT的实现并评估测试的覆盖度;
  8. 使用ADT及其实现,为应用问题开发程序;
  9. 在测试代码中,能够写出testing strategy并据此设计测试用例。

2 实验环境配置

简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
Git init
Git remote add origin +“地址”
Git pull origin master
Git add .
Git commit -m “ 注释”
Git push origin master

在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
https://github.com/ComputerScienceHIT/HIT-Lab2-120L020713.git

3 实验过程

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

3.1 Poetic Walks

利用ADT和OOP,在两个类中实现Graph和其相应的功能。

3.1.1 Get the code and prepare Git repository

在对应的文件夹中打开git bash here
运用命令git clone 将对应的git仓库的文件克隆到当前文件夹。之后运用命令git init创建初始库,之后git add将文件加入本地git库,再用git commit -m “init”标注为初始文件,再使用git push origin master命令将文件传到自己的远程仓库上。

3.1.2 Problem 1: Test Graph

以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
若要测试我们要在Graph的empty中返回一个新的ConcreteEdgesGraph
在这里插入图片描述
同时也要在ConcreteEdgesGraph返回vertices
在这里插入图片描述
测试结果如下:
在这里插入图片描述

3.1.3 Problem 2: Implement Graph

以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。

3.1.3.1 Implement ConcreteEdgesGraph

首先我们先对Edge类进行填充
构造一个有向边我们需要最基本的三个元素,起点,终点以及边的权值。所以我们构造如下:
在这里插入图片描述
同理我们的Edge的constructor类似
在这里插入图片描述
对于一个有向边来说,源点与重点都不能是null并且边的权值要大于0
在这里插入图片描述
接下来我们来看一下ConcreteEdgesGraph类
对于ConcreteEdgesGraph来说的话edge是不可以重复的
在这里插入图片描述
在添加的过程中后检验
在这里插入图片描述
接下来我们看一下比较关键的set方法
首先设置标志位,用于判断边是否被删除,接着对现有的边集进行遍历考虑首尾相连的情况,然后判断起点和重点是否存在,大致分成以下几种情况:

  1. 若输入的点和边存在且输入的权值为0, 则需要删除该边并返回之前边的权值
  2. 若输入的点和边存在且输入的权值为正数, 则需要更新这条边的权值并返回之前边的权值
  3. 若输入的点存在边不存在且输入的权值为正数, 则需要加边并返回0
  4. 若输入的点不存在且输入的权值为正数, 则需要加点加边并返回0
    在这里插入图片描述
    然后我们来看一下测试用例的实现情况,这里面重点说一下set测试和remove测试
    在这里插入图片描述
    首先我们先来说一下set测试,对于set的测试我们就点的情况可以分成三种,分别是两个点都存在、其中一个点不存在和两个点都不存在。对于边的情况我们可以分成两种,分别是边存在和边不存在。对于边的权值我们也可以分成两种分别是权值正和权值为0。总体来看一共存在12种情况,但是符合事实的情况只有7种。(具体的情况见程序种的Testing Strategy)
    接下来我们来看一下remove测试,有以下几种情况,点是否在图中和是否存在相邻的边。
    总体来看一共有4种情况,但是成立的情况只有三种。(具体的情况见程序种的Testing Strategy)
    覆盖率如下图所示:
    在这里插入图片描述
3.1.3.2 Implement ConcreteVerticesGraph

首先我们先来观察一下Vertex类
这类的实现方法与Edge大致相同。如果想要用vertex来实现图, 那么Map类型来存放与该点连接的点以及对应边对应的权值, 所以需要记录的参数不仅有点的标签, 还需要有以该点为终点的边的起点及边的权值映射sourceset, 以及以该点为起点的边的终点及边的权值映射targetset。
在这里插入图片描述
接下来我们来看一下ConcreteVerticesGraph类
在这里插入图片描述
这个类的操作与ConcreteEdgesGraph类也是大同小异的,具体的实现逻辑也是大致相同的。然后我们看一下测试用例的情况
在这里插入图片描述
然后我们观察一下函数的覆盖率
在这里插入图片描述

3.1.4 Problem 3: Implement generic Graph

3.1.4.1 Make the implementations generic

按照题目要求将String改成后
两个程序的测试样例如下图所示
在这里插入图片描述
在这里插入图片描述

3.1.4.2 Implement Graph.empty()

在这里插入图片描述

3.1.5 Problem 4: Poetic walks

3.1.5.1 Test GraphPoet

在这里插入图片描述
分别采用不同的方法对程序进行测试,还有对toString的测试
在这里插入图片描述

3.1.5.2 Implement GraphPoet

该程序要有以下的功能:

  1. 读取.txt文件中的所有单词,并且可以做到将相邻的点添加到图中,这些边每次出现一次权值就加一
  2. 然后测试图是否合法
  3. 接下来对字符串进行扩充:首先要遍历给定文本的左右的单词,对于每一个单词,我们要找出该点所指向的终点集中权值最大的元素,将其添加在原来的两个单词之间。遍历结束后,返回扩充后的字符串。
  4. 然后进行单元测试进行验证
    测试结果如下:
    在这里插入图片描述
    覆盖率如下所示:
    在这里插入图片描述
3.1.5.3 Graph poetry slam

在这里插入图片描述
我引用了飞鸟集的一个开头,程序实际的运行结果如下所示
在这里插入图片描述

3.1.6 Before you’re done

请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
在这里给出你的项目的目录结构树状示意图。

3.2 Re-implement the Social Network in Lab1

ADT的复用

3.2.1 FriendshipGraph类

GetDistance采用队列做BFS,不同点为此处visited用set标记,将访问过的顶点全部添加至visited中,每次队首的熟人用targets方法与keyset方法获得
在这里插入图片描述

3.2.2 Person类

该类的目标就是得到一个person变量但是做到输入的人名不重复
在这里插入图片描述

3.2.3 客户端main()

在这里插入图片描述

3.2.4 测试用例

就是将一个自己收回的图放入进行测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.5 提交至Git仓库

如何通过Git提交当前版本到GitHub上你的Lab2仓库。
在这里给出你的项目的目录结构树状示意图。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值