24点游戏规则,24点游戏题目和答案
一.问题
随机生成代表扑克脸的四个数字或字母,用户输入包含这四个数字或字母的运算表达式(包括括号)。如果表达式求值结果为24,则表示用户赢得了游戏,否则失败。
二。主意
使用随机授权函数生成从1到13的四个数字。根据给定的四个数字,输入一个字符串,回车,检查输入的表达式形式是否正确。如果错了,重新输入;否则调用ExpressTransform函数将词缀表达式expMiddle转换为后缀表达式expBack并输出转换后的后缀表达式,然后调用ExpressComputer函数计算后缀表达式的值。当结果是24时,赢这一局,否则输。
(1)中缀表达式转换成后缀表达式
从左到右遍历后缀表达式的每个数字和符号,如果是数字就输出,即成为后缀表达式的一部分;如果是符号,用栈顶符号判断其优先级。如果是右括号或者优先级不高于顶层符号(乘除优先加减),则依次弹出输出栈顶元素,将当前符号放入栈中,直到最后输出后缀表达式。
(2)后缀表达式的评估
从左到右遍历表达式的每一个数字和符号,遇到一个数字就压入堆栈,遇到一个yes运算符就把前两个数字压出堆栈,进行运算,把运算结果压入堆栈,直到得到最终结果。此时,发送到堆栈顶部的值就是结果。
注:1。运算符的优先处理
2.运算过程中运算符和操作数的运算。
三。测试
四。运营结果
动词(verb的缩写)源代码
//twentyfour.cpp:定义控制台应用程序的入口点。
//作者:马璐璐
//平台:Visual Stdio 2015
//创建时间:2017年4月3日
//要求:随机生成4个代表扑克牌正面的数字,用户输入包含这4个数字的运算表达式(包括括号)。如果表达式计算为24,则表示用户赢了这场游戏。
#include stdafx.h
#包含stdio.h
#包含malloc.h
#包含stdlib.h
#包含字符串. h
#包含conio.h
#包含时间. h
# include type . h/*字符操作函数*/
#定义缓冲区大小32
#定义第128列
#定义第64行
/*定义堆栈1*/
typedef结构节点
{
int数据;
结构节点* next
} STACK1
/*定义堆栈2*/
typedef结构节点2
{
char数据;
struct node2 * next
} STACK2
/*堆栈函数*/
STACK1 *PushStack(STACK1 *top,int x)
{
stack 1 * p;
p=(stack 1 *)malloc(sizeof(stack 1));
if (p==NULL)
{
printf(错误\n!);
退出(0);
}
p-data=x;
p-next=top;
top=p;
返回顶部;
}
/*弹出功能*/
堆栈1 *弹出堆栈(堆栈1 *顶部)
{
stack 1 * q;
q=top
top=top-next;
免费(q);
返回顶部;
}
/*读取堆栈的顶部元素*/
int GetTop(STACK1 *top)
{
if (top==NULL)
{
printf(Stack为null \ n );
返回0;
}
/*返回堆栈的顶部元素*/
返回顶层数据;
}
/*取出栈顶元素并删除它*/
STACK1 *GetDelTop(STACK1 *top,int *x)
{
* x=GetTop(top);
top=pop stack(top);
返回顶部;
}
Int EmptyStack(STACK1 *top) /*确定堆栈是否为空*/
{
if (top==NULL)
返回1;
返回0;
}
/*堆栈函数*/
STACK2 *PushStack2(STACK2 *top,char x)
{
stack 2 * p;
p=(stack 2 *)malloc(sizeof(stack 2));
if (p==NULL)
{
printf(错误\n!);
退出(0);
}
p-data=x;
p-next=top;
top=p;
返回顶部;
}
/*超出堆栈*/
STACK2 *PopStack2(STACK2 *top)
{
stack 2 * q;
q=top
top=top-next;
免费(q);
返回顶部;
}
/*读取堆栈的顶部元素*/
char GetTop2(STACK2 *top)
{
if (top==NULL)
{
printf(Stack为null \ n );
返回0;
}
返回顶层数据;
}
/*取出栈顶元素并删除它*/
STACK2 *GetDelTop2(STACK2 *top,char *x)
{
* x=gettop 2(top);
top=pop stack 2(top);
返回顶部;
}
/*确定堆栈是否为空*/
int EmptyStack2(STACK2 *top)
{
if (top==NULL)
返回1;
其他
返回0;
}
/*随机交易功能*/
作废GenCard()
{
int num,I;
srand((无符号)时间(空));
for(I=0;I 4;我)
{
num=rand()% 13 1;/*大小随机数*/
printf(%d ,num);
}
}
/*中缀字符串E到后缀字符串A函数*/
void express transform(char * exp middle,char *expBack)
{
STACK2 * top=NULL/*定义栈顶指针*/
int i=0,j=0;
char ch
while (expMiddle[i]!=\0)
{
/*判断字符是数字*/
if (isdigit(expMiddle[i]))
{
做{
exp back[j]=exp middle[I];
我;j;
} while (expMiddle[i]!=.);
expBack[j]= . ;
j;
}
/*处理"("*/
if (expMiddle[i]==()
top=PushStack2(top,exp middle[I]);
/*处理")"*/
if (expMiddle[i]==))
{
top=GetDelTop2(top,ch);
而(ch!=()
{
exp back[j]=ch;
j;
top=GetDelTop2(top,ch);
}
}
/*处理加或减号*/
if(exp middle[I]== exp middle[I]==-)
{
如果(!EmptyStack2(顶部))
{
ch=gettop 2(顶);
而(ch!=()
{
exp back[j]=ch;
j;
top=pop栈2(top);
if (EmptyStack2(top))
打破;
其他
ch=gettop 2(顶);
}
}
top=PushStack2(top,exp middle[I]);
}
/*处理乘或除号*/
if(exp middle[I]== * exp middle[I]==/)
{
如果(!EmptyStack2(顶部))
{
ch=gettop 2(顶);
while (ch==* ch==/)
{
exp back[j]=ch;
j;
top=pop栈2(top);
if (EmptyStack2(top))
打破;
其他
ch=gettop 2(顶);
}
}
top=PushStack2(top,exp middle[I]);
}
我;
}
而(!EmptyStack2(顶部))
top=GetDelTop2(top,expBack[j]);
exp back[j]= \ 0 ;
}
/*后缀表达式求值函数*/
int ExpressComputer(字符)
{
STACK1 * top=NULL
int i,k,num1,num2,结果
I=0;
while (s[i]!=\0) /*当字符串没有结束时作以下处理*/
{
if(是数字(s[I])/*判字符是否为数字*/
{
k=0;/*k初值为0*/
做{
k=10 * k s[I]- 0 ;/*将字符连接为十进制数字*/
我;/*i加1*/
} while (s[i]!=.);/*当字符不为.时重复循环*/
top=PushStack(top,k);/*将生成的数字压入堆栈*/
}
if (s[i]== ) /*如果为 号*/
{
top=GetDelTop(top,num 2);/*将栈顶元素取出存入num2中*/
top=GetDelTop(top,num 1);/*将栈顶元素取出存入num1中*/
结果=num2 num1/*将num1和num2相加存入结果中*/
top=PushStack(top,result);/*将结果压入堆栈*/
}
if (s[i]==-) /*如果为-号*/
{
top=GetDelTop(top,num 2);/*将栈顶元素取出存入num2中*/
top=GetDelTop(top,num 1);/*将栈顶元素取出存入num1中*/
结果=num 1-num 2;/*将num1减去num2结果存入结果中*/
top=PushStack(top,result);/*将结果压入堆栈*/
}
if (s[i]==*) /*如果为*号*/
{
top=GetDelTop(top,num 2);/*将栈顶元素取出存入num2中*/
top=GetDelTop(top,num 1);/*将栈顶元素取出存入num1中*/
结果=num1 * num2/*将num1与num2相乘结果存入结果中*/
top=PushStack(top,result);/*将结果压入堆栈*/
}
if (s[i]==/) /*如果为/号*/
{
top=GetDelTop(top,num 2);/*将栈顶元素取出存入num2中*/
top=GetDelTop(top,num 1);/*将栈顶元素取出存入num1中*/
结果=数字1/数字2;/*将num1除num2结果存入结果中*/
top=PushStack(top,result);/*将结果压入堆栈*/
}
我;/*i加1*/
}
top=GetDelTop(top,result);/*最后栈顶元素的值为计算的结果*/
返回结果;/*返回结果*/
}
/*检查输入的表达式是否正确*/
int CheckExpression(char *e)
{
int I=0;
while (e[i]!=\0)
{
if (isdigit(e[i]))
{
if (isdigit(e[i 1]))
{
我;
继续;
}
if (e[i 1]!=.)
{
printf(\n所输入的表达式形式错误!\ n’);
返回0;
}
我;
}
我;
}
返回1;
}
/*主函数*/
int main()
{
char expMiddle[BUFFSIZE],expBack[BUFFSIZE],ch;
int i,结果
int d=0;
系统(“cls”);
printf( * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n );
printf(*欢迎来到经典益智游戏——24点游戏!* \ n );
printf(*输入表达式形式如下:* \ n );
printf(* 10 .*(5.-3.) 4.* \ n );
printf( * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n );
系统("暂停");
while (1)
{
printf(\n随机生成的四个数字是: );
GenCard();
printf( \ n );
做{
printf(请输入正确的表达式:\ n’);
/*输入字符串压回车键*/
scanf(%s%c ,expMiddle,ch);
/*检查输入的表达式是否正确*/
} while(!check表达式(exp middle));
printf(%s\n ,exp middle);
/*调用ExpressTransform函数将中缀表达式expMiddle转换为后缀表达式expBack*/
ExpressTransform(expMiddle,exp back);
/*计算后缀表达式的值*/
result=express computer(expBack);
Printf(表达式%s计算结果为:%d.\n ,expMiddle,result);
if(结果==24)
{
printf(‘恭喜你,你答对了!\ n’);
d=D1;
Printf(整数为:%d\n ,d);
}
其他
{
printf(‘对不起,你的答案是错的!\ n’);
d=d-1;
Printf(整数为:%d\n ,d);
}
Printf(你想再玩一次吗(y/n)?\ n’);
scanf(%c ,ch);
if (ch==n ch==N )
打破;
}
返回0;
}
否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。