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

控制台编程

开发平台:

C/C++

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