Lab2-实验心得

Lab2-实验心得

一、 Poetic Walks
Problem 1: Test Graph 将Graph接口中的empty()中添加实例化方法,并在测试类中进行Junit测试
在这里插入图片描述
ConcreteEdgesGraph与ConcreteVerticesGtaph任选其一即可
Problem 2: Implement Graph
Implement ConcreteEdgesGraph
按照接口实现ConcreteEdgesGraph的相关功能
1.constructor
对vertices和edges进行实例化,允许从外部输入已有的vertices和edges,如果没有外部输入,则进行初始化
2.checkRep
确保在vertices是空集的情况下,edges必须也是空集。
3.add
首先检测vertices中是否已经有输入的点,如果没有且加入的点不是null则加入进vertices中
4.set
需要输入起点、终点和权重,如果权重为0,则在edges中进行搜索,如果有则将该边移除,否则不做操作。如果权重不为0,在点集中遍历搜索,如果两个点都存在,则在边集中搜索该边,如果没有则在边集中添加该边,如果有则在边集中更新该边的权重。如果两个点不都在点集中,则先将两点加入点集中,再添加该边。在操作完成后,返回输入的权重。
5.remove
首先在点集中搜索该点移除,然后遍历边集,在边集中将所有有关该边的边都移除。
6.vertices
直接返回vertices即可
7.sources
遍历edges,将所有源点是输入点的边的目标点和权重都放入Map中返回。
8.targets
过程与上述类似,输出的是源点
9.toString
将所有边集中的边以源点+目标点+权重的形式输出
10.Edge类
Edge类仅供ConcreteEdgesGraph使用,用于表示每条边。Edge类中包括源点、目标点和权重,可以为外界返回所有参数,并可以从外界设置权重值。toString函数输出边的源点+目标点+权重。
11.测试结果:
在这里插入图片描述
Implement ConcreteVerticesGraph

  1. constructor
    允许从外部输入点集,如果没有输入则将变量vertices初始化
    2.checkRep
    确保点集不能为空
    3.add
    检查点集中有无此点,如果没有则添加返回true,否则返回false
    4.set
    在点集中进行搜索,如果存在某点有和要set的边相同的边,若权重为0,则移除该边,否则更新权重。
    5.remove
    若某点存在于vertices中,则将该点移除,并遍历vertices,将其中每个点与输入点的相关边都删除,返回true,否则不作操作返回false
    6.vertices
    将vertices中所有的集合中类型与L相同的标识变量放入Set中,并返回。
    7.sources
    遍历vertices中所有点进行遍历,所有点中与输入点的相关边(以输入点为源点的目标点和权重)放进Map中返回
    8.targets
    与上述过程相同,输入点作为要返回的边的目标点
    9.toString
    按点输出,将每个点关联的所有边依次输出,格式为源点+权重+目标点,每个点的相关边输出结束后换行
    10.Vertex类
    Vertex类只在ConcreteVerticesGraph进行使用,其中的变量包括该点、以该点为目标点的边集合,以该点为源点的边集合,可以返回该点、两个边集合、增加/移除两个边集合中的元素、确认该点是否有某个特定源点或目标点以及转换字符串
    Problem 3: Implement generic Graph
    在这里插入图片描述
    在这里插入图片描述
    使用泛型进行操作能够适配更多的数据类型
    Problem 4: Poetic walks
    在文件中按行读取文档,对每一行文档用“ ”进行分割,并对读取的文档中所有标点符号删除,将每个词汇存入上述建立的图结构中,并在相连的词汇之间建立边输入新的句子后,如果该句子中任意两个词汇之间在图中距离为2(中间有1个词汇)则根据图进行扩句
    二、Re-implement the Social Network in Lab1
    FriendshipGraph类
    FriendshipGraph类用ConcreteEdgesGraph进行实现,对于每次输入的Person类对象,加入到ConcreteEdgesGraph类中的点集中,对于输入的边加入到ConcreteEdgesGraph的边集中。在每次加入边时,设A为源点,B为目标点,权重为x,对点集中所有的点进行遍历搜索,所有以A为目标节点的点如果与B无连接,则加入B作为其源节点,权重为x+与A之间的权重,如果与B有链接,则将权重更新为最低权重。以B为源节点的所有点做上述同样的操作。
    Person类
    在这里插入图片描述
    测试用例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    三、Playing Chess
    程序中共用了Action(子类goAction、chessAction)、Board、Game、Piece(子类goPiece,chessPiece)、Player、Position、RecordChess、RecordGo
    ADT设计/实现方案
    1.Position
    国际象棋的位置继承自JLabel,每个位置是一个Label围棋的位置直接用坐标点表示即可
    2.Piece
    国际象棋的棋子由于需要区分颜色与种类,故用图像表示,继承自Icon,棋子在棋盘上时用Label容纳即可,点击可选中,在点击后可以进行移动围棋的棋子继承自Canvas,继承鼠标点击事件接口,右击可消失(提子)
    3.Action
    二者共同的功能包括跳过、结束、位置、查询,定义为按钮,添加监听器。跳过操作只需更换当前玩家,结束操作在提示框显示玩家和结束并输出游戏过程,查询按钮点击后在提示框输出两个玩家的棋子数,查询按钮点击后会显示棋子种类、玩家或者无棋子或显示输入错误围棋特有功能提子在定义棋子时实现,落子在点击的坐标上实现。国际象棋移动功能对点击次数进行计数,点击单数次数则表示棋子选中,双数次数位置合法则进行移动,否则重新进行选择
    4.Board
    国际象棋棋盘与围棋棋盘继承自JFrame国际象棋棋盘用Label拼成,灰白相间,每个Label内存储图标围棋棋盘在Frame上添加Panle,在Panel上设置底色为棕色,并绘制棋盘主程序MyChessAndGoGame设计/实现方案
    在这里插入图片描述
    ADT和主程序的测试方案
    在这里插入图片描述
    本次试验中应用了面向ADT的编程和直接面向应用场景编程,ADT针对软件的对象进行编程,将编程模块化,便于逻辑上的实现。本次试验中首次接触使用泛型和不使用泛型的编程,能够感受到在使用时会很方便,可以适用多种类型的程序,使用范围更广
    在给出ADT的规约后就开始编写测试用例,能够在编程的时候实时测试写的程序是否符合规范;为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作可以在编程过程中时刻提醒自己所编写的内容是否符合规约要求,可以帮助捋顺编程的逻辑。在以后的编程中我会坚持这样做。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值