1、计算24游戏课程设计 游戏24点设计1.算法描述(源代码里有更详尽解释): 主要方法:遍历与递归。2. 主要思路:把输入的四个数放在一个数组n4中,然后任取其中任意两个(不能取同一个-既不能出现自己和自己运算的情况),然后用一个for和一个switch语句来实现这两个数的加减乘除运算, 然后把运算的结果放到另一个数组b4中并记录此运算的表达式(放到一个大一点的数组tm425中),同时把其他两个没用到的数也放到该数组中,然后重复以上过程(用遍历实现),最后先判定是不是最后一层运算,是的话在判定最后结果是不是等于24,等于24的话就把那个纪录运算式的数组输出。然后考虑到不能出现重复的(例如:1*2
2、*3*4和2*4*3*1等等)我在遍历的同时记录了第一次运算的结果,第一次运算的运算符,第二次运算的结果,第二次运算的运算符和第三次运算的运算符,对输出的时候做限定(例如:对运算符全*的只输出一遍等等)。在有一次输出后我还定义了另外两个数组用来分别保存上一次输出的第一次运算的结果,第一次运算的运算符,第二次运算的结果,第二次运算的运算符和第三次运算的运算符,来解决重复输出的问题,不过此种做法有可能导致输出的时候不全。(此问题尚未解决)即还不能同时保证全面性与不重复性。3. 主要函数与数组:主要有两个函数,一个主函数,用来输入四个数,并且完成初始化。还有一个count(float a,char
3、tem25,int n)函数,用来完成遍历,递归,与输出,其中a中存放要输入的4个数,tem25中放计算步骤,n是a中元素的个数。在函数体内还定义了b4和tm425用来完成递归,函数一开始先判定输出条件(是否是第三次运算,结果是否等于24),如果不满足条件就做遍历与递归,遍历用了3个for循环和1个switch语句来完成,然后为递归准备数据,用sprintf函数将运算式输出到数祖tm中,在输入运算式的同时把括号输到tm中,然后提取第一次运算的运算符与运算结果,提取第二次运算的运算符与运算结果和提取第三次运算的运算符,然后备份没用到的数据(为递归之用)。接下来进行递归重复上述过程。4. 算法流程
4、图:(简化的流程图,源代码里有更详尽解释) 5.源代码及其分析#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,
5、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,(i
6、nt) 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)
7、/因为要考虑除法所以用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=2
8、4;/最后的运算式存在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;/
9、最后的运算式存在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个 数做+,*
10、,-,/遍历。 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; else b0=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-
11、ai的不同。 default:break; /switch if(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; else tpn-1=opl; else if(n=4)/
12、提取第二次运算的运算符与运算结果。 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 /if count(b,tm,n-1); /第三层for循环结束。 /第二层for循环结束。 /for循环结束。 /if 结束。/count函数结束。6.运行数据测试5.1 输入数据(以空格分开)5.2 回车后出运行结果5.3 按0退出东华理工大学学年课程设计报告评分表
13、学生姓名: 吴青山 学号: 201120360211 班级: 1123602 课程设计题目:计算24游戏 项目内容满分实 评选题能结合所学课程知识、有一定的能力训练。符合选题要求(3人一题)5工作量适中,难易度合理10能力水平能熟练应用所学知识,有一定查阅文献及运用文献资料能力10理论依据充分,数据准确,公式推导正确10能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等10能体现创造性思维,或有独特见解15成果质量模型正确、合理,各项技术指标符合要求。15摘要叙述简练完整,假设合理、问题分析正确、数学用语准确、结论严谨合理;问题处理科学、条理分明、语言流畅、结构严谨、版面清晰15课程设计报告主要部分齐全、合理,符号统一、编号齐全。格式、绘图、表格、插图等规范准确,符合课程设计报告要求10正文字数不少于2000字,不超过15000字5总 分100指导教师评语: 指导教师签名: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1