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

Lab 2实验报告

姓名 高翔
学号 1180300828
班号 1803008
电子邮件 gx313406876@163.com
手机号码 18845771713

目录

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实验环境配置
依据https://www.eclemma.org/installation.html内容,从更新站点进行安装。
1.从Eclipse菜单中选择帮助,安装新软件;
2.在“安装”对话框中,在“工作日期”字段中输入https://update.eclemma.org/;

3.检查最新的EclEmma版本,然后按“下一步”;
4.重启eclipse,即可在Java的透视图工具栏中找到coverage启动器,表示安装成功。

https://github.com/ComputerScienceHIT/Lab2-1180300828.git
3实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1Poetic Walks
该任务主要是实验一个图的模块,并基于此使用。
完善Graph接口类,并运用泛型的思想,将String拓展为泛型L类;
实现Graph类的方法:add、set、remove、vertices、sources、targets;
利用实现的Graph类,应用图的思想,实现GraphPoet类,如果输入的文本的两个单词之间存在桥接词,则插入该桥接词;若存在多个单一桥接词,则选取边权重较大者。
git clone https://github.com/rainywang/Spring2020_HITCS_SC_Lab2.git
3.1.1Problem 1: Test Graph
测试静态方法生成String类型的Graph。

3.1.2Problem 2: Implement Graph
3.1.2.1Implement ConcreteEdgesGraph
Edge实现
1.功能主要是为了存储边的三个信息
ConcreteEdgesGraph实现
该类以Edge为基础重写Graph,用集合来存储点和边,每有Edge的增加就会影响到集合的更改
Set()

Remove()

Junit测试

3.1.2.2Implement ConcreteVerticesGraph
Vertex实现
Vertex是点的抽象类,包含3个信息:点的标识,指向该点的边、由该点引出的边。Vertex需要能访问这3个信息,以及增加/删除进边/出边。
ConcreteVerticesGraph实现
ConcreteVerticesGraph是以点为基础的图,每个点通过唯一的标识进行区分,set和remove都依赖Vertex类中的添加和删除操作,sources和targets也调用了Vertex类的方法。
Set()

Remove()

Junit测试

3.1.3Problem 3: Implement generic Graph
3.1.3.1Make the implementations generic
在程序中选择“重构”或选择“String”并选择更改所有匹配项(要注意toString),即可实现泛化类型。
3.1.3.2Implement Graph.empty()
使其可以返回一个新的空实例。

3.1.4Problem 4: Poetic walks
问题简述:
给定一个语料库corpus,根据corpus中的文本生成一个单词图,然后给定一条语句输入,在图中搜索词之间的关系,自动补全语句中可能可以完善的部分。
图的构建规则是,在corpus中,对每一个不一样的单词看作一个顶点,相邻的单词之间,建立一条有向边,相邻单词对出现的次数,作为这条有向边的权值。在输入信息补全时,对相邻单词A和B做检查,如果存在一个单词C,在图中可以由前一个单词A通过这个单词C到达单词B,那么就在A和B之间补全C,补全的优先级按照权值越大者优先。
3.1.4.1Test GraphPoet
在基于预设的测试用例基础上,增加等价类划分的多种情况。
3.1.4.2Implement GraphPoet
1.获得单词x的所有字符小写

2.GraphPoet

3.Poem

3.1.4.3Graph poetry slam
Junit测试

3.1.5Before you’re done
如何通过Git提交当前版本到GitHub上你的Lab2仓库。

在这里给出你的项目的目录结构树状示意图。

3.2Re-implement the Social Network in Lab1
这部分任务就是用我们在3.1中写的ADT,把第一次实验中的FriendshipGraph重新实现一遍,图中的节点仍然是Person类型,所以泛型L一律为Person。而对于已经写好的FriendshipGraph中的方法,要用3.1中的Graph ADT中的方法来实现它们。
3.2.1FriendshipGraph类
Graph < Person > graph:
直接调用Graph的静态方法.empty()生成一个空的图。
boolean addVertex():
直接调用graph.add()添加点。
int addEdge():
调用graph.set()两次,添加双向边,默认权值为1,并记录可能存在的旧边的权值。
int getDistance():

3.2.2客户端main()

设计一个图,然后输出距离,测试是否正确即可。
3.2.3测试用例
对于点和边的添加以及距离的输出分别测试

