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

控制台编程

开发平台:

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]={2,6,2,8};
  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. // int max,min;
  50.  switch(theta) {
  51.       case 43: return a+b;
  52.       case 45: return a-b;
  53.       case 42: return a*b;
  54.       case 47:
  55.   {if(b==0){
  56.   printf("除数不能为0!n");
  57.   exit(ERROR);
  58.   }
  59.   if (a%b==0){
  60.   return a/b;
  61.   }
  62.   else {
  63.   //printf("不能为小数n");
  64.   return -1;
  65.  // exit(0);
  66.   }
  67.   }
  68.       default : return 0;
  69.    } 
  70. }
  71. int ReturnOpOrd(char op,char* TestOp) {
  72.    int i;
  73.    for(i=0; i< OPSETSIZE; i++) {
  74.       if (op == TestOp[i]) return i;
  75.    }
  76.    return 0;
  77. }
  78. char precede(char Aop, char Bop) {
  79. //    printf("%cn",Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]);
  80. // printf("%c,  %cn",Aop,Bop);
  81. return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
  82.    
  83. }
  84. status initstack(sqstack *s){
  85. (s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));
  86. if((s)->base==NULL) exit(OVERFLOW);
  87. (s)->top=(s)->base;
  88. (s)->stacksize = STACK_INIF_SIZE;
  89. // printf("initstack is finished!n");
  90. return OK;
  91. }
  92. int gettop(sqstack *s){
  93. int e;
  94. if(s->top==s->base){
  95.  printf("NULL1n");
  96.  return 0;
  97.  }
  98. e=*(s->top-1);
  99. // printf("gettop %d is OK!n",e);
  100. return e;
  101. }
  102. status push(sqstack *s,int e){
  103. if(s->top-s->base>=s->stacksize){
  104. s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
  105. if(!s->base) exit(OVERFLOW);
  106. s->stacksize+= STACKINCREMENT;
  107. }
  108. *(s->top++)=e;
  109.  //   printf("push %d is OKn",e);
  110. return OK;
  111. }
  112. status pop(sqstack *s,int *e){
  113. if(s->top==s->base){
  114. printf("出时栈栈为空!n");
  115. return ERROR;
  116. }
  117. *e=*(--s->top);
  118.  //   printf("pop %d is OK!n",*e);
  119. return OK;
  120. }
  121.  int CalcOneExpress(int expression[][2])
  122.  {
  123.     // 算术表达式求值的算符优先算法。
  124.    // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
  125. int index=0,result,c,theta,a,b;
  126. sqstack  OPTR;    // 运算符栈,字符元素
  127.    sqstack  OPND;    // 运算数栈,实数元素
  128.    initstack(&OPTR);
  129.    push(&OPTR, 35);
  130.    initstack (&OPND);
  131.    c=expression[index][0];
  132.    while (c!= 35 || gettop(&OPTR)!=35){
  133. //   printf("while start!n");
  134.       if (expression[index][1]!=1) {
  135.          push(&OPND, c);
  136.  index++;
  137.  c=expression[index][0];
  138.  
  139.          } // 不是运算符则进栈
  140.      else {    
  141.  switch (precede(gettop(&OPTR), c)) { 
  142.             case '<': 
  143. // printf("case <!n");   // 栈顶元素优先权低
  144.                  push(&OPTR, c);    
  145.  index++;
  146.  c=expression[index][0];  
  147.   
  148.                  break;
  149.             case '=':   // 脱括号并接收下一字符
  150.                  pop(&OPTR, &c);     
  151.  index++;
  152.  c=expression[index][0];  
  153.   
  154.                  break;
  155.             case '>':   // 退栈并将运算结果入栈
  156.                  pop(&OPTR, &theta);
  157.                  pop(&OPND, &b);  
  158.                  pop(&OPND, &a);
  159. // printf("q->num_ch is %dn",q->num_ch);
  160.                  push(&OPND, Operate(a, theta, b)); 
  161. /*  if (q->num_ch !=35){
  162.  index++;
  163.  c=expression[index][0];
  164.  
  165.    printf("%dn",c);*/
  166. //  }
  167.                  break;
  168. default :
  169. printf("have not this oper!n");
  170. return 0;
  171.          } // switch
  172.       }//else
  173.    } // while
  174.    result=gettop(&OPND);
  175.    printf("the result is %dn",result);
  176.    return result;
  177. } // EvaluateExpression
  178. /*status CombineResult(int expression[][2],int n)
  179. {
  180. char s[15];
  181. */
  182.  int Equal24(int n)
  183.  {
  184.  if(n==24){
  185.  printf("the result is %dn",n);
  186.  return TRUE;
  187.  }
  188.  else    return FALSE;
  189.  }
  190. int CalcArray1(int iNumInput[2][4])
  191. {
  192. // a * b * c * d //7 number
  193. int expression[8][2],ii,jj,kk;
  194. int i,j,k,l,dRes;
  195.     for(i=0;i<4;i++)
  196.     {
  197.         for(j=0;j<4;j++)    
  198.         {
  199.             if(j==i)
  200.             {
  201.                 continue;
  202.             }
  203.             for(k=0;k<4;k++)
  204.             {
  205.                 if(k==i||k==j)
  206.                 {
  207.                     continue;
  208.                 }
  209.                 for(l=0;l<4;l++)
  210.                 {
  211.                     if(l==i||l==j||l==k)
  212.                     {
  213.                         continue;
  214.                     }
  215.                     expression[0][0]=iNumInput[0][i];
  216.                     expression[2][0]=iNumInput[0][j];
  217.                     expression[4][0]=iNumInput[0][k];
  218.                     expression[6][0]=iNumInput[0][l];
  219. expression[0][1]=eNumber;
  220. expression[2][1]=eNumber;
  221. expression[4][1]=eNumber;
  222. expression[6][1]=eNumber;
  223. for (ii=0;ii<4;ii++)
  224. {
  225. for (jj=0;jj<4;jj++)
  226. {
  227. for (kk=0;kk<4;kk++)
  228. {
  229. expression[1][0] = oper[ii];
  230. expression[1][1] = eOperator;
  231. expression[3][0] = oper[jj];
  232. expression[3][1] = eOperator;
  233. expression[5][0] = oper[kk];
  234. expression[5][1] = eOperator;
  235. expression[7][0] = oper[6];
  236. expression[7][1] = eOperator;
  237. dRes = CalcOneExpress(expression);
  238. if(Equal24(dRes))
  239. {
  240. // CombineResult(expression, 7);//组织结果表达式
  241. // printf("%d,%d,%d,%d,%d,%d,%dn",i,ii,j,jj,k,kk,l);
  242. // printf("%d%cn",expression[i][0],oper[ii]);
  243. 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]);
  244. return TRUE;
  245. }
  246. }
  247. }
  248. }//end of for oper
  249. }
  250. }
  251. }
  252. }
  253. return FALSE;
  254. }
  255. int CalcArray2(int iNumInput[2][4])
  256. {
  257. // (a * b) * c * d //9 number
  258. int expression[10][2];
  259. int ii,jj,i,j,k,l,kk;
  260. int dRes;
  261. printf("CalcArray2n");
  262.     for(i=0;i<4;i++)
  263.     {
  264.         for(j=0;j<4;j++)    
  265.         {
  266.             if(j==i)
  267.             {
  268.                 continue;
  269.             }
  270.             for(k=0;k<4;k++)
  271.             {
  272.                 if(k==i||k==j)
  273.                 {
  274.                     continue;
  275.                 }
  276.                 for(l=0;l<4;l++)
  277.                 {
  278.                     if(l==i||l==j||l==k)
  279.                     {
  280.                         continue;
  281.                     }
  282.                     expression[1][0]=iNumInput[0][i];
  283.                     expression[3][0]=iNumInput[0][j];
  284.                     expression[6][0]=iNumInput[0][k];
  285.                     expression[8][0]=iNumInput[0][l];
  286. expression[1][1]=eNumber;
  287. expression[3][1]=eNumber;
  288. expression[6][1]=eNumber;
  289. expression[8][1]=eNumber;
  290. for (ii=0;ii<4;ii++)
  291. {
  292. for (jj=0;jj<4;jj++)
  293. {
  294. for (kk=0;kk<4;kk++)
  295. {
  296. expression[2][0] = oper[ii];
  297. expression[2][1] = eOperator;
  298. expression[5][0] = oper[jj];
  299. expression[5][1] = eOperator;
  300. expression[7][0] = oper[kk];
  301. expression[7][1] = eOperator;
  302. expression[9][0] = oper[6];
  303. expression[9][1] = eOperator;
  304. expression[0][0] = oper[4];
  305. expression[0][1] = eOperator;
  306. expression[4][0] = oper[5];
  307. expression[4][1] = eOperator;
  308. dRes = CalcOneExpress(expression);
  309. if(Equal24(dRes))
  310. {
  311. // printf("ok!n");
  312. // CombineResult(expression, 7);//组织结果表达式
  313. // printf("%d,%d,%d,%d,%d,%d,%dn",i,ii,j,jj,k,kk,l);
  314. // printf("%d%cn",expression[i][0],oper[ii]);
  315. 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]);
  316. return TRUE;
  317. }
  318. }
  319. }
  320. }//end of for oper
  321. }
  322. }
  323. }
  324. }
  325. return FALSE;
  326. }
  327. int Calc24(int number[2][4])
  328. {
  329. int find=0;
  330. //括号的几种情况
  331. //1 无括号
  332. //2 (a b) c d 同a b (c d), 下省略
  333. //3 (a b c) d
  334. //4 a (b c) d
  335. //5 (a b) (c d)
  336. //6 ((a b) c) d
  337. //7 (a (b c)) d
  338. //计算不含括号的情况
  339. /* if (CalcArray1(number))
  340. {
  341. find=1;
  342. return TRUE;
  343. }*/
  344. if (CalcArray2(number))
  345. {
  346. find=1;
  347. return TRUE;
  348. }
  349. /* if (CalcArray3(number[2][4]))
  350. {
  351. bol=1;
  352. return bol;
  353. }
  354. if (CalcArray4(number[2][4]))
  355. {
  356. bol=1;
  357. return bol;
  358. }
  359. if (CalcArray5(number[2][4]))
  360. {
  361. bol=1;
  362. return bol;
  363. }
  364. if (CalcArray6(number[2][4]))
  365. {
  366. bol=1;
  367. return bol;
  368. }
  369. if (CalcArray7(number[2][4]))
  370. {
  371. bol=1;
  372. return bol;
  373. }*/
  374. if(find==0)
  375. {
  376. printf("These numbers cannot be combined to 24n");
  377. }
  378. return FALSE;
  379. }
  380. void main (){
  381. Calc24(number);
  382. // printf("finished mainn");
  383. }
  384.