项目地址git
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 |
在类的内部提供若干方法,属性为类内私有,调用者调用函数的时候输入合法的参数便可。github
首先是对输入文本的处理,将输入的一个个单词看成图上的一个个点进行处理,采用邻接矩阵来储存边与边之间的距离,距离为被指向单词的长度。以后先对全部的单词进行拓扑排序,排序后能够知道这个图是否是有环的(若是有环那么排序后顶点的数量将少于图自己点的数量),从而采用两种不一样的方法处理。若是图是无环的,那么就用动态规划的算法来求出最长的路径长度和路径,若是要指定首字母,那么就在选择起点的时候选择符合的首字母做为起点;若是要指定尾字母,那么就对找到的路径从头开始检查,由于是无环的图,因此当找到指定的尾字母后,至多还有其后面的单词也为一样的尾字母,这样就找到了符合要求的单词链。若是图是有环的,那么就用DFS搜索每一个点做为起点的最长路径而后排序比较便可,若是指定首字母就选择符合要求的起点;若是指定尾字母就看符合要求的尾字母的链那个最长便可。算法
-该图为自动生成的,和队友的差很少编程
咱们小组开始没有对搜索进行优化,因此说有时候进行了大量的无用搜索。咱们主要对这个拓扑排序进行了优化,减小了不少没必要要的搜索。其次就是在处理-r参数时,咱们先判断了图,若是没有环,仍然调用拓扑排序来作。这样就减小了不少时间开销。咱们这个改进大概总共花费了6个小时吧函数
优势:保证了双方的代码质量
缺点:并非全部程序设计语言都有断言机制。oop
没有封装成core接口,因此测试很差作。
TEST_METHOD(TestMethod1) { string xx = "test.txt"; ProcessNoRing p = ProcessNoRing(xx); p.init(); p.getWord(xx); Assert::AreEqual(2, p.wordNum); }
后续会改进性能
-输入文件不存在单元测试
例如输入111.txt,可是在这个目录下没有这个文件,会报错:open file failed!!!学习
-输入的单词数量过多测试
例如输入五百个以上不一样的单词的文件,会报错:too many words!!!
-输入了有环的指令但图中没有环
报错:topologicalSort successed! 表示能够拓扑排序,图中无环
-输入了无环的指令但图中有环
报错:topologicalSort failed! 表示不能够拓扑排序,图中有环
-输入的首字母有除了字母以外的字符出现
报错:illegimate input as first char X(表示错误的字符)
-输入的尾字母有除了字母以外的字符出现
报错:illegimate input as last char X(表示错误的字符)
-输入的某个单词自身首尾相同
不会报错,不会自身成环
-输入单个字母的单词
不会报错,视为正常单词
这个主要就是运用状态机的知识来处理这个命令行参数。
主要函数有下面三个
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); } }
部分函数如上所示。
int EnalbleLoop; //是否容许单词环 (0不容许,1容许) int process; //处理单词的方式 (0为单词数量,1为单词字母数) int ProStart; //是否指定首字母(0不指定,1指定) char StartWord; //首字母 int ProEnd; //是否指定尾字母(0不指定,1指定) char EndWord; //尾字母 string fileName; //文件路径
如上所示,这个界面模块和计算模块主要就是经过这几个全局变量进行对接,命令行的参数已经彻底转化为咱们所需的参数,直接调用便可。
咱们结对编程大多时候就坐在一块儿写,偶尔经过QQ共享屏幕来一块儿完成。在思考方面,主要是各自上网搜集方法,我搜了无环的状况,他搜了有环的状况。而后他写了命令行输入的部分,我写了处理输入文件的部分,以后我完成了无环的部分,他完成了有环的部分,中间也一块儿讨论并告诉对方实现的原理。在结对的过程当中,咱们的确发现了对方编程时的bug,也统一了编程的风格,而且互相了解了对方完成模块的实现过程。
结对编程的优势:可让两我的互相监督对方,使得被监督者能被迫的专一,而且能够及时发现被监督者的bug
结对编程的缺点:两我的一块儿干一件事情,使得花费的时间变多,而且可能会闲聊。
-优势1:开朗有热情
-优势2:随和有耐心
-优势3:踏实且认真
-缺点0:在时间规划上过于理想
-优势1:不懂就问积极上网查找方法
-优势2:积极交流
-优势3:勇敢的发现bug
-缺点0:喜欢拖沓,实现部分功能便跑去作其余事情,不能一气呵成
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 |