1.本次作业GitHub地址
2. PSP表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
.Estimate | 估计这个任务需要多少时间 | 2000 | |
Development | 开发 | ||
.Analysis | 需求分析 (包括学习新技术) | 220 | |
.Design Spec | 生成设计文档 | 160 | |
.Design Review | 设计复审 (和同事审核设计文档) | 140 | |
.Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 40 | |
.Design | 具体设计 | 400 | |
.Coding | 具体编码 | 400 | |
.Code Review | 代码复审 | 250 | |
. Test | 测试(自我测试,修改代码,提交修改) | 220 | |
Reporting | 报告 | ||
.Test Report | 测试报告 | 200 | |
.Size Measurement | 计算工作量 | 30 | |
·Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 50 | |
Sum | 合计 | 2110 |
3.接口设计方法
在类的内部提供若干方法,属性为类内私有,调用者调用函数的时候输入合法的参数即可。
4. 计算模块的设计与实现过程
算法说明
首先是对输入文本的处理,将输入的一个个单词当作图上的一个个点进行处理,采用邻接矩阵来储存边与边之间的距离,距离为被指向单词的长度。之后先对所有的单词进行拓扑排序,排序后可以知道这个图是不是有环的(如果有环那么排序后顶点的数量将少于图本身点的数量),从而采用两种不同的方法处理。如果图是无环的,那么就用动态规划的算法来求出最长的路径长度和路径,如果要指定首字母,那么就在选择起点的时候选择符合的首字母作为起点;如果要指定尾字母,那么就对找到的路径从头开始检查,因为是无环的图,所以当找到指定的尾字母后,至多还有其后面的单词也为同样的尾字母,这样就找到了符合要求的单词链。如果图是有环的,那么就用DFS搜索每个点作为起点的最长路径然后排序比较即可,如果指定首字母就选择符合要求的起点;如果指定尾字母就看符合要求的尾字母的链那个最长即可。
5. UML图
-该图为自动生成的,和队友的差不多
6.计算模块接口部分的性能改进
我们小组开始没有对搜索进行优化,所以说有时候进行了大量的无用搜索。我们主要对这个拓扑排序进行了优化,减少了很多不必要的搜索。其次就是在处理-r参数时,我们先判断了图,如果没有环,仍然调用拓扑排序来做。这样就减少了很多时间开销。我们这个改进大概总共花费了6个小时吧
7. 看Design by Contract, Code Contract的内容,描述这些做法的优缺点, 说明你是如何把它们融入结对作业中的
优点:保证了双方的代码质量
缺点:并不是所有程序设计语言都有断言机制。
8. 计算模块部分单元测试展示
没有封装成core接口,所以测试不好做。TEST_METHOD(TestMethod1) { string xx = "test.txt"; ProcessNoRing p = ProcessNoRing(xx); p.init(); p.getWord(xx); Assert::AreEqual(2, p.wordNum); }
后续会改进
9.计算模块部分异常处理说明
-输入文件不存在
例如输入111.txt,但是在这个目录下没有这个文件,会报错:open file failed!!!
-输入的单词数量过多
例如输入五百个以上不同的单词的文件,会报错:too many words!!!
-输入了有环的指令但图中没有环
报错:topologicalSort successed! 表示可以拓扑排序,图中无环
-输入了无环的指令但图中有环
报错:topologicalSort failed! 表示不可以拓扑排序,图中有环
-输入的首字母有除了字母之外的字符出现
报错:illegimate input as first char X(表示错误的字符)
-输入的尾字母有除了字母之外的字符出现
报错:illegimate input as last char X(表示错误的字符)
-输入的某个单词自身首尾相同
不会报错,不会自身成环
-输入单个字母的单词
不会报错,视为正常单词
10.界面模块(如果没有实现GUI,则可以描述命令行模块)的详细设计过程
这个主要就是运用状态机的知识来处理这个命令行参数。
主要函数有下面三个
void FirstState(char *argv[]);
void SecondState(char *argv[]);
void ThirdState(char *argv[]);
这个主要就是识别到-r进入第一个状态,然后识别到-h或者-t进入第二个状态,最后-w,-c进入第三个状态。
在这个过程中,我们会把一些参数转为bool型变量。
void FirstState(char *argv[]) {
if (strcmp(argv[ArgvCnt], "-w") == 0 || strcmp(argv[ArgvCnt], "-c") == 0) {
process = strcmp(argv[ArgvCnt], "-w") == 0 ? 0 : 1;
ArgvCnt++;
ThirdState(argv);
}
else if (strcmp(argv[ArgvCnt], "-h") == 0 || strcmp(argv[ArgvCnt], "-t") == 0) {
ProStart = strcmp(argv[ArgvCnt], "-h") == 0;
ProEnd = strcmp(argv[ArgvCnt], "-t") == 0;
ArgvCnt++;
if (strlen(argv[ArgvCnt]) == 1 && isalpha(argv[ArgvCnt][0])) {
StartWord = argv[ArgvCnt][0];
EndWord = argv[ArgvCnt][0];
ArgvCnt++;
SecondState(argv);
}
else {
ErrorPrint(argv);
}
}
else {
ErrorPrint(argv);
}
}
部分函数如上所示。
11. 界面模块(GUI或命令行模块)与计算模块的对接
int EnalbleLoop; //是否允许单词环 (0不允许,1允许)
int process; //处理单词的方式 (0为单词数量,1为单词字母数)
int ProStart; //是否指定首字母(0不指定,1指定)
char StartWord; //首字母
int ProEnd; //是否指定尾字母(0不指定,1指定)
char EndWord; //尾字母
string fileName; //文件路径
如上所示,这个界面模块和计算模块主要就是通过这几个全局变量进行对接,命令行的参数已经完全转化为我们所需的参数,直接调用即可。
12. 描述结对的过程
我们结对编程大多时候就坐在一起写,偶尔通过QQ共享屏幕来一起完成。在思考方面,主要是各自上网搜集方法,我搜了无环的情况,他搜了有环的情况。然后他写了命令行输入的部分,我写了处理输入文件的部分,之后我完成了无环的部分,他完成了有环的部分,中间也一起讨论并告诉对方实现的原理。在结对的过程中,我们的确发现了对方编程时的bug,也统一了编程的风格,并且互相了解了对方完成模块的实现过程。
13. 说明结对编程的优点和缺点;结对的每一个人的优点和缺点在哪里
结对编程
结对编程的优点:可以让两个人互相监督对方,使得被监督者能*的专注,并且可以及时发现被监督者的bug
结对编程的缺点:两个人一起干一件事情,使得花费的时间变多,并且可能会闲聊。
队友
-优点1:开朗有热情
-优点2:随和有耐心
-优点3:踏实且认真
-缺点0:在时间规划上过于理想
自己
-优点1:不懂就问积极上网查找方法
-优点2:积极交流
-优点3:勇敢的发现bug
-缺点0:喜欢拖沓,实现部分功能便跑去做其他事情,不能一鼓作气
14.PSP表格回填
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
.Estimate | 估计这个任务需要多少时间 | 2000 | |
Development | 开发 | ||
.Analysis | 需求分析 (包括学习新技术) | 220 | 250 |
.Design Spec | 生成设计文档 | 160 | 120 |
.Design Review | 设计复审 (和同事审核设计文档) | 140 | 120 |
.Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 40 | 30 |
.Design | 具体设计 | 400 | 300 |
.Coding | 具体编码 | 400 | 500 |
.Code Review | 代码复审 | 250 | 200 |
. Test | 测试(自我测试,修改代码,提交修改) | 220 | 260 |
Reporting | 报告 | ||
.Test Report | 测试报告 | 200 | 100 |
.Size Measurement | 计算工作量 | 30 | 20 |
·Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 50 | 30 |
Sum | 合计 | 2110 | 1930 |