数据结构课程设计+24点游戏源代码
- 格式:pdf
- 大小:432.16 KB
- 文档页数:55
oper[ii]; eOperator; oper[jj]; eOperator; oper[kk]; eOperator; oper[6]; eOperator;
initstack (&OPND); c=expression[index][0]; while (c!= 35 || gettop(&OPTR)!=35) {
if(expression[index][1]!=1) {
push(&OPND, c); index++; c=expression[index][0]; } // 不是运算符则进栈 else { switch ( precede((char)gettop(&OPTR), (char)c) ) { case '<': // 栈顶元素优先权低
同 a b (c d) 和 a (b c) d . (a b c) d . (a b) (c d) . ( (a b) c) d
同 (a (b c)) d 然后根据上述 5 种情况加入运算符。
对于每种不同的算式形式,先在固定的位置加入括号。程序通过 4层循环对四个数字进行赋值,并对循环加以控制,使每个数字只用 一次,然后再通过三层循环对三个位置的运算符赋值。每一次循环 都会产生一个数组,别调用下面的CalcOneExpress函数求算式的值! 结果可能算出24点,或者算不出24点 (如图2,图3)。
4 开发工具和编程语言
开发工具:Microsoft Visual C++ 6.0 编程语言:C语言
5 详细设计
(1)全局变量和栈,链表的定义 int number[2][4]; enum{ eNumber = 0,//操作数 eOperator = 1//算子 };
int oper[7]={43,45,42,47,40,41,35};
// (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
线性表的定义: 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;
参考文献 3 潭浩强.C语言程序设计(第三版). 清华大学出版社,2005
4 潭浩强.C语言程序设计题解与上机指导(第三版). 清华大学出版社,2005
5张 曼,朱小谷,吕士俊.数据结构习题与解答 . 北京希望电子出版社.2005
指导教师签字: 审查意见
教研室主任签字:
年月日
1.需求分析
24点游戏主要有两个功能: (1)用户记算24点 程序随机产生四个1-13的数,分别代表4张牌, 提示用户输入算 式。如果用户认为程序给出的一组数字不能算出24点(如1,1,2, 2),则输入‘?’,然后程序对这四个数字进行计算,如果真的不 能算出24点,则输出用户正确的信息,否则给出一个正确的算式, 并显示用户错误的信息。 (2).程序计算24点 用户输入四个1-13的数,代表4张牌,程序需要通过一定的规则 添加括号和运算符来使算式的值等于24,如果用户给出的四个数字
return 1; } } } } } } } return 0; }
代码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);
=
expression[5][0]
=
expression[5][1]
=
expression[7][0]
=
expression[7][1]
=
CalcOneExpress(expression); 算出24点
dRes
=
//对每一个算式求值,直到
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]);
模块划分
Main()
游戏介绍 人算24点 程序算24点 计算24点并输出算式 用户输入算式 用户认为无法算出24点 程序验证,输出正确或错误信息,用户继续玩 程序验证,若能算出24点,则输出正确算式 无法算出24点,输出错误信息
3 运行环境
硬件环境:PC机 软件环境:Windows XP
Microsoft Visual C++ 6.0
(2)main()函数及用户界面 void main(){ gameinformation(); //输出作者信息 menu(); //输出功能菜单,游戏开始 } 用户界面如 图1 所示。
(3)由程序计算24点的算法分析: 用户输入四个1-13的数,代表4张牌,程序算24点。这要考虑到
各种情况。首先是加入括号,有以下5种可能的形式: .a b c d . (a b) c d
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++) {
课本 表3.1 算符间的优先关系: unsigned char Prior[7][7] = {
'>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=',' ', '>','>','>','>',' ','>','>', '<','<','<','<','<',' ','=' };
(4)由用户计算24点的算法分析: 先由程序产生4个随机数; int randomm() { int i=0; srand((unsigned)time(NULL)); for(;i<4;i++){ number[0][i]=0; number[0][i]=rand(); number[0][i]%=13; number[0][i]++; number[1][i]=0; } return number[2][4]; } 用户判定 如果用户认为程序产生的四个随机数不能算出24点则输
expression[6][1]=eNumber;
for (ii=0;ii<4;ii++)
Байду номын сангаас
{
for (jj=0;jj<4;jj++)
{
for (kk=0;kk<4;kk++)
{
expression[1][0]
=
expression[1][1]
=
expression[3][0]
=