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

控制台编程

开发平台:

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