2019年秋季学期软件构造 Lab2

EclEmma的安装:

  1. 启动eclipse—点击Help菜单—Install New Software,在弹出的对话框中,点击Add

  2. 输入Name,例如EclEmma。输入Location:http://update.eclemma.org/

  3. 安装后重新启动eclipse,如果成功安装,工具栏上会出现一个新的按钮

  4. 安装成功则出现下图标志:
    在这里插入图片描述

Poetic Walks

  1. 首先,这个问题是要我们自己做一个抽象数据类型“图”,完成他的功能并写出测试用例

  2. mutable graph 点和边可以被加到图中
    directed edges 边可以从一个与源点连接到目标点
    weighted edges 设置边的权重
    labeled vertices,将点用一些不可变的变量来标记,如他们可能有String names or Integer IDs
    GraphPoet,功能:写诗

Test Graph <String>

方法实现
boolean add(L vertex)返回是否加入点,若以前存在返回false,否则向点集里加这个点,同时返回true
int set(L source, L target, int weight)若权值为0,同时两点之间有有向边,则删除这条边;若为非0权值,则根据有向边是否存在实现加边和修改权值,返回的是原来两点间边的权值
boolean remove(L vertex)将点删除,若点集存在该点,删除,返回true,否则返回false
Set<L>vertices()返回图的点集
Map<L,Integer> sources(L target)返回以传入参数为终点的边,并将他们写进map中,key为起点,value为权值
Map<L,Integer> targets(L source)返回以传入参数为起点的边,并将他们写进map中,key为终点,value为权值
public String toString()将图用字符串描述

所以,我们可以根据方法的不同功能写出测试用例,结果如下:
在这里插入图片描述

Implement Graph <String>

Implement ConcreteEdgesGraph

  1. 要求:使用private final Set vertices = new HashSet<>()、private final List edges = new ArrayList<>(),edge为不可变的
  2. 我的checkrep要求每两个点之间最多只有两条有向边,同时,权值为整数,边的起点和终点不重合
  3. 用题中给的域来写方法
    在这里插入图片描述
  4. 因为是实现抽象类,所以大部分函数需要重写
    在这里插入图片描述
  5. Edge 类
作用
private final L source边的起点
private final L target边的终点
private final int weight边的权值
方法作用
public L getsource()Getter
public L gettarget()Getter
public int getweight()Getter
  1. ConcreteEdgesGraph
方法作用
boolean add(L vertex)遍历点集
int set(L source, L target, int weight)首先遍历边,如果两点之间有边,同时判断权值大小,进行删除(权值变为0),删除原来的边,加上新的边,若两点间没边,判断两个点是否在点集中,没有要在点集中加上,然后向边集加上边,最后我们要调用checkrep函数,最后返回之前两点间的权值
boolean remove(L vertex)遍历点集,删除(迭代器删除)
Set<L> vertices()通过遍历边集,向点集中加点
Map<L,Integer> sources(L target)遍历边集,找到以传入参数为终点的边,记录起点和边的权值
Map<L,Integer> targets(L source)遍历边集,找到以传入参数为起点的边,记录终点和边的权值
public String toString()将图用字符串描述
  1. 测试
    在这里插入图片描述

Implement ConcreteVerticesGraph

  1. 同上面一样,只是通过点来实现Graph抽象类


  2. ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190616001250196.png

  3. Vertex类

作用
private L source边的起点
private Map<L, Integer> mapKey:边的终点 Value:边的权值
方法作用
L getsource()Getter
Map<L,Integer>getmap()Getter
putmap(L target,int weight)将边加到map去
removemap(L target)通过删除map来删除边
replacemap(L target,int weight)将边的权值改变
toString用字符串表示
  1. ConcreteVerticesGraph
方法作用
boolean add(L vertex)遍历点集
int set(L source, L target, int weight)首先遍历边,如果两点之间有边,同时判断权值大小,进行删除(权值变为0),删除原来的边,加上新的边,若两点间没边,判断两个点是否在点集中,没有要在点集中加上,然后向边集加上边,最后我们要调用checkrep函数,最后返回之前两点间的权值
boolean remove(L vertex)遍历点集,删除(迭代器删除)
Set<L>vertices()通过遍历边集,向点集中加点
Map<L,Integer> sources(L target)遍历边集,找到以传入参数为终点的边,记录起点和边的权值
Map<L,Integer> targets(L source)遍历边集,找到以传入参数为起点的边,记录终点和边的权值

