编码阶段
代码规范
google开源项目风格指南——C++风格指南
https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/
发给组内成员都看了。。尽量按照这个标准写吧
编码过程
这次是结对(实际上是3个人)编程,所以和之前的个人编程有了一些不同的地方
首先是先做了分工,一共4个类,其中QuestionGenerator和QuestionCalculator是做主要工作的类,其他两个类Fraction和Question类的内容稍少些,我负责Fraction和Question两个类,其他两人各负责生成和计算类。不过其他两个类的代码我也看过...
Fraction类
就是分数的计算,约分。分数计算很简单,分子分母的运算
约分,用的是暴力搜因子的算法(之前没有乘方,以为数不会很大,加了乘方之后发现会浪费很长时间在约分里面的循环里。甚至,数有时候可能会越界,就成死循环了),所以为了避免这种情况,增加了溢出判断,出现负数,或者分子分母大于10000,则直接停止计算,返回-1。因为本身四则运算也不应该涉及到这么大的数字,所以不会对需求造成影响。
Question类
生成或计算的函数通过调用QuestionGenerator和QuestionCalculator类的接口函数来实现。
其中生成函数中包含了保存生成的算式到文件的代码。
QuestionGenerator类
具体过程是
(1)根据设置生成算式:
根据随机数,和设定的算式长度、运算符出现概率,生成不带括号的算式。再根据括号生成概率,再在算式基础上加成对的括号,要求括号间只能是包含或者相离的关系。
(2)判断算式是否和之前生成过的所有算式重复 IfSame():
先对刚生成的该算式,将中缀转后缀,然后用后缀表达式,利用栈,进行计算的过程。计算过程中将出栈的每对操作数、和最后栈顶的操作数,保存到Question类中的存储中间结果的数组中,以后就不用再算了。
完成这之后,遍历之前生成的每个算式,判断这些每对中间结果是否都和刚生成的题一样,如果都一样则重复,有不同的则一定不重复,直接返回不重复即可。
(3)判断生成的问题是否太难 IfTooHard():
因为已经保存了刚才的操作数,则可以方便的判断每步运算的难度。设置了每步的运算不能出现负数,且每步运算的分子或分母都不能超过300。 要做到这点,在保存的中间结果中检查是否每个中间结果都满足此要求即可。
QuestionCalculator类
先中缀转后缀,再利用堆栈求解后缀表达式的值
中缀转后缀具体过程:(用了一个栈)
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
编码阶段中对类的设计的调整
在编码过程中有些类的设计又做了调整:
Fraction类:
增加了将分数类转换为字符串的操作(ToString()函数),方便其他类生成或计算时直接调用
Question类:
增加了返回某道题中缀表达式的接口函数,因为最终的main函数里会用到
QuestionGenerator类、QuestionCalculator类:
增加了具体实现过程中用到的函数,比如中缀转后缀的函数、计算后缀表达式的函数、判断题目是否重复、是否太难的函数
团队编程中版本管理工具Git的使用
从只会基础的拉取(pull)和提交(commit然后push)操作,到后来遇到了两个人同时编辑一个文件,一方提交之后,我这提交不上去的情况。然后学会了merge等有用的操作。
git感觉就是给团队用的,现在体会到了使用git之后代码管理的方便,可以每个人同时进行自己部分的编码,然后再进行整合。提高了效率