3.2.4提交至Git仓库
如何通过Git提交当前版本到GitHub上你的Lab2仓库。

在这里给出你的项目的目录结构树状示意图。

3.3Playing Chess
3.3.1ADT设计/实现方案
3.3.1.1类 Action
1.public boolean put//放子
根据棋盘位置信息,判断这个位置是否有棋子,若没有,则添加该位置的棋子信息。
2.public boolean Chessmove//国际象棋
根据移动前后的两个位置的信息,判断移动后位置上是否有棋子且移动前的位置上是否有棋子,若符合条件,则添加相应信息。
3.public boolean Goeat//围棋提子
判断是否有对手棋子,然后删除信息。
4.public boolean Chesseat//国际象棋吃子
判断是否符合条件,然后删除信息。
5.public int theposition//查询该位置信息
提取该位置信息内容。
6.public int thesum查询数量
依次将某位玩家的棋子信息添加。

3.3.1.2类 Board
存储棋盘信息。

3.3.1.3类 Game
通过游戏名字确定游戏类型。

3.3.1.4类 Piece
存储棋子的相应信息,包括位置、棋手类别以及种类。
1.public Piece//初始化
2.public Position getposition() //获得棋子的位置
3.public boolean getflag() //获得棋手类别
4.public String getkind()//获得类别
5.public void setposition(int x, int y) //修改棋子位置
3.3.1.5类 Player
存储玩家的信息
1.public Player(String name, boolean flag)//初始化
2.public String getname()//获得名字
3.public boolean getflag()//获得类别

3.3.1.6类 Position
获得位置信息。

3.3.2主程序MyChessAndGoGame设计/实现方案
运行覆盖度:

3.3.2.1public static void printboard//打印棋盘
编写函数打印棋盘,在每次选手选择操作后都会进行打印棋盘。

3.2.2.2main函数
一.国际象棋
初始化:

行动:
1.End
结束程序

2.Move
提取玩家输入的位置信息,之后调用类Action中的chessmove函数进行相应的行动。

3.Eat
提取玩家输入的位置信息,之后调用类Action中的chesseat函数进行相应的行动。

4.Position
提取玩家输入的位置信息,之后调用类Action中的theposition函数进行相应的行动。
同时判断玩家输入的信息是否合法。

5.Sum
调用调用类Action中的thesum函数输出相应的棋子个数。

二.围棋
初始化:

1.End
结束程序
2.Put
提取玩家输入的位置信息,之后调用类Action中的put函数进行相应的行动。

3.Eat
提取玩家输入的位置信息,之后调用类Action中的put函数进行相应的行动。
之后调用类Action中的Goeat函数进行提子。

4.Position
提取玩家输入的位置信息,之后调用类Action中的theposition函数进行相应的行动。
同时判断玩家输入的信息是否合法。

5.Sum
调用调用类Action中的thesum函数输出相应的棋子个数。

3.3.3ADT和主程序的测试方案
测试覆盖度:

3.3.3.1ActionTest
1.象棋初始化

2.public void testPut()
主要放置十字,用来测试围棋的提子。

3.public void testChessmove()
主要测试超界、位置相同、目的位置已存在棋子、初始位置不存在棋子等报错的情况。

4.public void testGoeat()
测试提子是否可以正常执行或者是否报错。

5.public void testChesseat()
测试吃子的时候一些特殊情况是否会报错。

6.public void testTheposition()
测试是否正常。

7.public void testThesum()
测试数目是否正确。

测试结果:

3.3.3.2BoardTest
测试棋盘是否正常

测试结果:

3.3.3.3PieceTest
1.testGetposition()//获得棋子的位置

2.testGetflag()//获得棋手类别

3.testGetkind()//获得类别

4.testSetposition()//修改棋子位置

测试结果:

3.3.3.4PlayerTest
1.testGetname()
测试玩家建立是否正常。

2.testGetflag()
测试类别是否正确。

测试结果:

3.3.3.5PositionTest
分别测试新建位置信息以及提取位置信息。

测试结果:

3.3.3.6GameTest
测试两种游戏输入的大小写是否可以正常运行。(true为围棋,false为象棋)

测试结果:

