计算24点 数据结构_第1页
计算24点 数据结构_第2页
计算24点 数据结构_第3页
计算24点 数据结构_第4页
计算24点 数据结构_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、目 录课程设计任务书 -1=课程设计任务书学生姓名: 赵旭林 专业班级: 计算机科学与技术0801 指导教师: 杨克 工作单位: 计算机科学系 题 目: 计算24点 初始条件:有2、3、4、5、6、7、8、9、10、J、Q、K、A共13张牌,编一程序,判断对任意给定的4张牌,能否在进行加、减、乘、除运算后,其运算结果等于24。其中J按11计算,Q按12计算,K按13计算,A按1计算。(1)能接受用户输入的4张牌点,并进行24点判断,并输出判定结果。(2)若能得到结果24,要求输出至少一个可得到该结果的计算表达式。 例如,对给定的2,7,J,Q,按下述方法计算可得到结果24: (J-7)*(Q/

2、2) 或 Q*(J-2-7) (3)若不能得到24点,亦应输出提示。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容: 1. 问题描述简述题目要解决的问题是什么。2. 设计存储结构设计、主要算法设计(用类C/C+语言或用框图描述)、测试用例设计;3. 调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。4. 经验和体会(包括对算法改进的设想)5. 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出。说明:1. 设计报告、程序不得相

3、互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。2. 凡拷贝往届任务书或课程设计充数者,成绩一律无效,以0分记。时间安排:1、第18周完成。2、7月2日8:30时到实验中心检查程序、交课程设计报告、源程序(U盘)。指导教师签名: 2010年 月 日系主任(或责任教师)签名: 2010年 月 日数据结构课程设计正文 -计算24点1. 问题描述在A、2、3、4、5、6、7、8、9、10、J、Q、K中任意选择4个数,通过这4个数进行任意+ 、- 、*、 /的运算(这四个数可以任意排列),而且可以添加需要的“()”来进行先后运算。看是否能够得到一个计算式,使得其结果为24。如果有,则输出所有的计算式

4、,如果没有,则输出相应的提示。例如,对给定的2,7,J,Q,按下述方法计算可得到结果24,并且输出下列的表达式: (J-7)*(Q/2)=24 Q*(J-2-7)=24 由于输入有A、J、Q、K字符型数据,所以把输入数据存放在char字符型数组中,并且在程序内部定义一个数组,把输入的字符型数据一一转换为相对应的int整型,其中A代表为1,J代表为11,Q代表为12,K代表为13。约束条件:输入的4个数不能为重复,如果重复,则输出错误提示,并要求重新输入。而且输入的数不能在所要求的数之外,如果输入了不在输入范围内的数,则也应该输出相应错误提示,并要求重新输入。2.实验设计2.1 算法设计:采用穷

5、举法,把所有可能的情况一一计算,如果计算式得到24,则把相应的计算式输出;假设选择A B C D四张牌,#代表操作符,则有以下五种情况: 1.(A#B)#C)#D 2.(A#B)#(C#D) 3.(A#(B#C)#D 4.A#(B#C)#D) 5.A#(B#(C#D)把这些计算式都变成两两计算的情况,因此可以把一个计算式分成三个由两个运算数组合而成的计算式。其中的“#”可以是+、-、*、/ 中的任何一种运算,并且可以重复。A、B、C、D不能重复。由于按照以上的方法,ABCD的顺序固定,从而导致有一些情况不能被计算在内,所以需要列举出ABCD所有可能的排序状况,再将A B C D所有的排列组合一

6、一按照上面的五个计算式计算。这样就能把所有有可能的情况都包含进去,不会漏掉某个有可能得到24点的算法。对四个数没进行完一次排序,则对新的排序序列进行24点计算式比较,如果有计算式,则输出所有的计算式,如果没有,则输出提示。现在程序外定义一些全局变量:cal r,w,t;/三个操作符类char data10;/输入的数据int _data10;/把牌转化为数字之后存放的数组bool find=false;/如果find为false,则代表没有24点计算式,如果为true,则代表有主函数伪码设计为:int main()tranput();/输入数据;tran();/转换数据;trandata();

7、/处理数据;if(find=false)/如果没有能得到24点的计算式,输出提示;return 0;定义4个函数,分别完成相对应的功能。void tranput();/作用是让用户输入选择的牌;void tran();/把字符型的输入转换为对应的数字,A代表1,J代表11,Q代表12,K代表13;void look();/对于4张牌的一个组合寻找能得出点的表达式;void trandata();/列出所选择4张牌的所有可能排列情况,再对每种情况进行look()操作;2.2 伪码设计 存储结构设计,定义一个cal类,目的是重载操作符。重载函数返回经过重载后操作符运算的结果。cal类伪码:clas

