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