24game_not_info.c
上传用户:janny_wxd
上传日期:2010-02-03
资源大小:261k
文件大小:26k
源码类别:

控制台编程

开发平台:

C/C++

  1. #include"24.h"
  2. int oper[7]={43,45,42,47,40,41,35};
  3. unsigned char Prior[7][7] = {     // 表3.1  算符间的优先关系
  4.      '>','>','<','<','<','>','>',
  5.   '>','>','<','<','<','>','>',
  6.   '>','>','>','>','<','>','>',
  7.   '>','>','>','>','<','>','>',
  8.   '<','<','<','<','<','=',' ',
  9.   '>','>','>','>',' ','>','>',
  10.   '<','<','<','<','<',' ','='
  11. };
  12. char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
  13. status init_sq(sqlist *l){//初始化链表
  14. l=(sqlist*)malloc(sizeof(sqlist));
  15. if(l==NULL){
  16. exit(OVERFLOW);
  17. }
  18. l->next=NULL;
  19. return OK;
  20. }
  21. status insert_sq(sqlist **p,int e,int bl){//链表插入操作
  22. sqlist *q;
  23. q=(sqlist*)malloc(sizeof(sqlist));
  24. q->num_ch=e;
  25. q->bol=bl;
  26. q->next=NULL;
  27. (*p)->next=q;
  28. (*p)=(*p)->next;
  29.  //   printf("insert %d ,%dis succssed!n",e,bl);
  30. return OK;
  31. }
  32. int check(sqlist l)//保证输入的数字是给出的四个数字
  33. {
  34. int right=1,find=0,i;
  35. sqlist *q=&l;
  36. q=q->next ;
  37. for (;q->next!=NULL;q=q->next){
  38. if(q->bol==1){
  39. if(q->num_ch <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){
  40. right=0;
  41. printf("%c不是有效的运算符!n");
  42. }
  43. }
  44. else {
  45. find=0;
  46. for(i=0;i<4;i++){
  47. if(number[1][i]==0&&number[0][i]==q->num_ch ){
  48. number[1][i]=1;
  49. find=1;
  50. break;
  51. }
  52. }
  53. if(find==0){
  54. printf("%d 不在给出的四个数字中!n",q->num_ch );
  55. right=0;
  56. }
  57. }
  58. }//end for
  59. for (i=0;i<4;i++){
  60. if(number[1][i]==0){
  61. printf("%d没有用上!n",number[0][i]);
  62. right=0;
  63. }
  64. }
  65. return right;
  66. }
  67. int chang(char *s,sqlist *l){//将用户的输入转化为单链表
  68. int t=0;
  69. unsigned int i=0;
  70.      int bl,ch;
  71. int a1,a2,a;
  72. sqlist *p=l;
  73. for (;i<strlen(s);i++){
  74. if(s[i]>47&&s[i]<58&&t==0){
  75. a1=(int)s[i]-48;
  76. t++;
  77. }
  78. else if(s[i]>47&&s[i]<58&&t==1){
  79. a2=(int)s[i]-48;
  80. a=a1*10+a2;
  81. t++;
  82.             }
  83. else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){
  84. if(t==1){
  85.                         bl=0;
  86. insert_sq(&p,a1,bl);
  87.                 t=0;
  88. }
  89. else if(t==2){
  90. bl=0;
  91. insert_sq(&p,a,bl);
  92.                 t=0;
  93. }
  94. bl=1;
  95. ch=(int)s[i];
  96. insert_sq(&p,ch,bl);
  97.             t=0;
  98. }
  99. else {
  100. printf("%c不是有效的运算符!n",s[i]);
  101. }
  102. }   //end for
  103. i=strlen(s)-1;
  104. if(s[i]>47&&s[i]<58){
  105. if(s[i-1]>47&&s[i-1]<58){
  106.            bl=0;
  107.    insert_sq(&p,a,bl);
  108.    }
  109. else {
  110. bl=0;
  111. insert_sq(&p,a1,bl);
  112. }
  113. }
  114. bl=1;
  115. a=35;
  116. insert_sq(&p,a,bl);
  117. //    printf("chang is OKn");
  118. return (check(*l));
  119. }
  120. int Operate(int a,int theta, int b) {//计算
  121. // printf("a=%d,theta=%c,b=%dn",a,theta,b);
  122.    switch(theta) {
  123.       case 43: return a+b;
  124.       case 45: return a-b;
  125.       case 42: return a*b;
  126.       case 47:
  127.   {
  128.   if(b==0){
  129. return -2000;
  130. }
  131.   if (a%b==0){
  132.   return a/b;
  133.   }
  134.   else {//printf("不能为小数n");   
  135. return -10000;
  136.   }
  137.   }
  138.       default : return 0;
  139.    } 
  140. }
  141. int ReturnOpOrd(char op,char* TestOp) {//被char precede(char Aop, char Bop)所调用来求优先级
  142.    int i;
  143.    for(i=0; i< OPSETSIZE; i++) {
  144.       if (op == TestOp[i]) return i;
  145.    }
  146.    return 0;
  147. }
  148. char precede(char Aop, char Bop) {
  149. return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];   
  150. }
  151. status initstack(sqstack *s){
  152. (s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));
  153. if((s)->base==NULL) exit(OVERFLOW);
  154. (s)->top=(s)->base;
  155. (s)->stacksize = STACK_INIF_SIZE;
  156. // printf("栈初始化完成!n");
  157. return OK;
  158. }
  159. int gettop(sqstack *s){
  160. int e;
  161. if(s->top==s->base){
  162.  printf("栈空,无法取得栈顶元素!n");
  163.  return 0;
  164.  }
  165. e=*(s->top-1);
  166. // printf("取得栈顶元素: %d n",e);
  167. return e;
  168. }
  169. status push(sqstack *s,int e){
  170. if(s->top-s->base>=s->stacksize){
  171. s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
  172. if(!s->base) exit(OVERFLOW);
  173. s->stacksize+= STACKINCREMENT;
  174. }
  175. *(s->top++)=e;
  176.  //   printf("把 %d 压栈 is OKn",e);
  177. return OK;
  178. }
  179. status pop(sqstack *s,int *e){
  180. if(s->top==s->base){
  181. printf("栈空,出栈错误!n");
  182. return ERROR;
  183. }
  184. *e=*(--s->top);
  185. //    printf(" %d出栈成功 !n",*e);
  186. return OK;
  187. }
  188. int EvaluateExpression(char* MyExpression) {  // 算法3.4
  189.    // 算术表达式求值的算符优先算法。
  190.    // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
  191. int result;
  192. sqstack  OPTR;    // 运算符栈,字符元素
  193.    sqstack  OPND;    // 运算数栈,实数元素
  194.    int c,bl,a,b,theta,top;
  195.    sqlist *q,l;  
  196.    char *s=MyExpression;
  197.    init_sq(&l);
  198.    if(chang(s,&l)!=0){
  199.    q=&l;
  200.    initstack(&OPTR);
  201.    push(&OPTR, 35);
  202.    initstack (&OPND);
  203.    q=q->next;
  204.    c=q->num_ch;
  205.    bl=q->bol;
  206.    while ((c!= 35 || gettop(&OPTR)!=35)){
  207.       if (bl!=1) {
  208.          push(&OPND, c);
  209.  q=q->next;
  210.  c=q->num_ch;
  211.  bl=q->bol;
  212.          } // 不是运算符则进栈
  213.      else {  
  214.  top=gettop(&OPTR);
  215. //  printf("top  %c",top);
  216.  switch (precede(top, c)) { 
  217.             case '<': // 栈顶元素优先权低   
  218.                  push(&OPTR, c);    
  219.  q=q->next;
  220.  c=q->num_ch;  
  221.  bl=q->bol; 
  222.                  break;
  223.             case '=':   // 脱括号并接收下一字符
  224.                  pop(&OPTR, &c);     
  225.  q=q->next;
  226.  c=q->num_ch;  
  227.  bl=q->bol; 
  228.                  break;
  229.             case '>':   // 退栈并将运算结果入栈
  230.                  pop(&OPTR, &theta);
  231.                  pop(&OPND, &b);  
  232.                  pop(&OPND, &a);
  233. //  printf("q->num_ch is %dn",q->num_ch);
  234.                  push(&OPND, Operate(a, theta, b)); 
  235.                  break;
  236. default :
  237. printf("没有这个运算符!n");
  238. return 0;
  239.          } // switch
  240.       }//else
  241.    } // while
  242.    result=gettop(&OPND);
  243.    return result;
  244.    }
  245.    else {
  246.    printf("你的输入有错误!n");
  247.    return 0;
  248.    }
  249. } // EvaluateExpression
  250. int randomm()//产生四个随机数
  251. {
  252. int i=0;
  253. srand((unsigned)time(NULL));
  254. for (;i<4;i++){
  255. number[0][i]=0;
  256. number[0][i]=rand();
  257. number[0][i]%=13;
  258. number[0][i]++;
  259. number[1][i]=0;
  260. }
  261. return number[2][4];
  262. }
  263.  int CalcOneExpress(int expression[][2])
  264.  {
  265.     // 算术表达式求值的算符优先算法。
  266.    // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
  267. int index=0,result,c,theta,a,b;
  268. sqstack  OPTR;    // 运算符栈,字符元素
  269.    sqstack  OPND;    // 运算数栈,实数元素
  270.    initstack(&OPTR);
  271.    push(&OPTR, 35);
  272.    initstack (&OPND);
  273.    c=expression[index][0];
  274.    while (c!= 35 || gettop(&OPTR)!=35){
  275.       if (expression[index][1]!=1) {
  276.          push(&OPND, c);
  277.  index++;
  278.  c=expression[index][0];  
  279.          } // 不是运算符则进栈
  280.      else {    
  281.  switch (precede(gettop(&OPTR), c)) { 
  282.             case '<': 
  283.   // 栈顶元素优先权低
  284.                  push(&OPTR, c);    
  285.  index++;
  286.  c=expression[index][0];     
  287.                  break;
  288.             case '=':   // 脱括号并接收下一字符
  289.                  pop(&OPTR, &c);     
  290.  index++;
  291.  c=expression[index][0];     
  292.                  break;
  293.             case '>':   // 退栈并将运算结果入栈
  294.                  pop(&OPTR, &theta);
  295.                  pop(&OPND, &b);  
  296.                  pop(&OPND, &a);
  297.                  push(&OPND, Operate(a, theta, b)); 
  298.                  break;
  299. default :
  300. printf("没有这个运算符n");
  301. return 0;
  302.          } // switch
  303.       }//else
  304.    } // while
  305.    result=gettop(&OPND);
  306.    return result;
  307. } // EvaluateExpression
  308.  int Equal24(int n)
  309.  {
  310.  if(n==24){
  311. //  printf("the result is %dn",n);
  312.  return TRUE;
  313.  }
  314.  else    return FALSE;
  315.  }
  316.   //括号的几种情况
  317. //1 无括号
  318. //2 (a b) c d 同a b (c d), 下省略
  319. //3 (a b c) d
  320. //4 a (b c) d
  321. //5 (a b) (c d)
  322. //6 ((a b) c) d
  323. //7 (a (b c)) d
  324. int CalcArray1(int iNumInput[2][4])
  325. {
  326. // a * b * c * d //7 number
  327. int expression[8][2],ii,jj,kk;
  328. int i,j,k,l,dRes;
  329.     for(i=0;i<4;i++)
  330.     {
  331.         for(j=0;j<4;j++)    
  332.         {
  333.             if(j==i)
  334.             {
  335.                 continue;
  336.             }
  337.             for(k=0;k<4;k++)
  338.             {
  339.                 if(k==i||k==j)
  340.                 {
  341.                     continue;
  342.                 }
  343.                 for(l=0;l<4;l++)
  344.                 {
  345.                     if(l==i||l==j||l==k)
  346.                     {
  347.                         continue;
  348.                     }
  349.                     expression[0][0]=iNumInput[0][i];
  350.                     expression[2][0]=iNumInput[0][j];
  351.                     expression[4][0]=iNumInput[0][k];
  352.                     expression[6][0]=iNumInput[0][l];
  353. expression[0][1]=eNumber;
  354. expression[2][1]=eNumber;
  355. expression[4][1]=eNumber;
  356. expression[6][1]=eNumber;
  357. for (ii=0;ii<4;ii++)
  358. {
  359. for (jj=0;jj<4;jj++)
  360. {
  361. for (kk=0;kk<4;kk++)
  362. {
  363. expression[1][0] = oper[ii];
  364. expression[1][1] = eOperator;
  365. expression[3][0] = oper[jj];
  366. expression[3][1] = eOperator;
  367. expression[5][0] = oper[kk];
  368. expression[5][1] = eOperator;
  369. expression[7][0] = oper[6];
  370. expression[7][1] = eOperator;
  371. dRes = CalcOneExpress(expression);
  372. if(Equal24(dRes))
  373. {
  374. printf("可以这样运算:%d%c%d%c%d%c%dn",expression[0][0],oper[ii],expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]);
  375. return TRUE;
  376. }
  377. }
  378. }
  379. }//end of for oper
  380. }
  381. }
  382. }
  383. }
  384. return FALSE;
  385. }
  386. int CalcArray2(int iNumInput[2][4])
  387. {
  388. // (a * b) * c * d //9 number
  389. int expression[10][2];
  390. int ii,jj,i,j,k,l,kk;
  391. int dRes;
  392. // printf("CalcArray2n");
  393.     for(i=0;i<4;i++)
  394.     {
  395.         for(j=0;j<4;j++)    
  396.         {
  397.             if(j==i)
  398.             {
  399.                 continue;
  400.             }
  401.             for(k=0;k<4;k++)
  402.             {
  403.                 if(k==i||k==j)
  404.                 {
  405.                     continue;
  406.                 }
  407.                 for(l=0;l<4;l++)
  408.                 {
  409.                     if(l==i||l==j||l==k)
  410.                     {
  411.                         continue;
  412.                     }
  413.                     expression[1][0]=iNumInput[0][i];
  414.                     expression[3][0]=iNumInput[0][j];
  415.                     expression[6][0]=iNumInput[0][k];
  416.                     expression[8][0]=iNumInput[0][l];
  417. expression[1][1]=eNumber;
  418. expression[3][1]=eNumber;
  419. expression[6][1]=eNumber;
  420. expression[8][1]=eNumber;
  421. for (ii=0;ii<4;ii++)
  422. {
  423. for (jj=0;jj<4;jj++)
  424. {
  425. for (kk=0;kk<4;kk++)
  426. {
  427. expression[2][0] = oper[ii];
  428. expression[2][1] = eOperator;
  429. expression[5][0] = oper[jj];
  430. expression[5][1] = eOperator;
  431. expression[7][0] = oper[kk];
  432. expression[7][1] = eOperator;
  433. expression[9][0] = oper[6];
  434. expression[9][1] = eOperator;
  435. expression[0][0] = oper[4];
  436. expression[0][1] = eOperator;
  437. expression[4][0] = oper[5];
  438. expression[4][1] = eOperator;
  439. dRes = CalcOneExpress(expression);
  440. if(Equal24(dRes))
  441. {
  442. printf("可以这样运算:%c%d%c%d%c%c%d%c%dn",oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],expression[6][0],oper[kk],expression[8][0]);
  443. return TRUE;
  444. }
  445. }
  446. }
  447. }//end of for oper
  448. }
  449. }
  450. }
  451. }
  452. return FALSE;
  453. }
  454. int CalcArray3(int iNumInput[2][4])
  455. {
  456. // (a * b * c) * d //9 number
  457. int expression[10][2];
  458. int ii,jj,i,j,k,l,kk;
  459. int dRes;
  460. // printf("CalcArray3n");
  461.     for(i=0;i<4;i++)
  462.     {
  463.         for(j=0;j<4;j++)    
  464.         {
  465.             if(j==i)
  466.             {
  467.                 continue;
  468.             }
  469.             for(k=0;k<4;k++)
  470.             {
  471.                 if(k==i||k==j)
  472.                 {
  473.                     continue;
  474.                 }
  475.                 for(l=0;l<4;l++)
  476.                 {
  477.                     if(l==i||l==j||l==k)
  478.                     {
  479.                         continue;
  480.                     }
  481.                     expression[1][0]=iNumInput[0][i];
  482.                     expression[3][0]=iNumInput[0][j];
  483.                     expression[5][0]=iNumInput[0][k];
  484.                     expression[8][0]=iNumInput[0][l];
  485. expression[1][1]=eNumber;
  486. expression[3][1]=eNumber;
  487. expression[5][1]=eNumber;
  488. expression[8][1]=eNumber;
  489. for (ii=0;ii<4;ii++)
  490. {
  491. for (jj=0;jj<4;jj++)
  492. {
  493. for (kk=0;kk<4;kk++)
  494. {
  495. expression[2][0] = oper[ii];
  496. expression[2][1] = eOperator;
  497. expression[4][0] = oper[jj];
  498. expression[4][1] = eOperator;
  499. expression[7][0] = oper[kk];
  500. expression[7][1] = eOperator;
  501. expression[9][0] = oper[6];
  502. expression[9][1] = eOperator;
  503. expression[0][0] = oper[4];
  504. expression[0][1] = eOperator;
  505. expression[6][0] = oper[5];
  506. expression[6][1] = eOperator;
  507. dRes = CalcOneExpress(expression);
  508. if(Equal24(dRes))
  509. {
  510. printf("可以这样运算:%c%d%c%d%c%d%c%c%dn",oper[4],expression[1][0],oper[ii],expression[3][0],oper[jj],expression[5][0],oper[5],oper[kk],expression[8][0]);
  511. return TRUE;
  512. }
  513. }
  514. }
  515. }//end of for oper
  516. }
  517. }
  518. }
  519. }
  520. return FALSE;
  521. }
  522. int CalcArray4(int iNumInput[2][4])
  523. {
  524. // (a * b * c) * d //9 number
  525. int expression[10][2];
  526. int ii,jj,i,j,k,l,kk;
  527. int dRes;
  528. // printf("CalcArray4n");
  529.     for(i=0;i<4;i++)
  530.     {
  531.         for(j=0;j<4;j++)    
  532.         {
  533.             if(j==i)
  534.             {
  535.                 continue;
  536.             }
  537.             for(k=0;k<4;k++)
  538.             {
  539.                 if(k==i||k==j)
  540.                 {
  541.                     continue;
  542.                 }
  543.                 for(l=0;l<4;l++)
  544.                 {
  545.                     if(l==i||l==j||l==k)
  546.                     {
  547.                         continue;
  548.                     }
  549.                     expression[0][0]=iNumInput[0][i];
  550.                     expression[3][0]=iNumInput[0][j];
  551.                     expression[5][0]=iNumInput[0][k];
  552.                     expression[8][0]=iNumInput[0][l];
  553. expression[0][1]=eNumber;
  554. expression[3][1]=eNumber;
  555. expression[5][1]=eNumber;
  556. expression[8][1]=eNumber;
  557. for (ii=0;ii<4;ii++)
  558. {
  559. for (jj=0;jj<4;jj++)
  560. {
  561. for (kk=0;kk<4;kk++)
  562. {
  563. expression[1][0] = oper[ii];
  564. expression[1][1] = eOperator;
  565. expression[4][0] = oper[jj];
  566. expression[4][1] = eOperator;
  567. expression[7][0] = oper[kk];
  568. expression[7][1] = eOperator;
  569. expression[9][0] = oper[6];
  570. expression[9][1] = eOperator;
  571. expression[2][0] = oper[4];
  572. expression[2][1] = eOperator;
  573. expression[6][0] = oper[5];
  574. expression[6][1] = eOperator;
  575. dRes = CalcOneExpress(expression);
  576. if(Equal24(dRes))
  577. {
  578. printf("可以这样运算:%d%c%c%d%c%d%c%c%dn",expression[0][0],oper[ii],oper[4],expression[3][0],oper[jj],expression[5][0],oper[5],oper[kk],expression[8][0]);
  579. return TRUE;
  580. }
  581. }
  582. }
  583. }//end of for oper
  584. }
  585. }
  586. }
  587. }
  588. return FALSE;
  589. }
  590. int CalcArray5(int iNumInput[2][4])
  591. {
  592. // (a * b) * (c * d) //11 number
  593. int expression[12][2];
  594. int ii,jj,i,j,k,l,kk;
  595. int dRes;
  596. // printf("CalcArray5n");
  597.     for(i=0;i<4;i++)
  598.     {
  599.         for(j=0;j<4;j++)    
  600.         {
  601.             if(j==i)
  602.             {
  603.                 continue;
  604.             }
  605.             for(k=0;k<4;k++)
  606.             {
  607.                 if(k==i||k==j)
  608.                 {
  609.                     continue;
  610.                 }
  611.                 for(l=0;l<4;l++)
  612.                 {
  613.                     if(l==i||l==j||l==k)
  614.                     {
  615.                         continue;
  616.                     }
  617.                     expression[1][0]=iNumInput[0][i];
  618.                     expression[3][0]=iNumInput[0][j];
  619.                     expression[7][0]=iNumInput[0][k];
  620.                     expression[9][0]=iNumInput[0][l];
  621. expression[1][1]=eNumber;
  622. expression[3][1]=eNumber;
  623. expression[7][1]=eNumber;
  624. expression[9][1]=eNumber;
  625. for (ii=0;ii<4;ii++)
  626. {
  627. for (jj=0;jj<4;jj++)
  628. {
  629. for (kk=0;kk<4;kk++)
  630. {
  631. expression[2][0] = oper[ii];
  632. expression[2][1] = eOperator;
  633. expression[5][0] = oper[jj];
  634. expression[5][1] = eOperator;
  635. expression[8][0] = oper[kk];
  636. expression[8][1] = eOperator;
  637. expression[11][0] = oper[6];
  638. expression[11][1] = eOperator;
  639. expression[0][0] = oper[4];
  640. expression[0][1] = eOperator;
  641. expression[6][0] = oper[4];
  642. expression[6][1] = eOperator;
  643. expression[4][0] = oper[5];
  644. expression[4][1] = eOperator;
  645. expression[10][0] = oper[5];
  646. expression[10][1] = eOperator;
  647. dRes = CalcOneExpress(expression);
  648. if(Equal24(dRes))
  649. {
  650. printf("可以这样运算:%c%d%c%d%c%c%c%d%c%d%cn",oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],oper[4],expression[7][0],oper[kk],expression[9][0],oper[5]);
  651. return TRUE;
  652. }
  653. }
  654. }
  655. }//end of for oper
  656. }
  657. }
  658. }
  659. }
  660. return FALSE;
  661. }
  662. int CalcArray6(int iNumInput[2][4])
  663. {
  664. // ((a * b) * c) * d //11 number
  665. int expression[12][2];
  666. int ii,jj,i,j,k,l,kk;
  667. int dRes;
  668. // printf("CalcArray6n");
  669.     for(i=0;i<4;i++)
  670.     {
  671.         for(j=0;j<4;j++)    
  672.         {
  673.             if(j==i)
  674.             {
  675.                 continue;
  676.             }
  677.             for(k=0;k<4;k++)
  678.             {
  679.                 if(k==i||k==j)
  680.                 {
  681.                     continue;
  682.                 }
  683.                 for(l=0;l<4;l++)
  684.                 {
  685.                     if(l==i||l==j||l==k)
  686.                     {
  687.                         continue;
  688.                     }
  689.                     expression[2][0]=iNumInput[0][i];
  690.                     expression[4][0]=iNumInput[0][j];
  691.                     expression[7][0]=iNumInput[0][k];
  692.                     expression[10][0]=iNumInput[0][l];
  693. expression[2][1]=eNumber;
  694. expression[4][1]=eNumber;
  695. expression[7][1]=eNumber;
  696. expression[10][1]=eNumber;
  697. for (ii=0;ii<4;ii++)
  698. {
  699. for (jj=0;jj<4;jj++)
  700. {
  701. for (kk=0;kk<4;kk++)
  702. {
  703. expression[3][0] = oper[ii];
  704. expression[3][1] = eOperator;
  705. expression[6][0] = oper[jj];
  706. expression[6][1] = eOperator;
  707. expression[9][0] = oper[kk];
  708. expression[9][1] = eOperator;
  709. expression[11][0] = oper[6];
  710. expression[11][1] = eOperator;
  711. expression[0][0] = oper[4];
  712. expression[0][1] = eOperator;
  713. expression[1][0] = oper[4];
  714. expression[1][1] = eOperator;
  715. expression[5][0] = oper[5];
  716. expression[5][1] = eOperator;
  717. expression[8][0] = oper[5];
  718. expression[8][1] = eOperator;
  719. dRes = CalcOneExpress(expression);
  720. if(Equal24(dRes))
  721. {
  722. printf("可以这样运算:%c%c%d%c%d%c%c%d%c%c%dn",oper[4],oper[4],expression[2][0],oper[ii],expression[4][0],oper[5],oper[jj],expression[7][0],oper[5],oper[kk],expression[10][0]);
  723. return TRUE;
  724. }
  725. }
  726. }
  727. }//end of for oper
  728. }
  729. }
  730. }
  731. }
  732. return FALSE;
  733. }
  734. int CalcArray7(int iNumInput[2][4])
  735. {
  736. // (a * b * c) * d //9 number
  737. int expression[12][2];
  738. int ii,jj,i,j,k,l,kk;
  739. int dRes;
  740. // printf("CalcArray7n");
  741.     for(i=0;i<4;i++)
  742.     {
  743.         for(j=0;j<4;j++)    
  744.         {
  745.             if(j==i)
  746.             {
  747.                 continue;
  748.             }
  749.             for(k=0;k<4;k++)
  750.             {
  751.                 if(k==i||k==j)
  752.                 {
  753.                     continue;
  754.                 }
  755.                 for(l=0;l<4;l++)
  756.                 {
  757.                     if(l==i||l==j||l==k)
  758.                     {
  759.                         continue;
  760.                     }
  761.                     expression[1][0]=iNumInput[0][i];
  762.                     expression[4][0]=iNumInput[0][j];
  763.                     expression[6][0]=iNumInput[0][k];
  764.                     expression[10][0]=iNumInput[0][l];
  765. expression[1][1]=eNumber;
  766. expression[4][1]=eNumber;
  767. expression[6][1]=eNumber;
  768. expression[10][1]=eNumber;
  769. for (ii=0;ii<4;ii++)
  770. {
  771. for (jj=0;jj<4;jj++)
  772. {
  773. for (kk=0;kk<4;kk++)
  774. {
  775. expression[2][0] = oper[ii];
  776. expression[2][1] = eOperator;
  777. expression[5][0] = oper[jj];
  778. expression[5][1] = eOperator;
  779. expression[9][0] = oper[kk];
  780. expression[9][1] = eOperator;
  781. expression[11][0] = oper[6];
  782. expression[11][1] = eOperator;
  783. expression[0][0] = oper[4];
  784. expression[0][1] = eOperator;
  785. expression[3][0] = oper[4];
  786. expression[3][1] = eOperator;
  787. expression[7][0] = oper[5];
  788. expression[7][1] = eOperator;
  789. expression[8][0] = oper[5];
  790. expression[8][1] = eOperator;
  791. dRes = CalcOneExpress(expression);
  792. if(Equal24(dRes))
  793. {
  794. printf("可以这样运算:%c%d%c%c%d%c%d%c%c%c%dn",oper[4],expression[1][0],oper[ii],oper[4],expression[4][0],oper[jj],expression[6][0],oper[5],oper[5],oper[kk],expression[10][0]);
  795. return TRUE;
  796. }
  797. }
  798. }
  799. }//end of for oper
  800. }
  801. }
  802. }
  803. }
  804. return FALSE;
  805. }
  806. int Calc24(int number[2][4])
  807. {
  808. //括号的几种情况
  809. //1 无括号
  810. //2 (a b) c d 同a b (c d), 下省略
  811. //3 (a b c) d
  812. //4 a (b c) d
  813. //5 (a b) (c d)
  814. //6 ((a b) c) d
  815. //7 (a (b c)) d
  816. if (CalcArray1(number))//计算不含括号的情况
  817. return TRUE;
  818. if (CalcArray2(number))
  819. {  
  820. return TRUE;
  821. }
  822. if (CalcArray3(number))
  823. {  
  824. return TRUE;
  825. }
  826. if (CalcArray4(number))
  827. {  
  828. return TRUE;
  829. }
  830. if (CalcArray5(number))
  831. {  
  832. return TRUE;
  833. }
  834. if (CalcArray6(number))
  835. {  
  836. return TRUE;
  837. }
  838. if (CalcArray7(number))
  839. {  
  840. return TRUE;
  841. }
  842. printf("这四个数字不能算出24点.n");
  843. return FALSE;
  844. }
  845. void main(){
  846. char s[40],ch,mood;
  847. int result,t=1,t0=1,nall=0,nright=0,t1=1;
  848. double right;
  849. printf("/***************************************************/n");
  850. printf("                 24点游戏   dos  版本1.1n(含压栈出栈等详细提示,但运行速度会慢一些,特别是当要计算机来算时!)n");
  851. printf("      北京工商大学微机024班 欧阳锦林(谷穗) 版权所有n");
  852. printf("                 完成于2004年5月5日n");
  853. printf("/***************************************************/n");
  854. printf("注意!:我这儿将所有的字符型的变量都用整型来处理,如35表示'#'n");
  855. while(t==1){
  856. printf("你想采用什么模式?n");
  857. printf("    **************************************************n");
  858. printf("    *   计算机给出四个数字,你来算直到你想退出:'0'    *n");  
  859. printf("    *自己给出四个数字,要计算机来算,直到想退出:'1'    *n");
  860. printf("    *                            我想要源程序:'2'    *n");
  861. printf("    *                          我现在就要退出:'3'    *n");
  862. printf("    **************************************************n");
  863. printf("请选择模式:");
  864. mood=getch();
  865. // scanf( "  %c",&mood);
  866. if (mood=='0'){
  867. nall=0;
  868. nright=0;
  869. t0=1;
  870. while(t0==1){
  871. number[2][4]=randomm();
  872. printf("这四个数字是: %d   %d    %d   %dn",number[0][0],number[0][1],number[0][2],number[0][3]);
  873. printf("请输入算式n");
  874. printf("如果你认为这四个数算不出24点,请输入 ?n");
  875. printf("计算机将会给出答案,算不出也是一种答案!n");
  876. printf("你的算式是:");
  877. scanf ("%s",s);
  878. if(s[0]=='?'){
  879. if (Calc24(number)==1){
  880. nall++;
  881. }
  882. }
  883. else {
  884. result=EvaluateExpression(s);
  885. printf("你输入的算式的结果是: %d n",result);
  886. if(result==24){
  887. printf("恭喜您,你算对了!n");
  888. nright++;
  889. nall++;
  890.                     }
  891. else {
  892. printf("对不起,你算错了,谢谢!n");
  893. Calc24(number);
  894. nall++;
  895. }
  896. }//else
  897. printf("你共做了%d道,做对了%d道n",nall,nright);
  898. if (nall%5==0&&nall!=0){
  899. right=(double)nright/nall;
  900. printf("你的正确率为: %fn",right);
  901. if (right<0.5){
  902. printf("训练尚未成功,同志仍须努力!n");
  903. }
  904. else if(right>=0.5&&right<0.7){
  905. printf("不错不错,假以时日,必成良材!n");
  906. }
  907. else if(right>=0.7&&right<0.8){
  908. printf("将遇良材,非大战三百回合不可!n");
  909. }
  910. else if(right>=0.8&&right<0.96){
  911. printf("对你的敬佩之情,如滔滔江水,绵绵不绝---^^n");
  912. }
  913. else {
  914. printf("如此才智,老夫自愧不如n");
  915. }
  916. }
  917. printf("继续这个模式吗?请选择: 'y':继续 'n':退出?n");
  918. ch=getch();
  919.     // scanf(" %c",&ch);
  920. if(ch=='n'||ch=='N'){
  921. t0=0;
  922. }
  923. else  if (ch=='Y'||ch=='y')   t0=1;
  924. else{
  925. printf("你的选择(输入)有误!n"); 
  926. t0=0;
  927.         }
  928. }//while mood 0
  929. }//end if mood 0
  930. else if (mood=='1'){
  931. t1=1;
  932. while (t1==1){
  933. printf("请输入四个正整数1-13:(用逗号隔开) ");
  934. scanf("%d,%d,%d,%d",&number[0][0],&number[0][1],&number[0][2],&number[0][3]);
  935. Calc24(number);
  936. printf("继续这个模式吗?请选择: 'y':继续 'n':退出?n");
  937. ch=getch();
  938. // scanf(" %c",&ch);
  939. if(ch=='n'||ch=='N'){
  940. t1=0;
  941. }
  942. else  if (ch=='Y'||ch=='y')   t1=1;
  943. else{
  944. printf("你的选择(输入)有误!n"); 
  945. t1=0;
  946.   }
  947. }
  948. }//end mood 1
  949. else if (mood=='2'){
  950. printf("如果你需要源程序或想与我讨论有关问题,欢迎与我联系^^n");
  951. printf("E-mail:ouyangj0@yahoo.com.cn  QQ:158487625  网名:谷穗n");
  952. }
  953. else if (mood=='3'){
  954. printf(" 再见!n");
  955. t=0;
  956. }
  957. else {
  958. printf("mood =%cn",mood);
  959. printf("你的选择(输入)有误!n");
  960. t=0;
  961. }
  962. }//end big while 
  963. getchar();
  964. }