check_if_1.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. #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. double 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]={4,3,6,8};
  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 CalcArray1(int iNumInput[2][4])
  185. {
  186. // a * b * c * d //7 number
  187. int expression[8][2],ii,jj,i,j,k,l,kk;
  188. double dRes;
  189.     for(i=0;i<4;i++)
  190.     {
  191.         for(j=0;j<4;j++)    
  192.         {
  193.             if(j==i)
  194.             {
  195.                 continue;
  196.             }
  197.             for(k=0;k<4;k++)
  198.             {
  199.                 if(k==i||k==j)
  200.                 {
  201.                     continue;
  202.                 }
  203.                 for(l=0;l<4;l++)
  204.                 {
  205.                     if(l==i||l==j||l==k)
  206.                     {
  207.                         continue;
  208.                     }
  209.                     expression[0][0]=iNumInput[0][i];
  210.                     expression[2][0]=iNumInput[0][j];
  211.                     expression[4][0]=iNumInput[0][k];
  212.                     expression[6][0]=iNumInput[0][l];
  213. expression[0][1]=eNumber;
  214. expression[2][1]=eNumber;
  215. expression[4][1]=eNumber;
  216. expression[6][1]=eNumber;
  217. for (ii=0;ii<4;ii++)
  218. {
  219. for (jj=0;jj<4;jj++)
  220. {
  221. for (kk=0;kk<4;kk++)
  222. {
  223. expression[1][0] = oper[ii];
  224. expression[1][1] = eOperator;
  225. expression[3][0] = oper[jj];
  226. expression[3][1] = eOperator;
  227. expression[5][0] = oper[kk];
  228. expression[5][1] = eOperator;
  229. expression[7][0] = oper[6];
  230. expression[7][1] = eOperator;
  231. dRes = CalcOneExpress(expression);
  232. if(Equal24(dRes))
  233. {
  234. // CombineResult(expression, 7);//组织结果表达式
  235. // printf("%d,%d,%d,%d,%d,%d,%dn",i,ii,j,jj,k,kk,l);
  236. // printf("%d%cn",expression[i][0],oper[ii]);
  237. 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]);
  238. return TRUE;
  239. }
  240. }
  241. }
  242. }//end of for oper
  243. }
  244. }
  245. }
  246. }
  247. return FALSE;
  248. }
  249. int Calc24(int number[2][4])
  250. {
  251. //括号的几种情况
  252. //1 无括号
  253. //2 (a b) c d 同a b (c d), 下省略
  254. //3 (a b c) d
  255. //4 a (b c) d
  256. //5 (a b) (c d)
  257. //6 ((a b) c) d
  258. //7 (a (b c)) d
  259. int t=0;
  260. //计算不含括号的情况
  261. if (CalcArray1(number))
  262. {
  263. t=1;
  264. return TRUE;
  265. }
  266. /* if (CalcArray2(number[2][4]))
  267. {
  268. bol=1;
  269. return bol;
  270. }
  271. if (CalcArray3(number[2][4]))
  272. {
  273. bol=1;
  274. return bol;
  275. }
  276. if (CalcArray4(number[2][4]))
  277. {
  278. bol=1;
  279. return bol;
  280. }
  281. if (CalcArray5(number[2][4]))
  282. {
  283. bol=1;
  284. return bol;
  285. }
  286. if (CalcArray6(number[2][4]))
  287. {
  288. bol=1;
  289. return bol;
  290. }
  291. if (CalcArray7(number[2][4]))
  292. {
  293. bol=1;
  294. return bol;
  295. }*/
  296. if(t==0)
  297. {
  298. printf("These numbers cannot be combined to 24n");
  299. }
  300. return FALSE;
  301. }
  302. void main (){
  303. Calc24(number);
  304. //printf("finished mainn");
  305. }
  306.