- 博客注明结对编程人员的名字/或学号后3位.
- 179
- 166
- 照至少一张照片, 展现两人在一起合作编程的情况。说明结对编程的优点和缺点。结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)。
结对编程优点
- 结对对编程两人合作,结对人员之间的优缺点互补,使得1 + 1 > 2。且在遇到难题时两个人讨论能够更快地解决问题,有时能够爆发出旷世奇作。
- 结对编程人员在遇到难题时可以向对方请教,对方也能在某些时候找出自己的BUG,毕竟有时候我们当局者迷。还能够做到随时沟通和交流,专业一点来说是代码复审,毕竟只有两个人。
- 当有人在和你一起做同一件事情的时候你会觉得很有依靠,就是开发和责任都是两个人分摊,能够让自己冷静下来全新投入工作。当然这样的结对中队员均想表现自己,向对方展示自己的能力,而自己看到了对方的能力后就会更加努力,这就是一个良性循环。
- 结对编程可以将代码层次分工,队员只需处理自己层次的代码,而不用关心其他代码,这降低了队员的工作量,减轻了负担,更利于编程。
- 结对编程能够学习对方的经验长处,培养我们的团队能力和意识。
结对编程缺点
- 只有两个人,在项目过大时两个人很难完成任务。
- 如果两个人对项目持有不同的意见,由于没有第三个人来评判,谁也说服不了谁,这样容易造成结对人员之间的间隙,不利于结对和谐,最终可能导致队员不欢而散。
结对成员
- 董元财
优点:
- 擅长界面编程
- 善于学习新技术
- 能钻研
缺点:
- 不太擅长算法
- 薄霖
- 码代码能力高,对C++语言熟练掌握
- 对结对分工明确,工作效率高
- 工作认真,责任心强
- 沟通方面稍有不足
- 看教科书和其它资料中关于 Information Hiding, interface design, loose coupling 的章节,说明怎样利用这些好的设计方法。
- Information Hiding,有利于分层编程,让我们不用考虑其他的实现细节,能更加注重自己任务的开发
- interface design,统一接口,使得我们在团队开发的过程中能够按照接口设计开发,而不用在实现代码时边写边讨论接口问题,大大提高了项目的开发效率。
- loose coupling,具有中立的接口定义(没有强制绑定到特定的实现上)的特征称为服务之间的松耦合。松耦合系统的好处有两点,一点是它的灵活性,另一点是,当组成整个应用程序的每个服务的内部结构和实现逐渐地发生改变时,它能够继续存在。SOA的一个关键特征是使用松散耦合连接。
- 看 Design by Contract, Code Contract 的内容,描述这些做法的优缺点, 说明你是如何把它们融入你的作业中的。
优点
- 能够减少项目的BUG,在后期测试的时候能够降低效率
缺点
- 开发的代码量增加了,项目也会变大
在我开发中我会对函数 传入的参数值进行判断,有时候会使用断言,有时候遇到不对的传入直接return。
- 通过截屏显示你是如何用VS 的unit test 来保证你写的类的质量的。显示unit test 对你的写的类(class) 的覆盖率
- 画出UML 图显示各个实体之间的关系 (画一个图即可)
- 说明你的算法的关键 (不必列出源代码), 以及独到之处。
借用了寝室另一个人的设计,即采用表达式树的形式储存题目并通过最小表示法来进行查重。
算法设计
我们本次项目沿用了上次我的个人项目的设计,只不过在其基础上添加了对负数、有无括号、有无乘除法的限制,以及对运算符个数的限制。
具体来说,对于四则运算题目生成的部分:
- 获取到传入的参数限制,包括运算符个数限制、数值限制、有无分数、有无负数
- 递归生成一个表达式树
- 递归进行表达式的正确性检验(是否出现了负数、除0以及不能整除的情况)
- 递归对表达式树进行最小表示
- 如果得到的算式之前没有生成过,则将该算式加入到生成队列中。
- 如果当前的表达式个数已经达到要求,则将表达式与答案返回。
其中,在生成表达式树的过程中,首先需要判断树中当前的节点是否为分支节点(即运算符)。如果当前的树的总结点数为0,那么该节点必须为分支节点,如果当前树中的分支节点已经打到了要求的上限,则该节点必须为叶子结点(即操作数)。有了这个信息之后,针对当前结点的类型不同,就可生成对应的结构,之后如果当前结点为分支节点的话,就递归生成其左右子树。
在对表达式进行正确性检验的过程中,如果当前结点为叶子节点,那么我们仅需要检验这个叶子结点的数值是否满足要求。否则,先递归对它的左右子树进行正确性检验,在确保左右子树正确的情况下,检验当前结点的运算是否会造成不合法的情况,如果有的话则进行修复。
在对表达式最小表示的过程中,同样是先递归对其左右子树进行最小表示,之后再看,如果当前结点为'+'或'×',则判断一下他的两个子树的hash值大小,在不改变运算顺序的前提下使表达式变为最小标识的形式。
检验算式仍然采用了第一次作业的形式,以一个STL的set来存放最小表示后的字符串,通过字符串的比较进行判重。
对于计算表达式结果的功能,仍然没什么好说的,采用了STL的两个栈来维护。
具体实现
Ditital类实现了分数的各种运算,Tree类则是存放表达式树。 Core类对操作进行了封装。
Tree类包含它的左右儿子两个指针,递归调用create_suanshi会创建一个suanshi类型的对象,并将其赋给当前子树的根,之后递归的进行生成。
Tree类仅对有无负数和分数进行了检查,对于乘除法的限制以及有无括号的限制则在生成字符串后进行判断。