收藏 分享(赏)

扑克牌游戏2.doc

上传人:yjrm16270 文档编号:6982718 上传时间:2019-04-29 格式:DOC 页数:22 大小:250KB
下载 相关 举报
扑克牌游戏2.doc_第1页
第1页 / 共22页
扑克牌游戏2.doc_第2页
第2页 / 共22页
扑克牌游戏2.doc_第3页
第3页 / 共22页
扑克牌游戏2.doc_第4页
第4页 / 共22页
扑克牌游戏2.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、本科学生实验报告C+课 程 设 计组长姓名 黄跃武 组长学号 0104024 专 业 软件工程 班级 软件 105 班 实验项目 扑克牌游戏问题 实验类别 综合性实验 指导教师 严军勇 开课学期 2011 至 2012 学年 第一 学期一、 实验设计方案实验名称:扑克牌游戏问题实验时间: 2011-11-122011-11-26实验场地: w101软件环境: VC6.0/Windows XP小组成员姓名与学号:黄强 01040261、实验内容与目的(简单介绍实验内容,说明实验目的)实验目的:实现扑克牌游戏:对于任意的四个 1 到 13 的整数(四张扑克牌) ,求能算出 24 的表达式;运算符有

2、 ()+-*/;若无解则输出相应的信息。实验内容:文件输入(input.txt)输出(output.txt),输出全部结果;输入输出格式自定。2、实验准备工作(阐述解决问题所涉及的算法思想,至少要画一个算法流程图来说明)算法思想:本实验采用类似于穷举法,结合堆栈来实现的。首先是穷举法的过程,采用+、- 、*、/、 (、 )使四个数计算成 24,可以将表达式分为 3 种情况:1. 无括号,组成的表达式中只有四个数和三个运算符,总共 7 个字符;2. 有一个括号,组成的表达式中有四个数、三个运算符、一个括号,总共 9 个字符;3. 有两个括号,组成的表达式中有四个数、三个运算符、两个括号,总共 1

3、1 个字符将输入的四个数进行全排列,根据四个数字中有多少个相同数字将全排列后的组数可以分 4 种情况:1. 四个数都不相同,全排列后的种数为 4*3*2*1=24;2. 四个数中有两个相同,全排列后的种数为 4*3*2*1/(2*1)=12;3. 四个数中有三个相同,全排列后的种数为 4*3*2*1/(3*2*1)=4;4. 四个数中有三个相同,全排列后的种数为 4*3*2*1/(4*3*2*1)=4;为避免全排列的中有相同的排列,首先将四个数 24 种全排列存放在二维数组中(sort244) ,此时若属于第 2、3、4 种情况时, sort244中有重复的排列,则利用循环语句将 sort24

