游戏24点课程设计报告.doc_第1页
游戏24点课程设计报告.doc_第2页
游戏24点课程设计报告.doc_第3页
游戏24点课程设计报告.doc_第4页
游戏24点课程设计报告.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

游戏24点课程设计报告一.题目:分析类:计算24点:任意输入4位数字,利用+,-,*,/四则运算使之得到结果 24。输出所有不同算法的计算表达式,可为运算优先级而使用括号。二.问题分析:1.全面性:此问题要求输出结果为24的计算表达式,并且要求输出要全面,我考虑用for循环与递归实现遍历来保证输出的全面性,考虑到递归的一归到底,每一次完整递归都代表一种算法(详情见算法)。2.输出的判定和四位数字的类型:在输出的时候对最后结果等于24的判别,因为考虑到有除法,有可能中途结果可能会出现不能整除的情况与小数,所以输出的四个数都设为float型,且输出判定的时候用近似判定法,而不直接写让最后结果等于24(详情见算法)。3.重复性:如果用循环与递归保证了输出24的表达式的全面性,但不可避免的会出现重复,才开始我想在遍历与递归时,加一些限定条件来消除重复但是这样做不但会出错,还不能保证它的输出全面性。于是我想在输出的时候加限定条件,使重复的只输出一遍。但是对于输入的那4位数字中如果有重复的话,程序结果还是会出现重复的,此问题尚未解决.(详情见算法)。4.括号问题的处理:对于括号问题,我规定对每一步的计算表达式,除了*之外,+,-,都加上括号,即让程序按自己规定的方向执行,输出的括号只是让人能看懂,其实在运算时不起作用(详情见算法)。5.输出:输出方面我以为用了遍历所以在每一层遍历都把运算表达式存到一个较大的数组中,在输出的时候如果满足输出条件(在遍历时纪录每次递归的第一次运算的结果,第一次运算的运算符,第二次运算的结果,第二次运算的运算符和第三次运算的运算符),就直接把那个数组里的内容输出,遍历会直接去寻找表达式里的表达式(详情见算法)。三.算法描述(源代码里有更详尽解释):1.主要方法:遍历与递归。2.主要思路:把输入的四个数放在一个数组n4中,然后任取其中任意两个(不能取同一个-既不能出现自己和自己运算的情况),然后用一个for和一个switch语句来实现这两个数的加减乘除运算, 然后把运算的结果放到另一个数组b4中并记录此运算的表达式(放到一个大一点的数组tm425中),同时把其他两个没用到的数也放到该数组中,然后重复以上过程(用遍历实现),最后先判定是不是最后一层运算,是的话在判定最后结果是不是等于24,等于24的话就把那个纪录运算式的数组输出。然后考虑到不能出现重复的(例如:1*2*3*4和2*4*3*1等等)我在遍历的同时记录了第一次运算的结果,第一次运算的运算符,第二次运算的结果,第二次运算的运算符和第三次运算的运算符,对输出的时候做限定(例如:对运算符全*的只输出一遍等等)。在有一次输出后我还定义了另外两个数组用来分别保存上一次输出的第一次运算的结果,第一次运算的运算符,第二次运算的结果,第二次运算的运算符和第三次运算的运算符,来解决重复输出的问题,不过此种做法有可能导致输出的时候不全。(此问题尚未解决)即还不能同时保证全面性与不重复性。主要函数与数组:主要有两个函数,一个主函数,用来输入四个数,并且完成初始化。还有一个count(float a,char tem25,int n)函数,用来完成遍历,递归,与输出,其中a中存放要输入的4个数,tem25中放计算步骤,n是a中元素的个数。在函数体内还定义了b4和tm425用来完成递归,函数一开始先判定输出条件(是否是第三次运算,结果是否等于24),如果不满足条件就做遍历与递归,遍历用了3个for循环和1个switch语句来完成,然后为递归准备数据,用sprintf函数将运算式输出到数祖tm中,在输入运算式的同时把括号输到tm中,然后提取第一次运算的运算符与运算结果,提取第二次运算的运算符与运算结果和提取第三次运算的运算符,然后备份没用到的数据(为递归之用)。接下来进行递归重复上述过程。4.算法流程图:(简化的流程图,源代码里有更详尽解释) 四.源代码及其分析#include#include#include#include#include#include#define max 4;/最大输入个数。int k=0;/全局变量 用来判定是否有解char tp4=0,0,0,0,tpt2000=0,tptt2000=0,tre2000=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,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; 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比较。/相当于等于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时,第一第二个运算符是+,+的只输出一遍else if(tp3=*&tp2=*)if(r=0)coutn有解为tem0=24;/最后的运算式存在tem0中k=1;r=1;else if(tp3=*&tp0=*&tp1=+)if(tu=0)coutn有解为tem0=24;/最后的运算式存在tem0中k=1;tu=1;else for(h=0;hq;h+)if(group0=flowh) if(tp3=tpth) if(tp2=tptth)if(group1=floh)if(p=0) coutn有解为tem0=24;/最后的运算式存在tem0中k=1;p=1; else if(h=q-1) coutn有解为tem01)/该条件语句用来结束一次递归。for(i=0;in;i+)/对n个 数做+,*,-,/遍历。for(j=0;jn;j+)if(i=j) continue;for(l=0;l4;l+)/进行四则运算。switch(l)case(0): if(n=2)b0=a0+a1;break; else b0=ai+aj;break;case(1):if(n=2) b0=a0*a1;break;elseb0=ai*aj;break; /对加和乘做遍历时去除ai+aj与aj+ai等情况。case(2): b0=ai-aj;break;case(3):if(aj=0)break; b0=ai/aj;break; /对-和/做遍历时考虑ai-aj与aj-ai的不同。default:break;/switchif(l!=3|aj!=0)/为递归准备数据(把没用到的数也放到b与tm中)。 if(l=0|l=2|l=3) /用sprintf函数将运算式输出到数祖tm中。/在输入运算式的同时把括号输到tm中。sprintf(tm0,(%s%c%s),temi,opl,temj); if(l=1) sprintf(tm0,%s%c%s,temi,opl,temj);if(n=3)/提取第一次运算的运算符与运算结果。group1=b0; if(i!=0&j!=0)tp0=opl; elsetpn-1=opl;else if(n=4)/提取第二次运算的运算符与运算结果。tpn-1=opl;group0=b0;else /提取第三次运算的运算符。 tpn-1=opl;for(x=0,y=1;xn;x+)/备份没用到的数据(为递归之用)。 if(x!=i&x!=j) by=ax; strcpy(tmy,temx);/复制字符串。 y+; /if /for/ifcount(b,tm,n-1);/第三层for循环结束。/第二层for循环结束。/for循环结束。/if 结束。/count函数结束。五.运行数据测试1输入数据(以空格分开)2回车后出运行结果3按0退出六.心得体会设计本程序,起因于儿时的游戏24点,游戏简单富有思考价值。程序数据结构是用的树,每一片叶子代表一种算法,从根开始为一个结点(第一层,第一次计算有48种情况,所以第二层有48个结点,第二次计算有24种情况,所以第三层有48*24个结点,即第二层的每一个结点有24个分支,最后一次计算有两种情况,所以第三层的每

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论