Implement ConcreteVerticesGraph

同上面一样,只是通过点来实现Graph抽象类
Vertex 类

作用
private L source边的起点
private Map<L, Integer> mapKey:边的终点 Value:边的权值
方法作用
L getsource()Getter
Map<L,Integer>getmap()Getter
putmap(L target,int weight)将边加到map去
removemap(L target)通过删除map来删除边
replacemap(L target,int weight)将边的权值改变
toString用字符串表示

ConcreteVerticesGraph类

方法作用
boolean add(L vertex)遍历点集
int set(L source, L target, int weight)首先遍历map,如果两点之间有边,同时判断权值大小,进行删除(权值变为0),删除原来的边,加上新的边,若两点间没边,判断两个点是否在点集中,没有要在点集中加上,然后向map加上边,最后我们要调用checkrep函数,最后返回之前两点间的权值
boolean remove(L vertex)遍历点集,删除(迭代器删除)
Setvertices()通过遍历点集,加集合加点
Map<L,Integer> sources(L target)遍历map,找到以传入参数为终点的边,记录起点和边的权值
Map<L,Integer> targets(L source)遍历边集,找到以传入参数为起点的边,记录终点和边的权值
public String toString()将图用字符串描述

Implement generic Graph

Make the implementations generic

使graph泛型化:

  1. 声明:
    public class ConcreteEdgesGraph implements Graph { … }
    class Edge { … }
    public class ConcreteVerticesGraph implements Graph { … }
    class Vertex { … }
  2. 修改标签,用占位符L替代String

Implement Graph.empty()

在这里插入图片描述

Poetic walks

  1. 用上述图来写诗
  2. 要求:
    从文件读入,作为一个图,计算词和词的有向关系,相邻的词之间表示有边,我在这里设置权值为1
    从控制台输入一句话,找到一个bridge,与这句话中的相邻两个词的权值最大,并把bridge插入到这两个词中间,输出这句话,要求输入的话按照原来的大小写输出,bridge按小写输出

Test GraphPoet

在这里插入图片描述
在这里插入图片描述

Implement GraphPoet

  1. 建立图:从文件读入,然后通过split 拆分成不同的词,将词转换成小写加入到图的点集里,在扫描文集,建立点与点之间的邻接关系
  2. 从控制台读入,找到可以建立最长路径的两个点和Bridge,修改字符串,输出

Re-implement the Social Network in Lab1

FriendshipGraph类

  1. 首先,我们完成addVertex,这里我把图设定为Graph型,现在代码如下
    在这里插入图片描述
  2. 然后,我们完成addEdge,这个函数是增加点之间的边,代码如下:
    在这里插入图片描述
  3. 最后,我们完成getDistance,其实这块就是将图的BSF的算法用Java实现,(先广搜索:从一个点出发,遍历与此点邻接的所有点,再从邻接的第一个点搜下去),所以我们可以得到两个人所在的数的高度差;
    代码如下:
    在这里插入图片描述

Person类

我们针对person类的对象就只用了姓名这个方法,所以这块我们person的实现就比较简单。
在这里插入图片描述

客户端main()

在这里插入图片描述

Playing Chess

ADT设计/实现方案

  1. Action
作用
private Board board棋盘
private Player player1玩家1
private Player player2玩家2
方法作用
Setter设置棋盘,玩家1,玩家2
Getter得到棋盘,玩家1,玩家2的信息
setpiece向棋盘中添加新棋子
movepiece将棋子从一个坐标移到另一个坐标
removepiece提子
eatpiece吃子
  1. Board:
作用
private int boardtype棋盘类型0:国际象棋 1:围棋
private int boardsize棋盘大小
private Piece board[][]放棋子的二维组
方法作用
Setter设置域
Getter得到域的信息
boardavailable判断棋盘某个位子是否为空
pieceinboard判断棋子是否在棋盘上
getnumber计算某一个玩家在棋盘上的棋子数
empty将棋盘某个位子清空
  1. Game
    在这里插入图片描述
  2. MyChessAndGoGame
    游戏主体

在这里插入图片描述
5. Piece
在这里插入图片描述
6. Player在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值