CHECK_IF.C
上传用户:janny_wxd
上传日期:2010-02-03
资源大小:261k
文件大小:7k
源码类别:

控制台编程

开发平台:

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. typedef struct sqstack{
  16. int *base;
  17. int *top;
  18. int stacksize;
  19. }sqstack;
  20. unsigned char Prior[7][7] = {     // 表3.1  算符间的优先关系
  21.      '>','>','<','<','<','>','>',
  22.   '>','>','<','<','<','>','>',
  23.   '>','>','>','>','<','>','>',
  24.   '>','>','>','>','<','>','>',
  25.   '<','<','<','<','<','=',' ',
  26.   '>','>','>','>',' ','>','>',
  27.   '<','<','<','<','<',' ','='
  28. };
  29. char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
  30. int number[2][4]={4,2,6,6};
  31. enum
  32. {
  33. eNumber = 0, //操作数
  34. eOperator = 1 //算子
  35. };
  36.  /*enum MyOP
  37. {
  38. eAdd = 43,
  39. eSub = 45,
  40. eMulti = 42,
  41. eDiv = 47,
  42. eLeftParen = 40,
  43. eRightParen = 41,
  44. head_end = 35
  45. };*/
  46. int oper[7]={43,45,42,47,40,41,35};
  47.  int Operate(int a,int theta, int b) {
  48. // printf("a=%d,theta=%c,b=%dn",a,theta,b);
  49.    switch(theta) {
  50.       case 43: return a+b;
  51.       case 45: return a-b;
  52.       case 42: return a*b;
  53.       case 47:
  54.   {if(b==0){
  55.   printf("除数不能为0!n");
  56.   exit(ERROR);
  57.   }
  58. else return a/b;
  59.   }
  60.       default : return 0;
  61.    } 
  62. }
  63. int ReturnOpOrd(char op,char* TestOp) {
  64.    int i;
  65.    for(i=0; i< OPSETSIZE; i++) {
  66.       if (op == TestOp[i]) return i;
  67.    }
  68.    return 0;
  69. }
  70. char precede(char Aop, char Bop) {
  71. //    printf("%cn",Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]);
  72. // printf("%c,  %cn",Aop,Bop);
  73. return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
  74.    
  75. }
  76. status initstack(sqstack *s){
  77. (s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));
  78. if((s)->base==NULL) exit(OVERFLOW);
  79. (s)->top=(s)->base;
  80. (s)->stacksize = STACK_INIF_SIZE;
  81. // printf("initstack is finished!n");
  82. return OK;
  83. }
  84. int gettop(sqstack *s){
  85. int e;
  86. if(s->top==s->base){
  87.  printf("NULL1n");
  88.  return 0;
  89.  }
  90. e=*(s->top-1);
  91. // printf("gettop %d is OK!n",e);
  92. return e;
  93. }
  94. status push(sqstack *s,int e){
  95. if(s->top-s->base>=s->stacksize){
  96. s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
  97. if(!s->base) exit(OVERFLOW);
  98. s->stacksize+= STACKINCREMENT;
  99. }
  100. *(s->top++)=e;
  101.  //   printf("push %d is OKn",e);
  102. return OK;
  103. }
  104. status pop(sqstack *s,int *e){
  105. if(s->top==s->base){
  106. printf("出时栈栈为空!n");
  107. return ERROR;
  108. }
  109. *e=*(--s->top);
  110.  //   printf("pop %d is OK!n",*e);
  111. return OK;
  112. }
  113.  int CalcOneExpress(int expression[][2],int n)
  114.  {
  115.     // 算术表达式求值的算符优先算法。
  116.    // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
  117. int index=0,result,c,theta,a,b;
  118. sqstack  OPTR;    // 运算符栈,字符元素
  119.    sqstack  OPND;    // 运算数栈,实数元素
  120.    initstack(&OPTR);
  121.    push(&OPTR, 35);
  122.    initstack (&OPND);
  123.    c=expression[index][0];
  124.    while (c!= 35 || gettop(&OPTR)!=35){
  125. //   printf("while start!n");
  126.       if (expression[index][1]!=1) {
  127.          push(&OPND, c);
  128.  index++;
  129.  c=expression[index][0];
  130.  
  131.          } // 不是运算符则进栈
  132.      else {    
  133.  switch (precede(gettop(&OPTR), c)) { 
  134.             case '<': 
  135. // printf("case <!n");   // 栈顶元素优先权低
  136.                  push(&OPTR, c);    
  137.  index++;
  138.  c=expression[index][0];  
  139.   
  140.                  break;
  141.             case '=':   // 脱括号并接收下一字符
  142.                  pop(&OPTR, &c);     
  143.  index++;
  144.  c=expression[index][0];  
  145.   
  146.                  break;
  147.             case '>':   // 退栈并将运算结果入栈
  148.                  pop(&OPTR, &theta);
  149.                  pop(&OPND, &b);  
  150.                  pop(&OPND, &a);
  151. // printf("q->num_ch is %dn",q->num_ch);
  152.                  push(&OPND, Operate(a, theta, b)); 
  153. /*  if (q->num_ch !=35){
  154.  index++;
  155.  c=expression[index][0];
  156.  
  157.    printf("%dn",c);*/
  158. //  }
  159.                  break;
  160. default :
  161. printf("have not this oper!n");
  162. return 0;
  163.          } // switch
  164.       }//else
  165.    } // while
  166.    result=gettop(&OPND);
  167.    return result;
  168. } // EvaluateExpression
  169. /*status CombineResult(int expression[][2],int n)
  170. {
  171. char s[15];
  172. */
  173.  int Equal24(int n)
  174.  {
  175.  if(n==24){
  176.  printf("the result is %dn",n);
  177.  return TRUE;
  178.  }
  179.  else    return FALSE;
  180.  }
  181. int CalcArray1(int iNumInput[2][4])
  182. {
  183. // a * b * c * d //7 number
  184. int expression[8][2],ii,jj,kk;
  185. int i,j,k,l,dRes;
  186.     for(i=0;i<4;i++)
  187.     {
  188.         for(j=0;j<4;j++)    
  189.         {
  190.             if(j==i)
  191.             {
  192.                 continue;
  193.             }
  194.             for(k=0;k<4;k++)
  195.             {
  196.                 if(k==i||k==j)
  197.                 {
  198.                     continue;
  199.                 }
  200.                 for(l=0;l<4;l++)
  201.                 {
  202.                     if(l==i||l==j||l==k)
  203.                     {
  204.                         continue;
  205.                     }
  206.                     expression[0][0]=iNumInput[0][i];
  207.                     expression[2][0]=iNumInput[0][j];
  208.                     expression[4][0]=iNumInput[0][k];
  209.                     expression[6][0]=iNumInput[0][l];
  210. expression[0][1]=eNumber;
  211. expression[2][1]=eNumber;
  212. expression[4][1]=eNumber;
  213. expression[6][1]=eNumber;
  214. for (ii=0;ii<4;ii++)
  215. {
  216. for (jj=0;jj<4;jj++)
  217. {
  218. for (kk=0;kk<4;kk++)
  219. {
  220. expression[1][0] = oper[ii];
  221. expression[1][1] = eOperator;
  222. expression[3][0] = oper[jj];
  223. expression[3][1] = eOperator;
  224. expression[5][0] = oper[kk];
  225. expression[5][1] = eOperator;
  226. expression[7][0] = oper[6];
  227. expression[7][1] = eOperator;
  228. dRes = CalcOneExpress(expression, 8);
  229. if(Equal24(dRes))
  230. {
  231. // CombineResult(expression, 7);//组织结果表达式
  232. // printf("%d,%d,%d,%d,%d,%d,%dn",i,ii,j,jj,k,kk,l);
  233. // printf("%d%cn",expression[i][0],oper[ii]);
  234. 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]);
  235. return TRUE;
  236. }
  237. }
  238. }
  239. }//end of for oper
  240. }
  241. }
  242. }
  243. }
  244. return FALSE;
  245. }
  246. int Calc24(int number[2][4])
  247. {
  248. //括号的几种情况
  249. //1 无括号
  250. //2 (a b) c d 同a b (c d), 下省略
  251. //3 (a b c) d
  252. //4 a (b c) d
  253. //5 (a b) (c d)
  254. //6 ((a b) c) d
  255. //7 (a (b c)) d
  256. //计算不含括号的情况
  257. if (CalcArray1(number))
  258. {
  259. return TRUE;
  260. }
  261. /* if (CalcArray2(number[2][4]))
  262. {
  263. bol=1;
  264. return bol;
  265. }
  266. if (CalcArray3(number[2][4]))
  267. {
  268. bol=1;
  269. return bol;
  270. }
  271. if (CalcArray4(number[2][4]))
  272. {
  273. bol=1;
  274. return bol;
  275. }
  276. if (CalcArray5(number[2][4]))
  277. {
  278. bol=1;
  279. return bol;
  280. }
  281. if (CalcArray6(number[2][4]))
  282. {
  283. bol=1;
  284. return bol;
  285. }
  286. if (CalcArray7(number[2][4]))
  287. {
  288. bol=1;
  289. return bol;
  290. }*/
  291. return FALSE;
  292. }
  293. void main (){
  294. Calc24(number);
  295. // printf("finished mainn");
  296. }
  297.