哈工大软件构造-第二次实验_1 心得

这是这个账号第一次写博客,来自小白的颤抖。
由于在校登记的博客地址是这个,so,为了我的成绩着想,只能乖乖的从新写辣,希望各位不要嫌弃,留下宝贵的意见。
ps:这是圣马家沟的软件构造实验课的要求,小白在该课程的之前也没有学习过java,只能一边摸索一边写实验(那过程真的是十分痛苦),好在结果还是让人满意的。即便做的很糟糕,但是七七七八八八满足了学校老师布置的任务hhh
这章博客写的是有关第二次实验第一部分的实验报告,由于小弟在做实验的时候自认为把其中的实现过程写的比较完善,所以决定直接ctrl+v辣hhh

3.1 Poetic Walks

这次试验主要是考查我们对ADT的设计、规约、测试,并用OOP去实现。
根据自己设计的泛型实例去完成该任务。

基本任务如下:构造一个Graph,对给定的接口Graph,完成他的两个实例类ConcretVerticesGraph和ConcreateEgdesGraph。
因为我提前对整个实验有一个预习,所以我第一开始就通过泛型实现。
实现spec的基本功能并且以边和点两种方法去实现接口。编写测试文件要有良好的测试覆盖率。

3.1.1 Get the code and prepare G,it repository

在git bash中使用pull和clone的命令下载到本地。
按照老师实验报告模板中的项目目录放入相应的位置,refresh加上简单的修改一下包即可。
git初始化:

Git init

Git remote add origin git@github.com:ComputerScienceHIT/Lab2-1180300113.git

Git pull origin master

Git add .

Git commit -m “xxx”

Git push origin master

3.1.2 Problem 1: Test Graph

以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
我选择先实现ConcreteEdgesGraph。
测试add,set,remove,vertices,source,target
测试策略:
在这里插入图片描述

有关add:在这里插入图片描述

有关set:在这里插入图片描述

有关remove
在这里插入图片描述

有关getsource和gettarget:
在这里插入图片描述

因为测试类是抽象的没有办法直接运行,但是可以有两个测试子类进行测试,之后这些函数再子类中不再重复说明。

3.1.3 Problem 2: Implement Graph

3.1.3.1 ConcreEdgeGraph

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

3.1.3.1Edge类

设计思想:edge类是变得类,其中包含两个端点和边的权重。
除了要有不可见性保护,还设置额不变量的保护方法。
在这里插入图片描述
域:
在这里插入图片描述
Getter:
在这里插入图片描述
以及checkrep检测:
在这里插入图片描述
hashcode和equals都是利用eclipse自身生成方法。
构造器:
在这里插入图片描述
toString: 以字符串的形式直观地展示该边的起点、终点和边权,格式为:
source->target [weight]
在这里插入图片描述

3.1.3.1.2ConcreEdgesGraph

在这里插入图片描述

域:
在这里插入图片描述
Function:
在这里插入图片描述
Chekrep: 在这里插入图片描述
@Override public boolean add(String vertex)
(1)点存在:返回false
(2)不存在:调用list.add向vertices中添加该点
@Override public int set(String source, String target, int weight)
遍历edges:
(1)如果已经存在从source到target的一条边,记下这条边的权值,创建一条新的边(参数为source,target,weight),调用Collections.replaceAll替换掉edges中的旧边,返回旧边权;
(2)如果不存在,新建一条边(参数为source,target,weight),将其加入edges,返回0。
@Override public boolean remove(L vertex)
调用set.contains判断图中是否存在该顶点:(1)如果不存在,返回false;
否则,遍历edges,删除起点或终点是该顶点的边,遍历结束后调用list.remove从vertices中删除该顶点。
@Override public Set vertices()
copy一份vertices到新Set中,返回这个Set
@Override public Map<L, Integer> sources(L target)
建立一个空Map,遍历edges,找出以target为终点的边edge;
weight=0时表示该边不存在,跳过;
将edge.source->edge.weight加入Map,遍历结束后返回这个Map
@Override public Map<L, Integer> targets(L source)
建立一个空Map,遍历edges,找出以source为起点的边edge;
weight=0时表示该边不存在,跳过;
将edge.source->edge.weight加入Map,遍历结束后返回这个Map
@Override public String toString()
将所有边的toString连接在一起

3.1.3.1.3.test

图的部分功能都利用上一次的测试测试成功,我们只需要针对edge进行部分测试补充即可。
在这里插入图片描述

测试结果如下:
在这里插入图片描述
覆盖率:
在这里插入图片描述

3.1.3.2 ConcreverticesGraph

3.1.3.2.1 Vertex类

设计思想:vertex是点的类,其中应该包含的字段由这个点的名字,指向这个点的权重和这个点指向的点的权重的地图
除了不可见性保护策略,还涉及可不变量保护方法
域:
在这里插入图片描述
全部函数如下,之后在进行分析:
在这里插入图片描述

