1、 游戏24点课程设计报告 一.题目: 分析类: 计算24点:任意输入4位数字,利用+,-,*,/四则运算使之得到结果 24。输出所有不同算法的计算表 达式,可为运算优先级而使用括号。 二.问题分析: 1.全面性: 此问题要求输出结果为24的计算表达式,并且要求输出要全面,我考虑用for循环与递归实现遍历来 保证输出的全面性,考虑到递归的一归到底,每一次完整递归都代表一种算法(详情见算法)。 2.输出的判定和四位数字的类型: 在输出的时候对最后结果等于24的判别,因为考虑到有除法,有可能中途结果可能会出现不能整除 的情况与小数,所以输出的四个数都设为float型,且输出判定的时候用近似判定法,而
2、不直接写让 最后结果等于24(详情见算法)。 3.重复性: 如果用循环与递归保证了输出24的表达式的全面性,但不可避免的会出现重复,才开始我想在遍历 与递归时,加一些限定条件来消除重复但是这样做不但会出错,还不能保证它的输出全面性。于是 我想在输出的时候加限定条件,使重复的只输出一遍。 但是对于输入的那4位数字中如果有重复的话,程序结果还是会出现重复的,此问题尚未解决.(详情 见算法)。 4.括号问题的处理: 对于括号问题,我规定对每一步的计算表达式,除了*之外,+,-,都加上括号,即让程序按自己规 定的方向执行,输出的括号只是让人能看懂,其实在运算时不起作用(详情见算法)。 5.输出: 输出
3、方面我以为用了遍历所以在每一层遍历都把运算表达式存到一个较大的数组中,在输出的时候 如果满足输出条件(在遍历时纪录每次递归的第一次运算的结果,第一次运算的运算符,第二次运算 的结果,第二次运算的运算符和第三次运算的运算符),就直接把那个数组里的内容输出,遍历会直 接去寻找表达式里的表达式(详情见算法)。 三.算法描述(源代码里有更详尽解释): 1.主要方法: 遍历与递归。 2.主要思路: 把输入的四个数放在一个数组n4中,然后任取其中任意两个(不能取同一个-既不能出现自己和 自己运算的情况),然后用一个for和一个switch语句来实现这两个数的加减乘除运算, 然后把运 算的结果放到另一个数组
4、b4中并记录此运算的表达式(放到一个大一点的数组tm425中),同 时把其他两个没用到的数也放到该数组中,然后重复以上过程(用遍历实现),最后先判定是不是 最后一层运算,是的话在判定最后结果是不是等于24,等于24的话就把那个纪录运算式的数组输出。 然后考虑到不能出现重复的(例如:1*2*3*4和2*4*3*1等等)我在遍历的同时记录了第一次运算的 结果,第一次运算的运算符,第二次运算的结果,第二次运算的运算符和第三次运算的运算符,对 输出的时候做限定(例如:对运算符全*的只输出一遍等等)。在有一次输出后我还定义了另外两个 数组用来分别保存上一次输出的第一次运算的结果,第一次运算的运算符,第二次运算的结果,第 二次运算的运算符和第三次运算的运算符,来解决重复输出的问题,不过此种做法有可能导致输出 的时候不全。(此问题尚未解决)即还不能同时保证全面性与不重复性。 主要函数与数组: 主要有两个函数,一个主函数,用来输入四个数,并且完成初始化。还有一个count(float a,char tem25,int n)函数,用来完成遍历,