HIT软件构造Lab2

1 实验目标概述

        首先,需要明确给定的应用问题是什么,以及在这个问题背景下需要设计的抽象数据类型 (ADT)。然后,按照以下步骤进行: 首先,根据给定的应用问题描述,确定解决问题所需的数据类型。 设计ADT的规约,包括确定前置条件(pre-condition)和后置条件(post-condition),以 确保ADT的行为可预测和可靠。 根据ADT规约设计一系列测试用例,覆盖各种情况,包括边界情况和一般情况。 如果需要,考虑将ADT设计成泛型的,以提高适用性。 为ADT设计多种不同的实现,对每种实现设计其表示(representation)、表示不变性(rep invariant)和抽象过程(abstraction function)。 使用面向对象编程技术实现ADT,确保遵循ADT规约,避免表示不变性的违反和表示泄 露。 完成实现后,运行设计的测试用例,并评估测试的覆盖度,确保实现的正确性和健壮 性。 利用已实现的ADT解决给定的应用问题。 在测试代码中编写testing strategy,并根据策略设计测试用例,以确保覆盖各种情况。 这个过程可能需要多次迭代和调整,以确保ADT的设计和实现是正确和高效的。

2 实验环境配置

如Lab1配置即可

 GitHub Lab2 仓库的URL地址(HIT-Lab2-2022113596): https://github.com/ComputerScienceHIT/HIT-Lab2-2022113596.git

3 实验过程

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

3.1 Poetic Walks

        本次实验给出了一个图接口,要求我们建立一个边图类、一个点图类分别继 承自这个图接口,并且在里面实现一系列方法,并且实现抽象数据型,并用这个 图的抽象数据型完成poet的工作。主要目的是练习ADT的规约设计和ADT的 实现。

3.1.1 Get the code and prepare Git repository

        当你下载了代码并解压后,你会发现其中没有.git 文件夹,这表示该目录还 不是一个git仓库。你需要在这个目录中创建一个.git文件夹,这样才能进行版本 控制。首先,你需要在文件夹中创建一个名为P1的包(package),以便将代码组 织成逻辑单元。然后,你可以通过命令行进入该目录,并使用git init命令初始化 本地仓库。接下来,你可以使用git的各种指令来进行仓库管理。 Problem 1: Test Graph <String>

        使用静态方法的测试策略在文件GrapStaticTest.java中进行测试,主要是测 试函数Graph.empty()。由于该方法是静态的,因此只有一个实现,我们只需要 运行这些测试一次。代码中原本提供了相应的测试,这里我们先保持原样。 

3.1.2 Problem 2: Implement Graph

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

3.1.2.1 Implement ConcreteEdgesGraph

首先先写Edge类:

Edge: 初始化构造方法,初始化新边的两个点和边的权值

checkRep: 检查表示不变性,边不为空且权值大于等于0

getSource: 返回边的一个点source

getTarget: 返回边的另外点target

getWeight: 返回边的weight

toString: 返回一条边的字符串,形式为“起点->终点权重为xx”

AF,RI和 rep:

然后写ConcreteEdgesGraph 类:

Implement ConcreteVerticesGraph

checkRep: 检查表示不变性,edges长度是大于0的实数,有起始的节点

Add: 顶点不为空时,添加一个顶点进入点表中

Set: 输入source,target,weight,分别为边的起点、终点和权值。若权值为负,返回-1。若权值 为正且新边已经存在,则除去原边并添加新边。若权值为正且新边不存在,则直接添加新边。 若权值为0且新边已经存在,则出去原边。只要改变了原边权值,都返回原边权值,没有权 值则返回0

Remove: 除去某个点及与它相邻的所有边。只需要遍历edges,寻找是否有边的起点或者终点为该点, 直接删去即可,使用迭代器实现。

Vertices: 返回所有的点集 Sources: 输入一个终点,返回与它相连的所有边和起点构成的Map Targets: 输入一个起点,返回与它相连的所有边和终点构成为的Map toString: 将整个图中所有点的指向转化为一条字符串输出

AF,RI和 rep:

测试结果:

代码覆盖度:

3.1.3 Problem 3: Implement generic Graph<L>

3.1.3.1 Make the implementations generic

将代码中相关的String关键字替换为泛型<L>即可 即为:

3.1.3.2 Implement Graph.empty()

3.1.4 Problem 4: Poetic walks

3.1.4.1 Test GraphPoet

语料库文件配置为:new File(“src/P1/poet/test.txt”)

文本为: four years for four years for six years I have studied English for six years.

测试结果:

3.1.4.2 Implement GraphPoet

实现GraphPoet主要是实现Constructor和Poem两个函数。

1、对于GraphPoet的构造器 将文件中的诗歌按照行读入,利用空格将其分开,去掉空的字符串,在任何相邻的两个中间 加入一条边,并按照边出现的数量更新权值建图即可。

2、对于poem函数 主要利用已有的诗歌生成的图,在输入的input字符串中增加bridge word。根据Graph 已有的target和source函数进行判断,前面的词的target和后面的词的source如果有重合的 词,从中读取最大权值的一边作为bridge word加入即可。

Graph poetry slam

3.1.5 使用 Eclemma/Code Coverage for Java 检查测试的代码覆盖度

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

这次实验要求使用Poetic Walks中定义的Graph及其两种实现之一,来实现Lab1中 Social Network 中的各种功能。为了尽可能地复用 ConcreteEdgesGraph中已经实现的方 法,需要将这些方法结合到Social Network的功能中。然后,需要确保提供的main()函数可 以正常运行,并执行Lab1中的Junit测试用例,确保一切正常工作。

3.2.1 FriendshipGraph 类

首先,加点的话,用已有的add方法来加上Person类型的元素,然后 再用个集合存起来,避免加重名字的人。加边的话借用set方法,把权值设 成1,形成个不带权的边。这个方法还会告诉上一次边的权值,这样就能知 道这条边是不是之前就有了。至于算距离用队列实现,就是之前Lab1里那 一套,不过得稍微调整一下结构。

3.2.2 Person 类

给出name和其朋友圈

然后对其进行重写和getter提供: 如果已经存在则不添加,否则添加进入

3.2.3 客户端main()

与Lab1有异曲同工之妙

3.2.4 测试用例

分别对getDistance,addEdge,addVertex 和 getAllpeople 进行测试:

3.2.5 提交至Git仓库 同Lab1

  • 32
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值