HIT软件构造Lab2实验报告

 

2022年春季学期
计算学部《软件构造》课程

Lab 2实验报告

姓名

赵卓凡

学号

120L021804

班号

2003006

电子邮件

759140563@qq.com

手机号码

13804501310

目录

1 实验目标概述 1

2 实验环境配置 1

3 实验过程 1

3.1 Poetic Walks 1

3.1.1 Get the code and prepare Git repository 1

3.1.2 Problem 1: Test Graph <String> 1

3.1.3 Problem 2: Implement Graph <String> 1

3.1.3.1 Implement ConcreteEdgesGraph 2

3.1.3.2 Implement ConcreteVerticesGraph 2

3.1.4 Problem 3: Implement generic Graph<L> 2

3.1.4.1 Make the implementations generic 2

3.1.4.2 Implement Graph.empty() 2

3.1.5 Problem 4: Poetic walks 2

3.1.5.1 Test GraphPoet 2

3.1.5.2 Implement GraphPoet 2

3.1.5.3 Graph poetry slam 2

3.1.6 Before you’re done 2

3.2 Re-implement the Social Network in Lab1 2

3.2.1 FriendshipGraph 2

3.2.2 Person 3

3.2.3 客户端main() 3

3.2.4 测试用例 3

3.2.5 提交至Git仓库 3

4 实验进度记录 3

5 实验过程中遇到的困难与解决途径 3

6 实验过程中收获的经验、教训、感想 4

6.1 实验过程中收获的经验和教训 4

6.2 针对以下方面的感受 4

  1. 实验目标概述

本次实验训练抽象数据类型(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 并据此设计测试用例。

  1. 实验环境配置

简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。

特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

直接下载即可

在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。

https://github.com/ComputerScienceHIT/HIT-Lab2-120L021804.git

  1. 实验过程

请仔细对照实验手册,针对两个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。

    1. Poetic Walks

利用ADT和OOP,在两个类中实现Graph和其相应的功能。

      1. Get the code and prepare Git repository

从https://github.com/rainywang/Spring2022_HITCS_SC_Lab2/tree/master/P1下载代码并解压,之后git init创建初始库,git add *.*将文件加入git库,再用git commit -m “init”标注为初始文件,再git push origin master传到自己的远程库上。

      1. Problem 1: Test Graph <String>

在Graph的empty中返回一个新的ConcreteEdgesGraph

 

在ConcreteEdgesGraph中返回vertices

 

用GraphStaticTest进行测试

 

在GraphInstance中设计了针对Add、Set等功能的测试代码,但暂时无法测试,需在测试GraphEdges时才能测试

 

      1. Problem 2: Implement Graph <String>

以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。

        1. Implement ConcreteEdgesGraph

先写Edge类

 

再构建ConcreteEdgesGragh类

 

得到测试结果

 

 

覆盖度如上,其中覆盖度低的百分之二十分布在try{}catch(Exception e)中和checkRep这些无法测试到的部分

        1. Implement ConcreteVerticesGraph

先写Vertex类

 

再写ConcreteVerticesGraph类

 

      1. Problem 3: Implement generic Graph<L>
        1. Make the implementations generic

 

 

 

 

依照上图按照报错依次把String转为L即可

        1. Implement Graph.empty()

 

如图new出一个新图然后返回

      1. Problem 4: Poetic walks
        1. Test GraphPoet

 

如图构建测试

 

        1. Implement GraphPoet

先设计Graphpoem

 

再设计poem

 

输出结果如下

 

 

上图为覆盖度。

        1. Graph poetry slam

 

如上图把莎士比亚的十四行诗创建成图,当输入I love you more and more.时应该输出I love you more lovely and more.

      1. Before you’re done

请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。

如何通过Git提交当前版本到GitHub上你的Lab2仓库。

在这里给出你的项目的目录结构树状示意图。

git add *.*

git commit -m “first”

git push origin master

结构:

Src

P1

Graph

Poem

Teat

P1test

Graph

poem

    1. Re-implement the Social Network in Lab1

用上个实验里设计的Graph类重写上次实验的人际关系图

      1. FriendshipGraph

 

如图设计addVertex,addEdge,getDistance三个函数

      1. Person

 

如图设计Person类

      1. 客户端main()

沿用上一次实验的main

 

      1. 测试用例

沿用上一次实验的测试用例

 

      1. 提交至Git仓库

如何通过Git提交当前版本到GitHub上你的Lab2仓库。

在这里给出你的项目的目录结构树状示意图。

git add *.*

git commit -m “first”

git push origin master

结构:

Src

P4

interval

P4

interval

  1. 实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。

每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。

不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

日期

时间段

计划任务

实际完成情况

5.13.2022

15:30-19:30

完成3.1.2

延后

5.14.2022

10:00-21:30

完成3.1.3

vertex的set的测试一直不成功,延后完成

5.15.2022

9.00-18:30

完成3.1.5

延后,困难3还未解决

5.16.2022

13:00-21:00

完成3.2

完成

  1. 实验过程中遇到的困难与解决途径

遇到的难点

解决途径

3.1.2中测试一直不成功

返回vertices时多写了一个(),导致方法套方法,还不会报错,一直没发现,蚌埠住了

3.1.3中测试一直不成功

一直没找到问题所在,先跳过

3.1.5.2中,创造图一直不成功,如果set(string[3],string[4],1)的话无法创造出该边,但要是将字符串写出来的话set(“test”,”of”,1)却成功,可是二者理论上应该是等价的,不知道错在哪里

暂未解决(5.16更新:已解决)

困难3

解决了,字符串比较要么全用equal,要么==不能混用,离谱

  1. 实验过程中收获的经验教训、感想
    1. 实验过程中收获的经验教训

学习了很多java的写法,学习了ADT和OOP的相关知识

    1. 针对以下方面的感受
  1. 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?

ADT感觉可能应用到实际会更方便

  1. 使用泛型和不使用泛型的编程,对你来说有何差异?

泛型比较麻烦,需要修改的比较多,自己手写会bug很多

  1. 在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?

在类更多的时候便于管理,便于直到输入输出,暂时还不适应

  1. P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?

节省时间,更方便

  1. 为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?

防止出错,不想写,但感觉应该很有用,还是写吧

  1. 关于本实验的工作量、难度、deadline。

虽然感觉不难,但在写的时候出了很多很难解决的bug,耗费了非常多的时间,比预计完成晚了很久

  1. 《软件构造》课程进展到目前,你对该课程有何体会和建议?

感觉这门课比较抽象,挺难的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值