标签:
这次的结对编程的作业相较于上次的作业看似只是核心功能的嫁接过程,但是程序这个东西尤其是对于实战经验并不很足的我来讲,其实还是很有难度的,因为在这次的作业要求中新加了很多的可以由用户定制的功能要求,那么以前的取巧一些的方法在对于这种可以随意定制功能的要求之下就显得力不从心,于是对我来讲这次的作业只有部分的算法的框架还留在程序中,从代码的角度来讲的话基本所有的代码都是被重构的,作为处女座的一员即便是当初可以用的代码,再一次复审的时候发现很多不和标准的地方的有悖于自己的强迫症的地方还是不能忍受的于是果断把绝大部分的代码都重构了
对应于罗老师的要求,我把自己的算法的流程也相应地附上,
需要支持的基本设定参数:
对于(1)生成的题目不能重复这个问题,为了在在时间个效率之间做一个trade off,我选用了简单的字符串比较的算法。
(2)支持负数的这个问题其实还是有很多的细节需要考虑的,比如运算符后面如果直接是负数的话是需要加括号的,同时在解析字符串的时候也增加了不少的难度 ,在解析字符串的时候我尝试应用了C#中自带的字符串解析的函数,但是没有收到很好的效果,对于程序的控制的粒度还是太大,于是还是自己默默写了个函数自己解析了。同时负的数值在显示的时候也有很多的细节要考虑,比如说分子分母同时是负数的情况,以及只有一个是负数的情况。
(3)在支持基本的参数的设定的这个问题上,由于参数的组合真的非常的多,我甚至想到了当年做计算机组成实验的时候通过编码解析硬件指令的方式。
(4)其中针对支持多少个运算符的问题上我设定了一个上限是20个,其实这个是对我上次程序的一个比较大的改进,上次的程序只能最对支持3个运算符,感觉这次要是还支持最多三个运算符的设定是不是就太low了,于是费了一些时间把支持1-20个运算符的设定程序完成了,我会根据传进来的参数设定生成的字符串模式,在这个模式串里所有的数字都是用a,b,c,d等字母表示的(于是你可能也清楚了为什么有支持的上限,因为字母的个数是有限的啊)然后我会在这个标准的模式串的基础上进行加括号的算法和将抽象的字母生成具体的数字的算法。
(5)对于题目中是否有括号这个问题,我把加括号的这个算法封装的一个过程中,于是可以方便地控制是否这个过程参与表达式的生成。
(6)对于是否有负数的这个问题,我会在产生表达式后将表达式的最终结果计算出来,而就在计算的过程中运用中缀表达式的算法会把每一步的计算的结果存放下来,如果出现了负数就返回null.那么本次的生成就作废,重新再去生成。
(7)对于算数中是否有分数这个问题,我把生成数字的函数写成了是个形式,生成正整数,非正整数,正分数,非正分数。通过这四个函数控制在把字母变成数字的过程中到底用哪一类的数字替代字母。
标签:
原文地址:http://www.cnblogs.com/whenever/p/4852292.html