数据结构课程设计 24点游戏源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.概要设计
○1 抽象数据结构定义:
ADT{ 数据对象:D={a|a为大于0小于14的整数} push(sqstack *s,int e) //压栈 gettop(sqstack *s) //取得栈顶元素 pop(sqstack *s,int *e) //出栈 randomm() //产生四个随机数 EvaluateExpression(char* MyExpression) //课本算法3.4---计算表达式的值 init_sq(sqlist *l) //初始化链表 insert_sq(sqlist **p,int e,int bl) //链表插入操作 chang(char *s,sqlist *l) //将用户的输入转化为单链表 check(sqlist l) //保证输入的数字是给出的四个数字 Operate(int a,int theta, int b) //计算 precede(char Aop, char Bop) //求运算符优先级 ReturnOpOrd(char op,char* TestOp) //返回运算符优先级
if(l==i||l==j||l==k) continue; expression[0][0]=iNumInput[0][i]; expression[2][0]=iNumInput[0][j]; expression[4][0]=iNumInput[0][k]; expression[6][0]=iNumInput[0][l];
环对四个数字进行赋值,并对循环加以控制,使每个数字只用一次,然后再
通过三层循环对三个位置的运算符赋值。每一次循环都会产生一个数组,别
调用下面的CalcOneExpress函数求算式的值!结果可能算出24点,或者算不
出24点 (如图2,图3)。
以下两段代码是对针对第一种形式的算式求24点。过程为:对四个数字
4 开发工具和编程语言
开发工具:Microsoft Visual C++ 6.0 编程语言:C语言
5 详细设计
(1)全局变量和栈,链表的定义 int number[2][4]; enum{ eNumber = 0,//操作数 eOperator = 1//算子 };
4
int oper[7]={43,45,42,47,40,41,35};
if(expression[index][1]!=1) {
push(&OPND, c); index++; c=expression[index][0]; } // 不是运算符则进栈 else { switch ( precede((char)gettop(&OPTR), (char)c) ) { case '<': // 栈顶元素优先权低
课本 表3.1 算符间的优先关系: unsigned char Prior[7][7] = {
'>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=',' ', '>','>','>','>',' ','>','>', '<','<','<','<','<',' ','=' };
7Βιβλιοθήκη Baidu
{ expression[1][0] = oper[ii]; expression[1][1] = eOperator; expression[3][0] = oper[jj]; expression[3][1] = eOperator; expression[5][0] = oper[kk]; expression[5][1] = eOperator; expression[7][0] = oper[6]; expression[7][1] = eOperator;
用一次; 2.有些数字组合不能是表达式的值为 24)
任务要求
1.程序产生四个随机的数字(在 1-13 之间),由用户计算 24 点 2.用户输入四个数字(在 1-13 之间),由程序计算 24 点
1 张凤琴,张青凤.数据结构学习指导与习题详解,清华大学出版社,2007
2 严蔚敏,吴伟民.数据结构(C 语言版). 清华大学出版社,2008
return 1; } } } } } } } return 0; }
8
代码2. //课本算法3.4---计算 算式的值 int CalcOneExpress(int expression[][2]) {
// 算术表达式求值的算符优先算法。 // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。 int index=0,result,c,theta,a,b; sqstack OPTR; // 运算符栈,字符元素 sqstack OPND; // 运算数栈,实数元素 initstack(&OPTR); push(&OPTR, 35); initstack (&OPND); c=expression[index][0]; while (c!= 35 || gettop(&OPTR)!=35) {
□1 . a b
c
d
□2 . (a b) c d
同 a b (c d) 和 a (b c) d
□3 . (a b c) d
□4 . (a b) (c d)
□5 . ( (a b) c) d
同 (a (b c)) d
然后根据上述 5 种情况加入运算符。
对于每种不同的算式形式,先在固定的位置加入括号。程序通过4层循
push(&OPTR, c); index++; c=expression[index][0];
9
break; case '=': // 脱括号并接收下一字符
pop(&OPTR, &c); index++; c=expression[index][0]; break; case '>': // 退栈并将运算结果入栈 pop(&OPTR, &theta); pop(&OPND, &b); pop(&OPND, &a); push(&OPND, Operate(a, theta, b)); break; default: printf("没有这个运算符\n"); return 0; } // switch }//else } // while result=gettop(&OPND); return result; } // end CalcOneExpress
5
(2)main()函数及用户界面 void main(){ gameinformation(); //输出作者信息 menu(); //输出功能菜单,游戏开始 } 用户界面如 图1 所示。
(3)由程序计算24点的算法分析:
用户输入四个1-13的数,代表4张牌,程序算24点。这要考虑到各种情
况。首先是加入括号,有以下5种可能的形式:
○2 模块划分
3
Main()
游戏介绍 人算24点 程序算24点
用户输入 算式
用户认为无法 算出24点
程序验证,输出正确或 错误信息,用户继续玩
程序验证,若能算出24 点,则输出正确算式
计算24点并输出算 式
无法算出24点,输 出错误信息
3 运行环境
硬件环境:PC机 软件环境:Windows XP
Microsoft Visual C++ 6.0
2
CalcOneExpress(int expression[][2]) //课本算法3.4--计算表达式的值 Calc24(int number[2][4]) //包含下面五个函数,即表达式的五种形式
CalcArray1(int iNumInput[2][4]) // a * b * c * d //7 个字符 CalcArray2(int iNumInput[2][4]) // (a * b) * c * d //9 number CalcArray3(int iNumInput[2][4]) // (a * b * c) * d //9 number CalcArray4(int iNumInput[2][4]) // (a * b) * (c * d) //11 numbers CalcArray5(int iNumInput[2][4]) // ((a * b) * c) * d //11 numbers Equal24(int n) //判定结果是否等于24 gameinformation() //游戏介绍 menu() //菜单 main() //主函数 }ADT
和三个运算符赋值(CalcArray1(int iNumInput[2][4]))----计算算式的
值(CalcOneExpress(int expression[][2]))---验证是否等于24---输出
结果:
代码1.
// a * b * c * d 7 个字符
6
int CalcArray1(int iNumInput[2][4]) {
expression[0][1]=eNumber; expression[2][1]=eNumber; expression[4][1]=eNumber; expression[6][1]=eNumber; for (ii=0;ii<4;ii++) {
for (jj=0;jj<4;jj++) {
for (kk=0;kk<4;kk++)
参考文献 3 潭浩强.C 语言程序设计(第三版). 清华大学出版社,2005
4 潭浩强.C 语言程序设计题解与上机指导(第三版). 清华大学出版社,2005
5 张 曼,朱小谷,吕士俊.数据结构习题与解答 . 北京希望电子出版社.2005
审查意见
指导教师签字: 教研室主任签字:
年月日
1
1.需求分析
24点游戏主要有两个功能: (1)用户记算24点 程序随机产生四个1-13的数,分别代表4张牌, 提示用户输入算式。如 果用户认为程序给出的一组数字不能算出24点(如1,1,2,2),则输入‘?’, 然后程序对四个数字进行计算,如果真的不能算出24点,则输出用户正确的 信息,否则给出一个正确的算式,并显示用户错误的信息。 (2).程序计算24点 用户输入四个1-13的数,代表4张牌,程序需要通过一定的规则添加括 号和运算符来使算式的值等于24,如果用户给出的四个数字不能算出24点, 则输出错误信息!
课程设计
课程设计名称: 数据结构课程设计
专业班级:
学生姓名:

号:
指导教师:
课程设计时间:
计算机科学与技术专业课程设计任务书
学生姓名 题目
课题性质 指导教师
其它
专业班级 24 点游戏 课题来源 同组姓名
学号
自拟课题
一副牌共 54 张,除去大小 King,还剩 52 张,从中任意取四张加入括号和 主要内容 加减乘除运算符,组成表达式,并使表达式的值等于 24。(注:1. 每张牌只能
int expression[8][2],ii,jj,kk; int i,j,k,l,dRes; for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(j==i) continue; for(k=0;k<4;k++) {
if(k==i||k==j) continue; for(l=0;l<4;l++) {
线性表的定义: typedef struct sqlist{
int bol; //bol是0时,num-ch是数字;bol是1时num_ch是运算符 int num_ch; struct sqlist *next; }sqlist;
栈的定义: typedef struct sqstack{
int *base; int *top; int stacksize; }sqstack;
dRes = CalcOneExpress(expression); //对每一个算式求值,直到算出24点 if(Equal24(dRes)) //判定表达式的值是否为24 { printf("可以这样运算:%d%c%d%c%d%c%d\n",expression[0][0],oper[ii], expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6] [0]);
相关文档
最新文档