4、4中的排列转存至 ZL_sort244(元素初值全为24) ,并用 m 计算二维数组 ZL_sort244中的排列数,下次比较时将 sort 中的元素与 ZL_sort 进行比较,若 sort 中的这种排列与 ZL_sort 中的 24 种排列都不相同,则写入 ZL_sort 中,并成为第 m+1 个元素。处理没有括号的情况,此时需要进行三步运算,运算符的选取方法总共有4*4*4=64 种情况,用一个二维数组 char_sort643存储选取的 64 种运算符。那么表达式的排列有 m*64 种,将这 m*64 种情况存入二维数组 x15368(1536表示 m 取最大值 24 时 m*64=1

5、536,8 表示 4 个数、3 个运算符、# ,#在处理堆栈时应用),且处理时满足条件则 n+(n 初始值为 0) 。处理一个括号的情况,可以分为(ab)cd、a(bc)d、ab(cd)、(abc)d、a(bcd)五种情况,所有的排列种数为 4*4*4*5 种情况,显然存在许多不必要排列,例如:(a+b)+c+d、(a*b)+c-d、a+(b*c)-d没有必要添加括号,可以当作无括号的情况处理,经过分析之后,总共有 112 种情况。那么表达式的排列有 m*112 种,将这 m*112 种情况存入二维数组 x1268810(2688 表示 m 取最大值 24 时 m*122=2688,10 表示

6、 4 个数、3 个运算符、 (、 ) 、#,# 在处理堆栈时应用)。因为括号分为 5 种情况所以处理时也须将这五种情况一一考虑,且处理时满足条件则w+(w 初始值为 0) ,w 在这 5 种情况中连续使用。处理两个括号时情况,此时只有(ab)(cd)这种情况时括号才有意义,也不和前面的表达式重复,总共有 2*2*2=8 种情况。那么表达式的排列有 m*8 种,将这 m*8种情况存入二维数组 x19212(192 表示 m 取最大值 24 时 m*8=192,12 表示 4个数、3 个运算符、 2 个括号、 #,#在处理堆栈时应用 ),且处理时满足条件则v+(v 初始值为 0) 。利用穷举法已经

7、将所有的表达式给出,此时只需将表达式植入堆栈中进行运算即可。处理堆栈运算首先要建立两个栈类型,一个是整形用来存放数字,一个字符型用来存放运算符;然后创建两个空栈,在字符栈中首先压入字符# ,以便一个表达式执行完后(表达式中最后一个字符为#和首先压入的# 抵消)退出;最后进行表达式的运算,表达式的运算是出栈和入栈的操作:若读入数据为数字,则直接入操作数栈,若读入的数据是字符,则与栈中栈顶元素进行优先级比较,小于则直接入栈,等于则消去栈顶元素,大于则取出操作数栈中的栈顶元素和次栈顶元素进行运算。算法流程图:4 个数全排列:i,j,k,l 取 0-3 中不同的值将 si.sj.sk.sl依次存入二维

8、数组 sortm(0.1.23)中将 sortm0.sortm1.sortm2.sortm3与 ZL_sort 中 0-24 进行比较全部不相同ZL_sortn=sortm,m+,n+m=24否结束是运算符间的优先关系:表达式求值:二、实验步骤、测试与结果分析1、源程序的设计(在此附上源程序(cpp 文件)清单)#include#includeusing namespace std;#define STACK_INIT_SIZE 100 /栈申请分配存储空间的大小#define STACKINCREMENT 10 /栈分配空间不足时增加存储空间int c4; /输入的4个数char s4; /

9、+、-、*、/四种运算符int sort244; /4个数的24种全排列int ZL_sort244; /整理后4个数的全排列char char_sort643; /无括号时运算符排列char x15368; /无括号时表达式排列char x1268810; /一个括号时表达式排列char x219212; /两个括号时表达式排列int i,j,k,l; int m; /整理后4个数的全排列数int n; /无括号时表达式排列数int w; /一个括号时表达式排列数int v; /两个括号时表达式排列数/=24种全排列=void Sort(int h)int count=0; /整形变量计算种

10、类的多少for(i=0;i=S.stacksize) /如果存储空间不足,再次申请S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char);if(!S.base) exit(0);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e; /插入的元素为新的栈顶元素return 1;/=在数字栈中插入元素=int Push_N(SqStack_N if(!S.base) exit(0);S.top=S.base+S.stacksize;S.s

11、tacksize+=STACKINCREMENT;*S.top+=e;return 1;/=栈顶元素赋值给常数e=int Pop_T(SqStack_T /栈为空e=*-S.top;return 1;int Pop_N(SqStack_N e=*-S.top;return 1;/=取栈顶元素=char GetTop_T(SqStack_T S) char e;if(S.top=S.base) return 0; /栈为空e=*(S.top-1);return e;int GetTop_N(SqStack_N S) int e;if(S.top=S.base) return 0;e=*(S.to

12、p-1);return e;/=运算符优先级=char OP77=, , , , , , , , , , , , , , , , , , , , , , , , E, , , 6|Operator26) exit(0);/不是合法运算符,退出 return OPOperator1Operator2; /返回两运算符的关系/=对两个数进行运算=int Operate(int a,char theta,int b)int s;switch(theta)case +:s=a+b;break;case -:s=a-b;break;case *:s=a*b;break;case /:if(b!=0) s

13、=a/b;else break;return s;/-/=无括号时的组合=void ZL_2sort()/Sort();/ZL_Sort();/ZF_Sort();n=0;for(i=0;i:Pop_T(OPTR,theta);Pop_N(OPND,b);Pop_N(OPND,a);Push_N(OPND,Operate(a,theta,b);break;return GetTop_N(OPND);int main()ofstream outfile(“output.txt“,ios:out);/定义文件流对象,打开output.txt文件if(!outfile) /如果打开文件失败,outf

14、ile返回0值cout“f;if(f=Y|f=y)ofstream output(“input.txt“);if(!output)coutci;for(j=0;j4;j+)if(cj=0)cout“未读到有效数据,请写入数据后再打开本程序。“endl;system(“PAUSE“);return 0;ofstream output(“output.txt“,ios:app);if(!output)cout“文件打开失败!“endl;exit(1);output“endl;num=0;for(i=0;i4;i+)outputci“ “;output“等于24的表达式:“endl;Sort(c);

15、ZL_Sort();ZF_Sort();ZL_2sort();char ch8;/cout“无括号时的解:“endl;for(i=0;in;i+)for(j=0;j8;j+)chj=xij;z=EvaluateExpression(ch);if(z=24)num+;outputnum“.“;for(k=0;k7;k+)if(!In(chk)t=chk-0;outputt;else outputchk;outputendl;ZL_1KSort();char ch110;/cout“一个括号时的解:“endl;for(i=0;iw;i+)for(j=0;j10;j+)ch1j=x1ij;z=Eva

16、luateExpression(ch1);if(z=24)num+;outputnum“.“;for(k=0;k9;k+)if(!In(ch1k)t=ch1k-0;outputt;else outputch1k;outputendl;ZL_2KSort();char ch212;/cout“两个括号时的解:“endl;for(i=0;iv;i+)for(j=0;j12;j+)ch2j=x2ij;z=EvaluateExpression(ch2);if(z=24)num+;outputnum“.“;for(k=0;k11;k+)if(!In(ch2k)t=ch2k-0;outputt;else

17、outputch2k;outputendl;for(i=0;i4;i+)coutci“ “;cout“等于24的表达式共有“num“个解,结果已保存在文件“output.txt”中。“endl;if(num=0) output“无解“endl;output.close();infile.close();system(“PAUSE“);return 0;3、实验现象及结论(应用文字和程序运行的截图说明程序测试现象,并解释结果)在主函数开头创建 output.txt 文件为下面输出作准备,程序运行时创建 input.txt 文件输入 y 或 Y 选择创建 input.txt此时关闭程序,发现在放程

18、序的文件夹中有 input.txt 和 output.txt 文件,在input.txt 文件输入四个数(可多次输入,用 enter 隔开)再次运行程序如果输入的是无效数字则显示没有得到数据4、实验总结(是否成功解决问题,总结实验中最有价值的内容,程序能够在哪些方面进一步改善,自我评价成败得失)本次实验基本上达到了实验目的,我觉得此次实验中让我收获最大的是堆栈的应用,堆栈操作是一个复杂的操作,而且在编程时没有哪里错了计算机并不会提示,所以你必须深入的了解堆栈知识。实验开始时我们没有什么头绪,总觉得脑子里有一个坎,很难翻越。于是开始上网查资料,网上的代码杂七杂八的,我所查阅的资料中没有运行满意的

19、,都有重复;不过我可以得出两点结论:穷举法、递归法。经过一番思考之后,决定用穷举法,虽然办法是笨了点,算法精度也不是很好,但是将数字和运算符结合成表达式进行求值思路开阔,而且堆栈操作在数据结构中有类似代码。但是在穷举法的过程中遇到许多问题:该怎么穷举才不会有重复?括号要有意义怎么办?怎么转换成表达式?怎么压入栈中计算表达式?经过我们的努力,也花了很长时间,终于把这些问题一一解决。在处理堆栈过程中最让我头疼的问题是超过 9 的整数应该怎么入栈?因为将它直接压入栈时程序总是没有反应,查资料后,我们将它分为两部分进行,例如 13=1*10+3代码如下:Pop_N(OPND,e);e=e*10+c-0;Push_N(OPND,e);COUNT+;c=chCOUNT;由于时间等等因素,程序中还有一个问题没有解决,那就是除法的精度损失问题和除法本身的运算问题。例如:5/4*(12+12)是四个数运算等于24的一个解;如果时间允许的话,这方面的问题有待处理。-5、任务分工与组员成绩系数(该内容由组长完成)组长负责设计应该采用的算法和程序的输入与输出,并写实验报告;组员负责调试程序,发现不足之处时和组长讨论后改进程序。组员成绩系数:1.0指导老师评语:得分: 签名:严军勇年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报