Constructor:
在这里插入图片描述
Function:
@Override public String toString()
以字符串的形式直观地展示有哪些边以当前点为终点\起点,格式为:{[source,weight], …}->{[target,weight], .
在这里插入图片描述
其他的包括getter的函数:
在这里插入图片描述

getter 其中包括name,source,target的getter
以及checkrep检测:
在这里插入图片描述

3.1.3.2.2 Concrevertices类

域:
在这里插入图片描述
Constructor:
在这里插入图片描述
函数如下:
在这里插入图片描述
含义如下:
@Override public boolean add(L vertex)
遍历vertices:
如果存在标签相同的顶点,返回false;
否则,创建新顶点(参数vertex),调用list.add加入vertices
@Override public int set(L source, L target, int weight)
(1)先调用add加入两个顶点;
(2)首先遍历vertices,找到标签与source相等的顶点vertex,然后遍历该顶点的vertex.target,找到标签与target相等的顶点,获取对应的边权,然后更新边权为weight,返回旧边权;
(3)在(2)中如果没有找到标签与target相等的顶点,则遍历vertices进行寻找,如果找到了,建立target->weight的映射并加入vertex.target,返回0。
@Override public boolean remove(L vertex)
首先遍历vertices,寻找是否存在标签与vertex相等的顶点,如果没有,就返回false;
如果找到了,判断该顶点的source和target是否为空,不为空的进行遍历,从另一个边的target/source中删除该顶点对应的映射。
@Override public Set vertices()
copy一份vertices到新Set中,返回这个Set
@Override public Map<L, Integer> sources(L target)
建立一个空Map,遍历vertices,如果某个vertex其vertex.target不为空并且包含了target,就建立vertex->vertex.weight的映射并加入Map;
weight=0时表示该边不存在,跳过;
遍历结束后返回Map
@Override public Map<L, Integer> targets(L source)
建立一个空Map,遍历vertices,如果某个vertex其vertex.source不为空并且包含了source,就建立vertex->vertex.weight的映射并加入Map;
weight=0时表示该边不存在,跳过;
遍历结束后返回Map
@Override public String toString()
将所有点的toString连接在一起
以及checkrep具体实现:
在这里插入图片描述

3.1.3.3 Test

测试策略:因为上面已经对基础的图实现各个方法进行了成功测试,如下只需要对有关点的功能进行测试即可。

在这里插入图片描述
在这里插入图片描述
测试结果如下:
在这里插入图片描述
代码覆盖率:
在这里插入图片描述

3.1.4 Problem 3: Implement generic Graph

利用L泛型实现上述功能

3.1.4.1 Make the implementations generic

在这里插入图片描述
有关泛型测试的test
测试结果如下:
在这里插入图片描述
我选择了char以及int进行测试:测试代码如下
在这里插入图片描述
在这里插入图片描述

3.1.4.2 Implement Graph.empty()

在这里插入图片描述
这里我选择边作为具体实现。

在这里插入图片描述

3.1.5 Problem 4: Poetic walks

这个任务主要是要求利用之前实现的图结构,完成利用已经存在的诗句对一个新的句子进行扩充的任务。

3.1.5.1 Test GraphPoet

在这里插入图片描述
按着这个方法测试,我就只写了大体层面,细化没有测试。
测试结果如下:
在这里插入图片描述

3.1.5.2 Implement GraphPoet

在这里插入图片描述

函数如下:
public void checkRep() {
assert !corpusGraph.vertices().isEmpty();
}
各方法返回前检查rep不为空

public Graph poemGraph(File corpus)
根据参数(文件)创建语料库,规则为:相邻两个单词直接建立一条权值为1的有向边,有重复边时权值+1。
首先将文件以字符串形式读入,按“ ”(空格)划分为各个单词,不区分大小写,然后线性扫描,调用corpusGraph.set()建边

public String poem(String input)
对input进行扩展,规则是:如果相邻两个单词a和b,在语料库中存在一个单词c使a->c和c->b都存在,则将c插入a和b之间;如果存在多个满足条件的c,取边权a->c+c->b较大的。
首先将input按“ ”(空格)划分为各个单词,不区分大小写,线性扫描,调用corpusGraph.target()和source()找出所有可能的“桥”(上面说到的c),然后找到边权最大的一个,插入。最后返回扩展好的字符串。

public String toString()

return corpusGraph.toString();

3.1.5.3 Graph poetry slam

更新语料库文件中的字符串和输入的字符串input

在这里插入图片描述

3.1.6 Before you’re done

请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
Git:
先执行add命令将Lab2-1180300113整个文件夹加入维护
然后commiy – m命令 之后备注将文件更新到本地仓库
之后利用push命令将本地master分支中的文件推送到云端
在这里给出你的项目的目录结构树状示意图。

在这里插入图片描述
这就是第一部分啦,当时写的还是满顺手的,但是嘛有些代码在各位大大们严重就太次辣。
我会努力进步的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值