哈工大软件构造实验2相关推荐

  1. 哈工大软件构造实验一

    哈工大软件构造lab1 实验目标 实验过程 Magic Square 第一部分 要求 实现 第二部分 要求 实现 Turtle Graphics 第一部分 绘制多边形 第二部分 计算方位 第三部分 凸 ...

  2. HIT哈工大软件构造实验lab3设计

    报告下载地址lab3报告 目录 一.对于ADT设计 1.1共性设计 1.2个性化设计 1.3代码展示 二.对于方案及设计模型的设计 2.1方案设计 2.1.1装饰器模式(方案6) 2.2.2委派模式( ...

  3. 哈工大软件构造实验二有感

    这次实验中的代码量是上次的好几倍,只要是P1阶段真的是写了好几天,通过课程的讲述就像我上一个文章写的那样,老师向我传达了一个ADT的概念,这是以后真正参加项目的时候用得到的一个编程思路,具体解释再上一 ...

  4. 哈工大2021春软件构造实验总结

    哈工大2021春软件构造实验总结 文章目录 一.实验一 1. 实验概述 1.1 Magic Squares 1.2 Turtle Graphics 1.3 Social Network 2. 实验感受 ...

  5. 哈工大2021软件构造实验3心得(1)-进行GUI设计

    哈工大2021软件构造实验3心得(1)-进行GUI设计 最近,笔者完成下窝工的软构实验三.在完成过程中,有很多坑想要记录一下. 顺便方便一下后来的窝工学子. 此Blog主要讨论如何在Eclipse里面 ...

  6. 哈工大软件构造期末知识点总结

    哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...

  7. 2022哈工大软件构造lab1小结(知识点)

    哈工大软件构造lab1小结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 问题一 使用的库 异常处理机制 字符串内容检查 写入文件 问题二 problem 3:画一 ...

  8. 哈工大软件构造 复习

    哈工大软件构造试题构成: 1.30分的选择题 2.70分的简答题 2019考试知识点(重要的,但不涵盖全部考试范围): 1.git工具的知识点(没有考察命令行,考察的主要是git的演变及各部分的作用) ...

  9. 哈工大软件构造课程知识点总结(一)

    系列文章目录 哈工大软件构造课程知识点总结(一) 哈工大软件构造课程知识点总结(二) 哈工大软件构造课程知识点总结(三) 哈工大软件构造课程知识点总结(四) 哈工大软件构造课程知识点总结(五) 哈工大 ...

最新文章

  1. confluence中org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed的解决方法
  2. 人和人之间是需要沟通的
  3. I.MX6 GPS JNI HAL register init hacking
  4. oracle 客户端监听文件配置
  5. iOS之使用CAShapeLayer实现复杂的View遮罩效果
  6. 关于switch-case问题
  7. Test435678
  8. 适用于高级Java开发人员的十大书籍
  9. 自定义条件查询_数据查询不止有vlookup函数,自定义zlookup函数查询操作更高效...
  10. 用计算机画有常数的函数图像,信息技术应用 用计算机画函数图象教学设计及教案分析...
  11. php session不生效_php验证session无效的解决方法
  12. Eclipse 常用快捷键(动画讲解)
  13. 如何使用Magoshare Data Recovery在mac上恢复找回删除的丢失文件?
  14. swagger 基础入门
  15. 有关windows在调试ODOO8.0有些问题
  16. 程序员的英语学习!对于像进一步提升自己的人来说,很重要哟!
  17. pca降维python实例_主成分分析(Principal component analysis, PCA)例子–Python | 文艺数学君...
  18. 墨尔本大学计算机本科学费,墨尔本大学本科学费要多少
  19. 四通OKI5760SP针式打印机连续打印第一张正常,后面的对不上位置
  20. 写好一份软件开发设计文档

热门文章

  1. 触目惊心!2017年化工行业事故203起死亡238人!附重大事件回顾
  2. BNU Training 2017.07.20 【(2+1+0.233)/11】[待补]
  3. 单细胞数据分析工具scvi介绍
  4. java8安装包打不开_Win7系统下安装JDK提示“无法打开此安装包请确认该程序包存在”怎么办?...
  5. JDK1.8中文文档(免费高清可搜索版)
  6. 八码数-IDA*算法
  7. 挑战微信王座,王欣、张一鸣、罗永浩今日同日发布社交app
  8. 判断字符串中的字母大小写、数字
  9. 小程序---仿百思不得姐
  10. input禁止键盘及中文输入