24点游戏规则,24点游戏题目和答案

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: