lab2-1180300729

2020年春季学期
计算机学院《软件构造》课程

Lab 2实验报告
1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Poetic Walks 1
3.1.1 Get the code and prepare Git repository 1
3.1.2 Problem 1: Test Graph 1
3.1.3 Problem 2: Implement Graph 1
3.1.3.1 Implement ConcreteEdgesGraph 2
3.1.3.2 Implement ConcreteVerticesGraph 2
3.1.4 Problem 3: Implement generic Graph 2
3.1.4.1 Make the implementations generic 2
3.1.4.2 Implement Graph.empty() 2
3.1.5 Problem 4: Poetic walks 2
3.1.5.1 Test GraphPoet 2
3.1.5.2 Implement GraphPoet 2
3.1.5.3 Graph poetry slam 2
3.1.6 Before you’re done 2
3.2 Re-implement the Social Network in Lab1 2
3.2.1 FriendshipGraph类 2
3.2.2 Person类 3
3.2.3 客户端main() 3
3.2.4 测试用例 3
3.2.5 提交至Git仓库 3
3.3 Playing Chess 3
3.3.1 ADT设计/实现方案 3
3.3.2 主程序MyChessAndGoGame设计/实现方案 3
3.3.3 ADT和主程序的测试方案 3
4 实验进度记录 4
5 实验过程中遇到的困难与解决途径 4
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4

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

⚫ 针对给定的应用问题,从问题描述中识别所需的ADT;

⚫ 设计ADT规约(pre-condition、post-condition)并评估规约的质量;

⚫ 根据ADT的规约设计测试用例;

⚫ ADT的泛型化;

⚫ 根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)

⚫ 使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);

⚫ 测试ADT的实现并评估测试的覆盖度;

⚫ 使用ADT及其实现,为应用问题开发程序;

⚫ 在测试代码中,能够写出testing strategy并据此设计测试用例。
2实验环境配置
在 Eclipse IDE 中安装配置 EclEmma(一个用于统计 JUnit 测试用例的代码覆盖度的 plugin)
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
3实验过程
3.1Poetic Walks
对给定的接口Graph,完成他的两个实例类ConcretVerticesGraph和ConcreateEgdesGraph
Graph接口要求实现add(添加新节点),set(添加新边),remove(移除节点),vertices(获得所有的节点集合),sources(target)获得以target为目标节点的边的起始节点,targes(source)获得以source为起始节点的边的目标节点。还要求将ADT泛型化。并且编写测试文件的时候,需要从实现的基本功能出发,有良好的测试覆盖率。
Poet假设存在一条由a到b的有向边,构造有向图,再给定一句子,如果句子中两个相邻单词在有向图中有一个中间单词,则将该单词插入到a与b中间,若存在多个中间单词,则插入权重最大的那个
3.1.1Get the code and prepare Git repository
从教学QQ群中获得代码
3.1.2Problem 1: Test Graph
修改empty为:
在这里插入图片描述
3.1.3Problem 2: Implement Graph
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
3.1.3.1Implement ConcreteEdgesGraph
Edge类:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
列表文本:
add(L vertex) 返回set中的add方法,即如果里面有相同点则返回false
set(L source, L target, int weight) 1)先判断vertices中是否有source和target,若没有,则加上;然后遍历edges,寻找source到target的边,若找到,就删除并记录此时的权值,遍历后判断若weight>0,则把set的参数制成的新边加入edges

remove(L vertex) 若vertices中没有该点,直接返回false;若有,遍历edges,把与之相关的边全部删除,最后把vertices中该点删除
Set vertices() 返回vertices
Map<L, Integer> sources(L target) 2)在edges中寻找所有目标点是target的初始节点(加权),通过stream的Map-filter-reduce的处理流程,返回对应键值对

Map<L, Integer> targets(L source) 3)在edges中寻找所有目标点是source的初始节点(加权),通过stream的Map-filter-reduce的处理流程,返回对应键值对
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.3.2Implement ConcreteVerticesGraph
Vertex类:
在这里插入图片描述
三个域的getter和setter,其中setter返回之前的值,方便set调用
在这里插入图片描述
ConcreteVertices类:

在这里插入图片描述
在这里插入图片描述
列表文本:
add(L vertex) 先寻找vertices中的name有没有与vertex中相同,若没有返回false,若有将以vertex为name的新边加到vertices中,返回true
set(L source, L target, int weight) 先判断vertices中是否有source和target,若没有,则加上;然后遍历vertices,寻找source和target点,若找到,就通过setTarget和setSource传入weight进行处理,返回两个函数的返回值

