软件构造lab2

        本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象

编程(OOP)技术实现 ADT。

        仔细阅读MIT的指导页面发现,该问题已经将ADT的大体框架提供给我们,Graph的接口,边和顶点的两种具体实现形式,我们要做的就是按照规约去实现具体功能,并将ADT泛型化(需要了解接口、泛型的概念),在过程中贯穿着测试优先的理念,Problem 4中的诗歌其实就是考察我们在设计好ADT之后,具体应用ADT的能力。

        测试Graph类时,需要对接口定义的每个实例方法都进行测试。要注意获取空图对象要使用emptyInstance()方法。其中,测试set方法时,需要根据输入set函数的参数情况划分等价类分别进行测试。
        完成接口的两个实现,ConcreteEdgesGraph和ConcreteVerticesGraph。

        先介绍Edge类,Edge类必须是不可变类型,因此将属性全部设置为私有和final。每条边的权值,按要求都必须为正值,因此checkRep检查边是否权值为正。该类中其余的方法都是基本的构造函数以及get方法,以及对toString函数进行了重写,使之能够正确显示Edge的信息:起点->终点:边权值。

       ConcreteEdgesGraph的属性已经由MIT给定,包括顶点集合以及边集。实现检查不变量及Graph接口中的函数。对于类ConcreteEdgesGraph,其add方法实现较为简单,只需要返回对Set对象调用add方法的返回值即可,无需手动编写判断顶点是否存在的代码。实现其set方法时,需要先判断weight参数是否为0,为0时如果能找到对应的边则删除,否则不作任何修改;否则添加两个顶点,如果两个顶点原先都存在,那么寻找原先是否存在对应的边,存在则更新边的权值,否则同两个顶点至少有一个原先不存在时一样,添加边。对于remove方法来说,也要首先判断提供的顶点是否存在,存在则删除该顶点,然后查找所有起点或终点为该顶点的边,将其删除。实现vertices函数时,要将vertices字段的内容进行拷贝来防止该字段被意外修改。sources和targets函数只需要根据传入的顶点,遍历edges数组进行筛选即可。

        Vertex类为可变类型。ConcreteVerticesGraph的实现与边图的类似。

        然后用泛型代替String,再实现写诗的功能。

        实现GraphPoet类时,首先实现它的构造函数。构造函数中,使用FileReader对象读入输入文件的全部字符,然后将其转换为小写形式,并使用String.split方法和正则表达式对读入的一整个字符串进行分割。之后,循环添加边,在循环中首先计算出相同边之前的权值(不存在则为0),然后调用Graph.set方法添加单词对应的顶点(如果不存在的话),并更新权值。

        第二部分是重新实践实验1的Social Network。这个实验是基于在Poetic Walks中定义的Graph及其两种实现,重新实现Lab1中的 FriendshipGraph类。我们需要尽可能复用ConcreteEdgesGraph或 ConcreteVerticesGraph中已经实现的add()和set()方法,而不是从零开始。另外基于所选定的 ConcreteEdgesGraph 或 ConcreteVerticesGraph的rep来实现,而不能修改父类的rep。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值