欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

哈工大 软件构造实验 lab2

程序员文章站 2022-03-10 14:23:56
...

本次实验训练抽象数据类型(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.实验环境配置
实验1时已经配置好环境
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
https://github.com/ComputerScienceHIT/Lab2-1170300531

2 实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
2.1 Poetic Walks
这里是用给你的接口,你用两种方式实现图的结构。
2.1.1 Get the code and prepare Git repository
根据老师的github下载实验代码
2.1.2 Problem 1: Test Graph
测试写过的每个函数,add,set等等,给每个函数写test
2.1.3 Problem 2: Implement Graph
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
2.1.3.1 Implement ConcreteEdgesGraph、
这里使用边集来记录图,因此需要设计边的结构,这里边的结构为起点,终点和权值
,这样来记录边。
要点:
Add要判断是否有过
Set时要考虑weight=0时的情况
Remove由于是连续删除,要使用迭代器

2.1.3.2 Implement ConcreteVerticesGraph
这里采用点集来记录图,想到用邻接表的形式来记录图,固设计了点,和他的邻接集合link,link用map来组成,这样还可以记录权值。
要点几乎同上
2.1.4 Problem 3: Implement generic Graph
2.1.4.1 Make the implementations generic
这里将整个项目的String改为L,即将他变为泛型,而不是只是让顶点元素为字符串,这样顶点元素可以为任意对象。
2.1.4.2 Implement Graph.empty()
让它返回一个已经创建的具体的图结构,这里返回边集型图结构。

2.1.5 Problem 4: Poetic walks
2.1.5.1 Test GraphPoet
这里要求你录入一句话,并将其根据语义库变长,于是测试时就要求你输入句子
和语义库,看与你希望的符不符合。
这里提供了语义库只有一个句子,有两个句子等等测试,均符合
2.1.5.2 Implement GraphPoet
先建立语义库,将语义库里的句子变成单词后建图,
2.1.5.3 Graph poetry slam
每次在语义库里寻找,如果找到了两个单词在句子中,且之间有1个单词
则将这个单词插入这个句子。

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

2.2 Re-implement the Social Network in Lab1
这里要求你建立一个图,用P1之前实现的方法来建立一个关系网络,,项目类似与lab1的同名任务,但实现不同
2.2.1 FriendshipGraph类
ConcreteEdgesGraph graph = new ConcreteEdgesGraph();
int n = 0;//用来记录人的总数
利用P1里建图,这里采用了边表来建图
用P1的各种函数来实现addVertex,addEdge,getDistance等函数,这里可以大量利用
2.2.2 Person类
String name;//人物名字
int i;//人物的编号
boolean visited =false;//是否被
int distance;//距离

2.2.3 客户端main()
这里采用main函数建立几个人物,并输出他们之间的距离,看是否和想象的一致

2.2.4 测试用例
这里建立四个人物
FriendshipGraph graph = new FriendshipGraph();
Person rachel = new Person(“Rachel”);
Person ross = new Person(“Ross”);
Person ben = new Person(“Ben”);
Person kramer = new Person(“Kramer”);
并未他们添加关系
graph.addVertex(rachel);
graph.addVertex(ross);
graph.addVertex(ben);
graph.addVertex(kramer);
graph.addEdge(rachel, ross);
graph.addEdge(ross, rachel);
graph.addEdge(ross, ben);
graph.addEdge(ben, ross);

看输出是否满足要求
2.2.5 提交至Git仓库

2.3 Playing Chess
2.3.1 ADT设计/实现方案
设计了棋子
private String name;
private int not=0;
private int x;
private int y;
设计了Board做棋盘
private int n;//棋盘大小
private Piece[][] pieces = new Piece[n][n];
设计了position记录点
private int x ;
private int y;
设计了玩家public class Player {
String name;//玩家名字
private Set remaining= new HashSet<>();//玩家使用的棋子
private String history=new String();//玩家操作历史
设计了Game类来实现游戏的具体执行
private String gameName;
private Board gameBoard = new Board(); // 棋盘

private Action gameAction = new Action();

private Player player1 =new Player();
private Player player2 = new Player();

这里采用了棋盘和玩家分别记录棋子的实现方式,棋盘记录在棋盘上面的棋子,玩家记录使用过的棋子。这样可以很好的得到所以有效信息。
要点函数:
Initial:
这里象棋和围棋要分别初始化,象棋格子为88,且一开始就有32个棋子,围棋为1919
一开始没有棋子,初始化时将棋盘每个棋子的NOT量记为0,表示没有棋子
Putpiece 围棋:
这里表示将棋子放在棋盘上面,放在棋盘上时要将该棋盘上该位置的棋子名称改变,Not量设置为1,同时将记录计入该玩家history,将这个棋子加入该玩家使用的棋子列表remaining
Removepiece围棋
这里表示围棋的提子,显然这要该该玩家输入一个位置,将目标位置的棋子去除,这就意味将
棋盘上该位置的NOT为0,再将对手的remianing的该处棋子删除,将操作历史加入history
Movepiece 象棋
这里表示将象棋移动,参数传入该玩家,旧位置,新位置,将旧位置的棋子名字复制给新位置,将其从玩家的remaining中删除,棋盘上旧位置not设为0,表示没有棋子,再将这新位置的棋子not设为1,并加入该玩家remianing,最后将操作历史加入history
Eatpiece 象棋
这里表示将某位置棋子吃掉,传入吃人者,旧位置,新位置等信息,再将该玩家里旧位置的棋子位置信息变为新位置,将棋盘旧位置not置0,将棋盘新位置置1,并将名称复制给新位置,同时删去对手的新位置棋子。

2.3.2 主程序MyChessAndGoGame设计/实现方案
这里设计了两个menu来实现两种棋子的菜单
Game game = new Game();
开始新游戏,从键盘读入玩家姓名,根据输入的游戏种类来选择棋子种类
Player[] player =new Player[2];这里设计了一个玩家列表,是为了可以交替两个玩家的控制权,开始让k=0,每次选择让看k++,然后在根据player【k%2】来实现对玩家选择权的交替。
根据菜单不同的选项来实现不同的功能
这是象棋菜单
1.移動棋子(國際象棋)
2.吃子(國際象棋)
3.某個位置的佔用情況
4.查看棋盤
5.計算玩家棋子總數
6.跳過
7.end//结束并输出操作历史
这是围棋菜单
1.放置棋子(圍棋)
2.提子(圍棋)
3.某個位置的佔用情況
4.查看棋盤
5.計算玩家棋子總數
6.跳過
7.end
其中3.某個位置的佔用情況
4.查看棋盤
5.計算玩家棋子總數
不算玩家操作,考虑公平性,于是执行这些时将k–;

Rook Knight Bishop Queen King Bishop Knight Rook
Pawn Pawn Pawn Pawn Pawn Pawn Pawn Pawn

	Pawn						

Pawn Pawn Pawn Pawn Pawn Pawn Pawn
Rook Knight Bishop Queen King Bishop Knight Rook

2.3.3 ADT和主程序的测试方案
测试围棋的防子,先加入棋子,如果玩家手里的棋子数量增加了,则证明了成功;
测试围棋的提子,若玩家手里棋子减少了则成功
测试象棋的移动,若旧点的not等于0,新店等于1,则成功
测试吃子,若对手的棋子减少,则成功。