《专业课程设计方案报告计算游戏.doc》由会员分享,可在线阅读,更多相关《专业课程设计方案报告计算游戏.doc(19页珍藏版)》请在金锄头文库上搜索。
1、 课程设计汇报 课程设计汇报题目:计算24游戏 姓 名:吴青山 学 号:20360211 专 业:数学和应用数学 班 级:1123602 指导老师:郭树蕻职 称:讲师 06月18日目录1.摘要.32.问题分析.33.算法描述.44.源代码及其分析.75.运行数据测试.126.心得体会.137.参考文件.13 游戏24点课程设计汇报1. 摘要:伴随科技发展和社会进步,尤其是计算机大范围普及,计算机应用逐步由大规模计算海量数据处理转向大规模事物处理和对工作流管理,这就产生以台式计算机为关键管理系统。在80年代成为一个流行游戏,在中国把这游戏叫做“24点游戏”。计算24点游戏:任意输入4位数字,利用
2、+,-,*,/四则运算使之得到结果 24。输出全部不一样算法计算表示式,可为运算优先级而使用括号。2.问题分析:2.1 全方面性:此问题要求输出结果为24计算表示式,而且要求输出要全方面,我考虑用for循环和递归实现遍一向确保输出全方面性,考虑到递归一归到底,每一次完整递归全部代表一个算法。2.2 输出判定和四位数字类型:在输出时候对最终结果等于24判别,因为考虑到有除法,有可能中途结果可能会出现不能整除情况和小数,所以输出四个数全部设为float型,且输出判定时候用近似判定法,而不直接写让最终结果等于24。2.3 反复性:假如用循环和递归确保了输出24表示式全方面性,但不可避免会出现反复,才
3、开始我想在遍历和递归时,加部分限定条件来消除反复不过这么做不仅会犯错,还不能确保它输出全方面性。于是我想在输出时候加限定条件,使反复只输出一遍。不过对于输入那4位数字中假如有反复话,程序结果还是会出现反复,此问题还未处理。2.4 括号问题处理:对于括号问题,我要求对每一步计算表示式,除了*之外,+,-,全部加上括号,即让程序按自己要求方向实施,输出括号只是让人能看懂,其实在运算时不起作用。2.5 输出:输出方面我认为用了遍历所以在每一层遍历全部把运算表示式存到一个较大数组中,在输出时候假如满足输出条件(在遍历时纪录每次递归第一次运算结果,第一次运算运算符,第二次运算结果,第二次运算运算符和第三
4、次运算运算符),就直接把那个数组里内容输出,遍历会直接去寻求表示式里表示式。3.算法描述(源代码里有更详尽解释):3.1 关键方法:遍历和递归。3.2 关键思绪:把输入四个数放在一个数组n4中,然后任取其中任意两个(不能取同一个-既不能出现自己和自己运算情况),然后用一个for和一个switch语句来实现这两个数加减乘除运算, 然后把运算结果放到另一个数组b4中并统计此运算表示式(放到一个大一点数组tm425中),同时把其它两个没用到数也放到该数组中,然后反复以上过程(用遍历实现),最终先判定是不是最终一层运算,是话在判定最终结果是不是等于24,等于24话就把那个纪录运算式数组输出。然后考虑到
5、不能出现反复(比如:1*2*3*4和2*4*3*1等等)我在遍历同时统计了第一次运算结果,第一次运算运算符,第二次运算结果,第二次运算运算符和第三次运算运算符,对输出时候做限定(比如:对运算符全*只输出一遍等等)。在有一次输出后我还定义了另外两个数组用来分别保留上一次输出第一次运算结果,第一次运算运算符,第二次运算结果,第二次运算运算符和第三次运算运算符,来处理反复输出问题,不过此种做法有可能造成输出时候不全。(此问题还未处理)即还不能同时确保全方面性和不反复性。3.3 关键函数和数组:关键有两个函数,一个主函数,用来输入四个数,而且完成初始化。还有一个count(float a,char t
6、em25,int n)函数,用来完成遍历,递归,和输出,其中a中存放要输入4个数,tem25中放计算步骤,n是a中元素个数。在函数体内还定义了b4和tm425用来完成递归,函数一开始先判定输出条件(是否是第三次运算,结果是否等于24),假如不满足条件就做遍历和递归,遍历用了3个for循环和1个switch语句来完成,然后为递归准备数据,用sprintf函数将运算式输出到数祖tm中,在输入运算式同时把括号输到tm中,然后提取第一次运算运算符和运算结果,提取第二次运算运算符和运算结果和提取第三次运算运算符,然后备份没用到数据(为递归之用)。接下来进行递归反复上述过程。3.4 算法步骤图:(简化步骤
7、图,源代码里有更详尽解释) 4.源代码及其分析#include#include#include#include#include#include#define MAX 4;/最大输入个数。int k=0;/全局变量 用来判定是否有解char tp4=0,0,0,0,tpt=0,tptt=0,tre=0;/用来消除反复。tp1-3用来统计运算式中3个运算符。char op4=+,*,-,/;void count(float a,char tem25,int n);/a中存放要输入4个数,tem25中放计算步骤,n是a中元素个数。int q=0,p=0,e=0,w=0,t=0,r=0,g=0,h=0
8、,v=0,u=0,tu=0,te=0;/用于消除反复。float group2=0,0,flow20=0,flo20=0;/tem25中放计算步骤,n是a中元素个数。void main() char br=1; int d;while (br=1) float number4;/放四个数。 char temp425; /放运算式,初始化放四个数。 coutplease insert four numbers:; coutendl; for(d=0;dnumberd;/输入四个数 for(d=0;d4;d+) sprintf(tempd,%d,(int) numberd); /初始化tempd;
9、 count(number,temp,4);/调用count函数。 if (k=0) coutno answer; coutendl; coutpress 0 endendl; scanf (%d,&br); void count(float a,char tem25,int n)float b4;char tm425;/b4和t4作用同上(为 递归之用)。int i,j,l,x,y;/i,j用来作双循环;l用来作加减乘除开关;x,y为后面准备递归数据之用。/*/输出部分if(n=1) if (fabs(a0-24)0.00001)/因为要考虑除法所以用fabs函数求绝对值和24比较。/相当于
10、等于24时情况。 /*/以下是限定输出条件:if(tp3=-&tp2=-&tp1=*) if(te=0)coutn有解为tem0=24;/最终运算式存在tem0中k=1;te=1;/对运算符全*只输出一遍。else if(tp3=+&(tp2=+|tp0=+)&tp1=+) if(t=0)coutn有解为tem0=24;/最终运算式存在tem0中k=1;t=1;/对运算符全+只输出一遍。else if(tp3=+&(tp2=*|tp0=*)&tp1=+) if(g=0)coutn有解为tem0=24;/最终运算式存在tem0中k=1;g=1;else if(tp3=-&tp2=+)|(tp3=+&tp2=-)if(w=0)coutn有解为tem0=24;/最终运算式存在tem0中k=1;w=1;/对于第二次运算时取到b0时,第一第二个运算符是+,-或-,+只输出一遍。else if(tp3=+&tp2=+) if(u=0)coutn有解为tem0=24;/最终运算式存在tem0中k=1;u=1;/对于第二次运算时取到b0时,第一第二个运算符是+,+只输出一遍