remove(L vertex) 遍历vertices,将其中map的键中的vertex删除,若有vertices中name是vertex,将其删除,并返回true;若没有,返回false
Set vertices() 遍历vertices,把每个name加到set中,最后返回set

Map<L, Integer> sources(L target) 遍历vertices,寻找name是target的点,通过 getSource返回他的map

Map<L, Integer> targets(L source) 遍历vertices,寻找name是source的点,通过 getTarget返回他的map

3.1.4Problem 3: Implement generic Graph
3.1.4.1Make the implementations generic
将具体类的声明更改为
在这里插入图片描述
在这里插入图片描述

3.1.4.2Implement Graph.empty()
修改Graph.empty为:
在这里插入图片描述
以double类为例,重新测试graph
在这里插入图片描述
3.1.5Problem 4: Poetic walks
3.1.5.1Test GraphPoet
在这里插入图片描述
3.1.5.2Implement GraphPoet
public GraphPoet(File corpus) throws IOException:先按行读取文件,并每行要针对制表符或空格对该字符串进行分割,并且在将分割好的存放单词的list,一个个读取,并用前一个单词与后一个单词利用set函数将权重为1的边加到graph中:若set返回的是0,说明之前无边,可以结束;若不为0,说明之前有边,所以再次set权重为之前返回值加一
在这里插入图片描述
public String poem(String input):将input用空格分隔成字符串数组,通过寻找前一个单词的target与后一个单词的source的值相加,寻找一个最大值,就是这两个单词之间需要穿插的单词,若两个之间没有相同的键,则不需要添加单词。
在这里插入图片描述

3.1.5.3Graph poetry slam
main函数:
在这里插入图片描述
3.1.6Before you’re done
在这里插入图片描述

3.2Re-implement the Social Network in Lab1
继承P1中ConcreteEdgesGraph或者ConcreteVerticesGraph类 实现FriendshipGraph,通过基本操作实现FriendshipGraph中addVertex,addEdge和getDistance三个接口,要求不能修改父类rep

3.2.1FriendshipGraph类
在这里插入图片描述
addVertex(Person newName) 直接用add方法,返回add的返回值即可
addEdge(Person staName, Person endName) 直接用set(staName, endName, 1),若set返回是0,说明之前无边,则返回true;若不为0,说明之前有边,则返回false
getDistance(Person staName, Person endName) 在广度搜索需要该节点的后继节点时改为调用target方法

3.2.2Person类
可以不需要任何改动,但因为ConcreteEdgesGraph已经写的相当完备,所以可以删除person类中除name之外的部分
3.2.3客户端main()
在这里插入图片描述

3.2.4测试用例
给出你的设计和实现思路/过程/结果。
3.2.5提交至Git仓库
在这里插入图片描述
3.3Playing Chess
3.3.1ADT设计/实现方案
Position:
在这里插入图片描述
方法:x,y的getter,以及方便打印的getposition
在这里插入图片描述

Player:
在这里插入图片描述
方法:nameString和history的getter,添加history的方法addhistory
在这里插入图片描述
Piece:
在这里插入图片描述
方法:pName,position,player的getter以及position的setter
Board:
在这里插入图片描述
方法:
1)setBoardPiece(Piece piece, Position position):将position处的piece替换为参数的piece
2)getPiece(Position position):返回指定position的piece

Action:
在这里插入图片描述
方法:
1.putPiece(Piece piece):读取参数piece的position,将piece放到gameBoard中boardpiece数组的对应位置
2.movePiece(Piece piece, Position position):将piece放到gameBoard中boardpiece数组与position对应位置
3.removePiece(Piece piece):读取参数piece的position,将piece从gameBoard中boardpiece数组的对应位置删除

Game:
在这里插入图片描述
其中,构造器参数kind为true时表示初始化国际象棋;为false时表示初始化围棋
方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.3.2主程序MyChessAndGoGame设计/实现方案
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.3.3ADT和主程序的测试方案
介绍针对各ADT的各方法的测试方案和testing strategy。

介绍你如何对该应用进行测试用例的设计,以及具体的测试过程。
由于各个动作都是针对于Game类的,所以测试主要针对Game类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值