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

控制台编程

开发平台:

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