- 实验目标概述
根据实验手册简要撰写。
针对给定的应用问题,从问题描述中识别所需的ADT;
设计ADT规约(pre-condition、post-condition)并评估规约的质量;
根据ADT的规约设计测试用例;
ADT的泛型化;
根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(repexposure)
测试ADT的实现并评估测试的覆盖度;
使用ADT及其实现,为应用问题开发程序;
在测试代码中,能够写出testing strategy并据此设计测试用例。
- 实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
安装配置EclEmma
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
- 实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
-
- Poetic Walks
在这里简要概述你对该任务的理解。
实现并测试具有标记顶点的Graph。然后实现一个使用单词的图生成诗歌的类
-
-
- Get the code and prepare Git repository
-
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
从实验指南中发布的链接上直接下载获取
-
-
- Problem 1: Test Graph <String>
-
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
- testadd():测试能不能加入新顶点
- testSet():测试能不能加入一条新边
- testRemove():在图中加入一条边,然后删除某顶点,测试这条边是否还存在
- testVertices():向图中加入顶点测试集合是否正确
- testsSources():向图中加入顶点和边测试是否返回源头点和权重
- testTargets():向图中加入顶点和边测试测试某顶点相连是否正确
-
- Problem 2: Implement Graph <String>
-
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
-
-
-
- Implement ConcreteEdgesGraph
-
-
Edge:用source表示源点,target表示目标点,weight表示权重,编写get以上三种数据,然后检查是否存在非法数据
-
-
-
- Implement ConcreteVerticesGraph
-
-
Vertex:用vertexname表示顶点,map存储与改点有关的数据,check检查是否存在空顶点。
-
-
- Problem 3: Implement generic Graph<L>
- Make the implementations generic
- Problem 3: Implement generic Graph<L>
-
搜索所有的string并将其转换为L
-
-
-
- Implement Graph.empty()
-
-
利用conctreteedgesgraph()实现Graph.empty()
-
-
- Problem 4: Poetic walks
- Test GraphPoet
- Problem 4: Poetic walks
-
借助测试用例实现功能
-
-
-
- Implement GraphPoet
-
-
从文本中获得单词图,返回处理好的字符串
-
-
-
- Graph poetry slam
-
-
-
-
- 使用Eclemma检查测试的代码覆盖度
- Before you’re done
-
请按照C:\Users\a\Downloads\before_youre_donehttp://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
在这里给出你的项目的目录结构树状示意图。
-
- Re-implement the Social Network in Lab1
在这里简要概述你对该任务的理解。
在定义了Graph的情况下,实现friendshipgraph类
-
-
- FriendshipGraph类
-
给出你的设计和实现思路/过程/结果。
用Graph表示人物关系
Addvertex()添加顶点
Getdistance()寻找最短路径并返回路径长度
-
-
- Person类
-
给出你的设计和实现思路/过程/结果。
Name表示顶点名字。
Distance表示最短距离。
Map存储所有相连顶点及其权重
List存储所有相连顶点
Check检查是否有重复级和空元素
-
-
- 客户端main()
-
给出你的设计和实现思路/过程/结果。
由lab1实验指南可得
-
-
- 测试用例
-
给出你的设计和实现思路/过程/结果。
-
-
- 提交至Git仓库
-
如何通过Git提交当前版本到GitHub上你的Lab3仓库。
Git add
Git commit -m “xxxx”
Git push origin master
在这里给出你的项目的目录结构树状示意图。
- 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 计划任务 | 实际完成情况 |
2021/6/5 | 19:00-22:00 | 3.1 | 完成 |
2021/6/7 | 19:00-22:00 | 3.2 | 粗糙完成 |
2021/6/13 | 12:00-16:00 | 修改bug,完成报告 | 完成 |
- 实验过程中遇到的困难与解决途径
遇到的难点 | 解决途径 |
函数较为复杂,编写过程中多次出现问题 | 继续练习,熟练编写技巧 |
分析图中关系时顺序混乱 | 从头理头绪 |
- 实验过程中收获的经验、教训、感想
- 实验过程中收获的经验和教训
丰富了对于不同类的理解和应用,进一步提高了编程和算法能力
-
- 针对以下方面的感受
- 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
ADT能够复用数据结构和一系列方法,让代码更加清晰
- 使用泛型和不使用泛型的编程,对你来说有何差异?
泛型更方便但限制条件多
- 在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
在一边实现具体类时可以一边测试,利于修改
- P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
能够提高效率
- P3要求你从0开始设计ADT并使用它们完成一个具体应用,你是否已适应从具体应用场景到ADT的“抽象映射”?相比起P1给出了ADT非常明确的rep和方法、ADT之间的逻辑关系,P3要求你自主设计这些内容,你的感受如何?
还没理解透彻,仍感到一些困难
- 为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
使开发者能够注意步骤,避免编程混乱
- 关于本实验的工作量、难度、deadline。
工作量比较大,需要比较长的时间
- 《软件构造》课程进展到目前,你对该课程有何体会和建议?
学会了如何提高效率,实现更好的编译
- 实验目标概述
根据实验手册简要撰写。
针对给定的应用问题,从问题描述中识别所需的ADT;
设计ADT规约(pre-condition、post-condition)并评估规约的质量;
根据ADT的规约设计测试用例;
ADT的泛型化;
根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(repexposure)
测试ADT的实现并评估测试的覆盖度;
使用ADT及其实现,为应用问题开发程序;
在测试代码中,能够写出testing strategy并据此设计测试用例。
- 实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
安装配置EclEmma
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
- 实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
-
- Poetic Walks
在这里简要概述你对该任务的理解。
实现并测试具有标记顶点的Graph。然后实现一个使用单词的图生成诗歌的类
-
-
- Get the code and prepare Git repository
-
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
从实验指南中发布的链接上直接下载获取
-
-
- Problem 1: Test Graph <String>
-
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
- testadd():测试能不能加入新顶点
- testSet():测试能不能加入一条新边
- testRemove():在图中加入一条边,然后删除某顶点,测试这条边是否还存在
- testVertices():向图中加入顶点测试集合是否正确
- testsSources():向图中加入顶点和边测试是否返回源头点和权重
- testTargets():向图中加入顶点和边测试测试某顶点相连是否正确
-
- Problem 2: Implement Graph <String>
-
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
-
-
-
- Implement ConcreteEdgesGraph
-
-
Edge:用source表示源点,target表示目标点,weight表示权重,编写get以上三种数据,然后检查是否存在非法数据
-
-
-
- Implement ConcreteVerticesGraph
-
-
Vertex:用vertexname表示顶点,map存储与改点有关的数据,check检查是否存在空顶点。
-
-
- Problem 3: Implement generic Graph<L>
- Make the implementations generic
- Problem 3: Implement generic Graph<L>
-
搜索所有的string并将其转换为L
-
-
-
- Implement Graph.empty()
-
-
利用conctreteedgesgraph()实现Graph.empty()
-
-
- Problem 4: Poetic walks
- Test GraphPoet
- Problem 4: Poetic walks
-
借助测试用例实现功能
-
-
-
- Implement GraphPoet
-
-
从文本中获得单词图,返回处理好的字符串
-
-
-
- Graph poetry slam
-
-
-
-
- 使用Eclemma检查测试的代码覆盖度
- Before you’re done
-
请按照C:\Users\a\Downloads\before_youre_donehttp://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
在这里给出你的项目的目录结构树状示意图。
-
- Re-implement the Social Network in Lab1
在这里简要概述你对该任务的理解。
在定义了Graph的情况下,实现friendshipgraph类
-
-
- FriendshipGraph类
-
给出你的设计和实现思路/过程/结果。
用Graph表示人物关系
Addvertex()添加顶点
Getdistance()寻找最短路径并返回路径长度
-
-
- Person类
-
给出你的设计和实现思路/过程/结果。
Name表示顶点名字。
Distance表示最短距离。
Map存储所有相连顶点及其权重
List存储所有相连顶点
Check检查是否有重复级和空元素
-
-
- 客户端main()
-
给出你的设计和实现思路/过程/结果。
由lab1实验指南可得
-
-
- 测试用例
-
给出你的设计和实现思路/过程/结果。
-
-
- 提交至Git仓库
-
如何通过Git提交当前版本到GitHub上你的Lab3仓库。
Git add
Git commit -m “xxxx”
Git push origin master
在这里给出你的项目的目录结构树状示意图。
- 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 计划任务 | 实际完成情况 |
2021/6/5 | 19:00-22:00 | 3.1 | 完成 |
2021/6/7 | 19:00-22:00 | 3.2 | 粗糙完成 |
2021/6/13 | 12:00-16:00 | 修改bug,完成报告 | 完成 |
- 实验过程中遇到的困难与解决途径
遇到的难点 | 解决途径 |
函数较为复杂,编写过程中多次出现问题 | 继续练习,熟练编写技巧 |
分析图中关系时顺序混乱 | 从头理头绪 |
- 实验过程中收获的经验、教训、感想
- 实验过程中收获的经验和教训
丰富了对于不同类的理解和应用,进一步提高了编程和算法能力
-
- 针对以下方面的感受
- 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
ADT能够复用数据结构和一系列方法,让代码更加清晰
- 使用泛型和不使用泛型的编程,对你来说有何差异?
泛型更方便但限制条件多
- 在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
在一边实现具体类时可以一边测试,利于修改
- P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
能够提高效率
- P3要求你从0开始设计ADT并使用它们完成一个具体应用,你是否已适应从具体应用场景到ADT的“抽象映射”?相比起P1给出了ADT非常明确的rep和方法、ADT之间的逻辑关系,P3要求你自主设计这些内容,你的感受如何?
还没理解透彻,仍感到一些困难
- 为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
使开发者能够注意步骤,避免编程混乱
- 关于本实验的工作量、难度、deadline。
工作量比较大,需要比较长的时间
- 《软件构造》课程进展到目前,你对该课程有何体会和建议?
学会了如何提高效率,实现更好的编译