8、s cal /操作符类,重载操作符public:char s; /s为操作符cal()double operator()(double a,double b) /重载操作符switch(s)判断s,对不同的s返回不同的结果;;tranput()函数伪码:void tranput()for(int i=0;i<4;i+)输入datai;定义一个判断型数组judge;do把输入的数与判断型数组进行一一比较,如果不属于数组里面的,则输出输入错误提示;while();for(int j=i-1;j>=0;j-)将正确的当前输入与之前输入相比较,如果相同代表重复输入,输出错误提示;look(

9、)函数伪码:void look()定义数组char,存放+、-、*、/四种运算符for(int i=0;i<4;i+)/不同组合的操作符 选择一种运算符;for(int i=0;i<4;i+)选择一种运算符;for(int i=0;i<4;i+)选择一种运算符;一一对五种表达式进行判断,如果行,则把find值为true;trandata()伪码:void trandata() char temp10; for(int i=0;i<4;i+) 四重循环,对ABCD进行排列组合,并对每一种排列进行look()操作; 2.3 算法分析: 由于有4个输入,且在计算的时候这4个数

10、不能重复出现,所有共有4!=4*3*2*1=24种排 列的情况。而对于操作符而言,共有+、-、*、/四种操作符,而在一个计算式里面操作符显然可以重复 出重复出现。对操作符进行全排列,4*4*4*一共有256种排列状况。总体分析,在输入一组数据后 后,如果要得出由这组数据形成的24点表达式,则要进行256*24=6144次比较后才能得出所有的计算式。2.4 测试用例设计 1.K K 7 7; /错误例子,用来检测程序健壮性; 2.10 5 6 7; 3.A 6 9 K; 4.Q 7 9 K; 5.R 14 5 K; /错误例子,用来检测程序健壮性;3.程序调试1.刚开始调试时,输入数据7,9,J

11、,K出现计算式:(K/(7/J)+9=24,表达式错误,经过检查,发现在if(t(w(data0,r(data1,_data2),_data3)=24)24点判断式中把_data0,data1写成了data0,data1,改正后结果显示:没有相应的表达式。2.刚开始直接定义一个整型数组(int data),结果由于输入有可能是A J Q K字符型,所以不能通过整型数组来记录所有的输入。因此把int data改为char data,因为char型占一个字符,此时能够正确记录19和A、J、Q、K,但不能记录10,每次输入10的时候总是判断为非法输入。尝试把char data换为string dat

12、a,结果出现: c:usersadministratordocumentsvisual studio 2008projects24点24点24点.cpp(7) : error C2679: 二进制“>>”: 没有找到接受“std:string”类型的右操作 数的运算符(或没有可接受的转换) c:programfilesmicrosoftvisualstudio9.0vcincludeistream(1144): “std:basic_istream<_Elem,_Traits>&std:operator >><std:char_traits&l

13、t;char>>(std:basic_istream<_Elem,_Traits> &,signed char *)” with _Elem=char, _Traits=std:char_traits<char> 不知道怎么调试,所以只能在输入的时候提示用户用#来代表10的输入;例如:输入5,7,#,K(5,7,10,K) 得到下列的结果:(5-K)*(7-#)=24 (7-#)*(5-K)=24 (#-7)*(K-5)=24(K-5)*(#-7)=243.因为运算符有交换率,不同的表达式有可能表达相同的意思。所以在程序的输出中有很大一部分结果是重复

14、的。例如,输入3,7,9,K,结果为:(7*9)-(K*3)=24 (7*9)-(3*K)=24(9*7)-(K*3)=24(9*7)-(3*K)=24 这四个表达式代表相同的意思,可以用其中任意一个计算式代表其他,但目前为止还没有想出来好的办法来进行重复计算式的判断。4.实验结果与分析1.K K 7 7 结果为:结果分析:输入第一个K,符合要求,输入第二个K,与第一个重复,输出错误提示,后面同理。程序继续等待输入正确数字。 2.10 5 6 7(#,5,6,7); 结果为: 结果分析:为正确输入,没有相应的24点计算式。3.A 6 9 K;结果为: 结果分析:有相当多的计算式,不过其中有很多

15、重复。4.Q 7 9 K;结果为: 结果分析:和第二组数据一样,没有相应的24点计算式。5.R 14 5 K 结果为:结果分析:由于R和14不在输入范围里面,所以导致错误提示。程序继续等待输入正确数字。5.经验和体会 这次的的课程设计使我收获了很多平时上课和做练习不能得到的经验,并且让我对编程有了更加深入的了解,激发了我对编程的兴趣。1.程序设计要求程序员要有很清晰的思路和很好的耐心。在拿到题目后,首先应该对题目进行仔细的分析,清楚的明白题目的要求、约束条件等等。然后再进行算法的设计。2在进行算法的设计时,往往会有很多不同的思路来解决相同的一个问题。此时要对比这些思路,看看哪一个更适用于目前的算法,哪一个更简洁,更容易理解,综合所有的分析来选择一个相对来说更好的算法来进行编程。这样不仅能够节省大量的编程、调试时间,而且更容易理解,更能提升自己对编程的兴趣。3.在编程时候应该很仔细,很小心,对于一般的语法错误应该尽量避免。同时对于一些模棱两可的想法应该尽快查阅书本

温馨提示

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

评论

0/150

提交评论