哈工大软构实验2感悟

本文章是对软构实验2的归纳总结,并非复制报告。

实验目标概述

本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说:

  1. 针对给定的应用问题,从问题描述中识别所需的ADT;
  2. 设计ADT规约(pre-condition、post-condition)并评估规约的质量;
  3. 根据ADT的规约设计测试用例;
  4. ADT的泛型化;
  5. 根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
  6. 使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
  7. 测试ADT的实现并评估测试的覆盖度;
  8. 使用ADT及其实现,为应用问题开发程序;
  9. 在测试代码中,能够写出testing strategy并据此设计测试用例。

Poetic Walks 

任务理解:

  1. 根据接口Graph的描述,通过等价类划分完善测试样例;
  2. 根据测试样例完善ConcreteEdgesGraph和ConcreteVerticesGraph两种实现方法,要注意两种实现方法的数据结构,具体问题具体分析;
  3. 修改ConcreteEdgesGraph和ConcreteVerticesGraph中的声明,实现泛型;
  4. 选择ConcreteEdgesGraph和ConcreteVerticesGraph其中一种实现方式,实现Graph.empty();
  5. 通过构建好的Graph接口构建GraphPoet类,实现构造语料库以及为输入添加桥接词的功能。

Re-implement the Social Network in Lab1 

任务理解:

  1. 运用接口Graph重新实现Lab1中的FriendshipGraph;
  2. FriendshipGraph需要改变的地方不多,但值得注意的是,为了使FriendshipGraph中运用Graph接口构造的图是私有不可变的,需要添加一些函数(观察器)方便Junit测试。

 实验难点

P1 利用语料库改写输入语句

public String poem(String input) {
        String[] inputwords = input.split(" ");
        String output = new String();
        String bridgeword = new String();
        Map<String, Integer> sourcesMap = new HashMap<>();
        Map<String, Integer> targetsMap = new HashMap<>();
        Map<String, Integer> bridgeMap = new HashMap<>();
        Set<String> bridgeset = new HashSet<>();
        int i = 0, w = 0;
        for (i = 0; i < inputwords.length - 1; i++) {//最后一个输入字符之后不会有桥接词
            targetsMap = graph.targets(inputwords[i].toLowerCase());//用于储存与该点相连的所有的目标点
            sourcesMap = graph.sources(inputwords[i + 1].toLowerCase());//用于储存与该点相连的所有的源点
            bridgeMap.clear();
            output += inputwords[i] + " ";
            for (String word : targetsMap.keySet()) {
                if (sourcesMap.containsKey(word)) {
                	w = targetsMap.get(word) + sourcesMap.get(word);
                    bridgeMap.put(word, w);
                }
            }//找到所有的桥接词
            bridgeword = "";
            int weight = 0;
            bridgeset = bridgeMap.keySet();
            for (String bridge : bridgeset) {
                if (bridgeMap.get(bridge) > weight) {
                    weight = bridgeMap.get(bridge);
                    bridgeword = bridge;
                }
            }//找到权重最大的桥接词,如果有多个权重最大的桥接词,取率先在语料库中出现的
            if (!bridgeword.equals("")) {
            	output += bridgeword + " ";
            }//如果存在权重最大的桥接词,则加入该桥接词
        }
        output += inputwords[inputwords.length - 1];
        checkRep();
        return output;
    }

步骤:

1.遍历输入字符串中的单词,将它们加入输出。在输入的两个相邻单词中,在语料库中找到第一个单词作为源点时,指向它的边的目标点的集合以及第二个单词作为目标点时,指向它的边的源点的集合,将两个表对比找到所有的桥接词,将它们存入一个哈希表;

2.找到权重最大的桥接词,如果有多个权重最大的桥接词,取率先在语料库中出现的;

3.如果存在权重最大的桥接词,则在输出中加入该桥接词;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值