check_if_not2.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. int number[2][4]={8,4,2,4};
  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. int 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(int expression[][2])
  115.  {
  116.     // 算术表达式求值的算符优先算法。
  117.    // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
  118. double result,theta,a,b;
  119. int c,index=0;
  120. sqstack  OPTR;    // 运算符栈,字符元素
  121.    sqstack  OPND;    // 运算数栈,实数元素
  122.    initstack(&OPTR);
  123.    push(&OPTR, 35);
  124.    initstack (&OPND);
  125.    c=expression[index][0];
  126.    while (c!= 35 || gettop(&OPTR)!=35){
  127. //   printf("while start!n");
  128.       if (expression[index][1]!=1) {
  129.          push(&OPND, c);
  130.  index++;
  131.  c=expression[index][0];
  132.  
  133.          } // 不是运算符则进栈
  134.      else {    
  135.  switch (precede(gettop(&OPTR), c)) { 
  136.             case '<': 
  137. // printf("case <!n");   // 栈顶元素优先权低
  138.                  push(&OPTR, c);    
  139.  index++;
  140.  c=expression[index][0];  
  141.   
  142.                  break;
  143.             case '=':   // 脱括号并接收下一字符
  144.                  pop(&OPTR, &c);     
  145.  index++;
  146.  c=expression[index][0];  
  147.   
  148.                  break;
  149.             case '>':   // 退栈并将运算结果入栈
  150.                  pop(&OPTR, &theta);
  151.                  pop(&OPND, &b);  
  152.                  pop(&OPND, &a);
  153. // printf("q->num_ch is %dn",q->num_ch);
  154.                  push(&OPND, Operate(a, theta, b)); 
  155. /*  if (q->num_ch !=35){
  156.  index++;
  157.  c=expression[index][0];
  158.  
  159.    printf("%dn",c);*/
  160. //  }
  161.                  break;
  162. default :
  163. printf("have not this oper!n");
  164. return 0;
  165.          } // switch
  166.       }//else
  167.    } // while
  168.    result=gettop(&OPND);
  169.    printf("the result is %fn",result);
  170.    return result;
  171. } // EvaluateExpression
  172. /*status CombineResult(int expression[][2],int n)
  173. {
  174. char s[15];
  175. */
  176. int Equal24(double dInput)
  177. {
  178. if (fabs(dInput-24)<0.000001)
  179. {
  180. return TRUE;
  181. }
  182. return FALSE;
  183. }
  184. int CalcArray2(int iNumInput[2][4])
  185. {
  186. // (a * b) * c * d //9 number
  187. int expression[10][2],ii,jj,i,j,k,l,kk;
  188. double dRes;
  189. printf("CalcArray2n");
  190.     for(i=0;i<4;i++)
  191.     {
  192.         for(j=0;j<4;j++)    
  193.         {
  194.             if(j==i)
  195.             {
  196.                 continue;
  197.             }
  198.             for(k=0;k<4;k++)
  199.             {
  200.                 if(k==i||k==j)
  201.                 {
  202.                     continue;
  203.                 }
  204.                 for(l=0;l<4;l++)
  205.                 {
  206.                     if(l==i||l==j||l==k)
  207.                     {
  208.                         continue;
  209.                     }
  210.                     expression[2][0]=iNumInput[0][i];
  211.                     expression[4][0]=iNumInput[0][j];
  212.                     expression[7][0]=iNumInput[0][k];
  213.                     expression[9][0]=iNumInput[0][l];
  214. expression[2][1]=eNumber;
  215. expression[4][1]=eNumber;
  216. expression[7][1]=eNumber;
  217. expression[9][1]=eNumber;
  218. for (ii=0;ii<4;ii++)
  219. {
  220. for (jj=0;jj<4;jj++)
  221. {
  222. for (kk=0;kk<4;kk++)
  223. {
  224. expression[3][0] = oper[ii];
  225. expression[3][1] = eOperator;
  226. expression[6][0] = oper[jj];
  227. expression[6][1] = eOperator;
  228. expression[8][0] = oper[kk];
  229. expression[8][1] = eOperator;
  230. expression[9][0] = oper[6];
  231. expression[9][1] = eOperator;
  232. expression[1][0] = oper[4];
  233. expression[1][1] = eOperator;
  234. expression[8][0] = oper[5];
  235. expression[8][1] = eOperator;
  236. dRes = CalcOneExpress(expression);
  237. if(Equal24(dRes))
  238. {
  239. // CombineResult(expression, 7);//组织结果表达式
  240. // printf("%d,%d,%d,%d,%d,%d,%dn",i,ii,j,jj,k,kk,l);
  241. // printf("%d%cn",expression[i][0],oper[ii]);
  242. 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]);
  243. return TRUE;
  244. }
  245. }
  246. }
  247. }//end of for oper
  248. }
  249. }
  250. }
  251. }
  252. return FALSE;
  253. }
  254. int CalcArray1(int iNumInput[2][4])
  255. {
  256. // a * b * c * d //7 number
  257. int expression[8][2],ii,jj,i,j,k,l,kk;
  258. double dRes;
  259. printf("CalcArray1n");
  260.     for(i=0;i<4;i++)
  261.     {
  262.         for(j=0;j<4;j++)    
  263.         {
  264.             if(j==i)
  265.             {
  266.                 continue;
  267.             }
  268.             for(k=0;k<4;k++)
  269.             {
  270.                 if(k==i||k==j)
  271.                 {
  272.                     continue;
  273.                 }
  274.                 for(l=0;l<4;l++)
  275.                 {
  276.                     if(l==i||l==j||l==k)
  277.                     {
  278.                         continue;
  279.                     }
  280.                     expression[0][0]=iNumInput[0][i];
  281.                     expression[2][0]=iNumInput[0][j];
  282.                     expression[4][0]=iNumInput[0][k];
  283.                     expression[6][0]=iNumInput[0][l];
  284. expression[0][1]=eNumber;
  285. expression[2][1]=eNumber;
  286. expression[4][1]=eNumber;
  287. expression[6][1]=eNumber;
  288. for (ii=0;ii<4;ii++)
  289. {
  290. for (jj=0;jj<4;jj++)
  291. {
  292. for (kk=0;kk<4;kk++)
  293. {
  294. expression[1][0] = oper[ii];
  295. expression[1][1] = eOperator;
  296. expression[3][0] = oper[jj];
  297. expression[3][1] = eOperator;
  298. expression[5][0] = oper[kk];
  299. expression[5][1] = eOperator;
  300. expression[7][0] = oper[6];
  301. expression[7][1] = eOperator;
  302. dRes = CalcOneExpress(expression);
  303. if(Equal24(dRes))
  304. {
  305. // CombineResult(expression, 7);//组织结果表达式
  306. // printf("%d,%d,%d,%d,%d,%d,%dn",i,ii,j,jj,k,kk,l);
  307. // printf("%d%cn",expression[i][0],oper[ii]);
  308. 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]);
  309. return TRUE;
  310. }
  311. }
  312. }
  313. }//end of for oper
  314. }
  315. }
  316. }
  317. }
  318. return FALSE;
  319. }
  320. int Calc24(int number[2][4])
  321. {
  322. //括号的几种情况
  323. //1 无括号
  324. //2 (a b) c d 同a b (c d), 下省略
  325. //3 (a b c) d
  326. //4 a (b c) d
  327. //5 (a b) (c d)
  328. //6 ((a b) c) d
  329. //7 (a (b c)) d
  330. int t=0;
  331. //计算不含括号的情况
  332. if (CalcArray1(number))
  333. {
  334. t=1;
  335. return TRUE;
  336. }
  337. if (CalcArray2(number))
  338. {
  339. t=1;
  340. return TRUE;
  341. }
  342. /* if (CalcArray3(number[2][4]))
  343. {
  344. bol=1;
  345. return bol;
  346. }
  347. if (CalcArray4(number[2][4]))
  348. {
  349. bol=1;
  350. return bol;
  351. }
  352. if (CalcArray5(number[2][4]))
  353. {
  354. bol=1;
  355. return bol;
  356. }
  357. if (CalcArray6(number[2][4]))
  358. {
  359. bol=1;
  360. return bol;
  361. }
  362. if (CalcArray7(number[2][4]))
  363. {
  364. bol=1;
  365. return bol;
  366. }*/
  367. if(t==0)
  368. {
  369. printf("These numbers cannot be combined to 24n");
  370. }
  371. return FALSE;
  372. }
  373. void main (){
  374. Calc24(number);
  375. //printf("finished mainn");
  376. }
  377.