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

控制台编程

开发平台:

C/C++

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #define OK 1
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define ERROR 0
  8. #define OVERFLOW -2
  9. #define OPSETSIZE 7
  10. #define STACK_INIF_SIZE 50
  11. #define STACKINCREMENT 10
  12. typedef int status;
  13. typedef struct sqlist{
  14. int bol;
  15. int num_ch;
  16. struct sqlist *next;
  17. }sqlist;
  18. typedef struct sqstack{
  19. int *base;
  20. int *top;
  21. int stacksize;
  22. }sqstack;
  23. unsigned char Prior[7][7] = {     // 表3.1  算符间的优先关系
  24.      '>','>','<','<','<','>','>',
  25.   '>','>','<','<','<','>','>',
  26.   '>','>','>','>','<','>','>',
  27.   '>','>','>','>','<','>','>',
  28.   '<','<','<','<','<','=',' ',
  29.   '>','>','>','>',' ','>','>',
  30.   '<','<','<','<','<',' ','='
  31. };
  32. char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
  33. status init_sq(sqlist *l){
  34. // sqlist *l;
  35. l=(sqlist*)malloc(sizeof(sqlist));
  36. if(l==NULL){
  37. exit(OVERFLOW);
  38. }
  39. l->next=NULL;
  40. return OK;
  41. }
  42. status insert_sq(sqlist **p,int e,int bl){
  43. sqlist *q;
  44. q=(sqlist*)malloc(sizeof(sqlist));
  45. q->num_ch=e;
  46. q->bol=bl;
  47. q->next=NULL;
  48. (*p)->next=q;
  49. (*p)=(*p)->next;
  50.     printf("insert %d,%dis succssed!n",e,bl);
  51. return OK;
  52. }
  53. /*status chang2(char *s , sqlist *l)
  54. {
  55. unsigned int t;
  56. //data da;
  57. sqlist *p=l;
  58. int a,bl;
  59. //char *s=ss;
  60. for(t=0;t<strlen(s);t++){
  61. if(s[t]>47&&s[t]<58){
  62. a=s[t]-48;
  63. bl=0;
  64. insert_sq(&p,a,bl);
  65. }
  66. else
  67. {
  68. a=s[t];
  69. bl=1;
  70. insert_sq(&p,a,bl);
  71. }
  72. }
  73. return OK;
  74. }*/
  75. status chang(char *s,sqlist *l){
  76. int t=0;
  77. unsigned int i=0;
  78.      int bl,ch;
  79. int a1,a2,a;
  80. sqlist *p=l;
  81. for (;i<strlen(s);i++){
  82. if(s[i]>47&&s[i]<58&&t==0){
  83. a1=(int)s[i]-48;
  84. t++;
  85. }
  86. else if(s[i]>47&&s[i]<58&&t==1){
  87. a2=(int)s[i]-48;
  88. a=a1*10+a2;
  89. t++;
  90.             }
  91. else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){
  92. if(t==1){
  93.                         bl=0;
  94. insert_sq(&p,a1,bl);
  95.                 t=0;
  96. }
  97. else if(t==2){
  98. bl=0;
  99. insert_sq(&p,a,bl);
  100.                 t=0;
  101. }
  102. bl=1;
  103. ch=(int)s[i];
  104. insert_sq(&p,ch,bl);
  105.             t=0;
  106. }
  107. printf("the i is %dn",i);
  108. }   //end for
  109. i=strlen(s)-1;
  110. if(s[i]>47&&s[i]<58){
  111. if(s[i-1]>47&&s[i-1]<58){
  112.            bl=0;
  113.    insert_sq(&p,a,bl);
  114.    }
  115. else {
  116. bl=0;
  117. insert_sq(&p,a1,bl);
  118. }
  119. }
  120. bl=1;
  121. a=35;
  122. insert_sq(&p,a,bl);
  123.     printf("chang is OKn");
  124. return OK;
  125. }
  126. status print_sq(sqlist *l)
  127. {
  128. sqlist *p=l;
  129. if(l){
  130. for (p=p->next ;p!=NULL;p=p->next){
  131. printf("%d,%dn",p->num_ch,p->bol );
  132. //printf("OK!");
  133. }
  134. }
  135. else printf("空!");
  136. return OK;
  137. }
  138. int Operate(int a,int theta, int b) {
  139. printf("a=%d,theta=%c,b=%dn",a,theta,b);
  140.    switch(theta) {
  141.       case 43: return a+b;
  142.       case 45: return a-b;
  143.       case 42: return a*b;
  144.       case 47:
  145.   {if(b==0){
  146.   printf("除数不能为0!n");
  147.   exit(ERROR);
  148.   }
  149. else return a/b;
  150.   }
  151.       default : return 0;
  152.    } 
  153. }
  154. int ReturnOpOrd(char op,char* TestOp) {
  155.    int i;
  156.    for(i=0; i< OPSETSIZE; i++) {
  157.       if (op == TestOp[i]) return i;
  158.    }
  159.    return 0;
  160. }
  161. char precede(char Aop, char Bop) {
  162.     printf("%cn",Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]);
  163. printf("%c,  %cn",Aop,Bop);
  164. return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
  165.    
  166. }
  167. status initstack(sqstack *s){
  168. (s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));
  169. if((s)->base==NULL) exit(OVERFLOW);
  170. (s)->top=(s)->base;
  171. (s)->stacksize = STACK_INIF_SIZE;
  172. printf("initstack is finished!n");
  173. return OK;
  174. }
  175. int gettop(sqstack *s){
  176. int e;
  177. if(s->top==s->base){
  178.  printf("NULL1n");
  179.  return 0;
  180.  }
  181. e=*(s->top-1);
  182. printf("gettop %d is OK!n",e);
  183. return e;
  184. }
  185. status push(sqstack *s,int e){
  186. if(s->top-s->base>=s->stacksize){
  187. s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
  188. if(!s->base) exit(OVERFLOW);
  189. s->stacksize+= STACKINCREMENT;
  190. }
  191. *(s->top++)=e;
  192.     printf("push %d is OKn",e);
  193. return OK;
  194. }
  195. status pop(sqstack *s,int *e){
  196. if(s->top==s->base){
  197. printf("NULL2n");
  198. return ERROR;
  199. }
  200. *e=*(--s->top);
  201.     printf("pop %d is OK!n",*e);
  202. return OK;
  203. }
  204. int EvaluateExpression(char* MyExpression) {  // 算法3.4
  205.    // 算术表达式求值的算符优先算法。
  206.    // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
  207. int result;
  208. sqstack  OPTR;    // 运算符栈,字符元素
  209.    sqstack  OPND;    // 运算数栈,实数元素
  210. //   char TempData[30];
  211.    int c,bl,a,b,theta,top;
  212.    //char ch;
  213.    sqlist *q,l;
  214.    
  215.    char *s=MyExpression;
  216.    init_sq(&l);
  217.    chang(s,&l);
  218.    q=&l;
  219.    initstack(&OPTR);
  220.    push(&OPTR, 35);
  221.    initstack (&OPND);
  222.    q=q->next;
  223.    c=q->num_ch;
  224.    bl=q->bol;
  225.  //  strcpy(TempData,"");
  226.    while ((c!= 35 || gettop(&OPTR)!=35)){
  227.    printf("while start!n");
  228.       if (bl!=1) {
  229.          push(&OPND, c);
  230.  q=q->next;
  231.  c=q->num_ch;
  232.  bl=q->bol;
  233.          } // 不是运算符则进栈
  234.      else {  
  235.        //  ch=(char)c;
  236.  top=gettop(&OPTR);
  237. //  topch=(char)top;
  238.  printf("top  %c",top);
  239.  switch (precede(top, c)) { 
  240. // c2=c; 
  241.             case '<': 
  242. printf("case <!n");   // 栈顶元素优先权低
  243.                  push(&OPTR, c);  
  244. //  if(q=q->next!=NULL){  
  245.  q=q->next;
  246.  c=q->num_ch;  
  247.  bl=q->bol; 
  248. //  }
  249.                  break;
  250.             case '=':   // 脱括号并接收下一字符
  251.                  pop(&OPTR, &c);   
  252. //  if(q=q->next!=NULL){  
  253.  q=q->next;
  254.  c=q->num_ch;  
  255.  bl=q->bol; 
  256. //  }
  257.                  break;
  258.             case '>':   // 退栈并将运算结果入栈
  259.                  pop(&OPTR, &theta);
  260.                  pop(&OPND, &b);  
  261.                  pop(&OPND, &a);
  262.  //thetach=(char)theta;
  263.  printf("q->num_ch is %dn",q->num_ch);
  264.                  push(&OPND, Operate(a, theta, b)); 
  265.  printf("%dn",q);
  266. /*  if (q->num_ch !=35){
  267.  q=q->next;
  268.  c=q->num_ch;
  269.  bl=q->bol;
  270.    printf("%dn",c);*/
  271. //  }
  272.                  break;
  273. default :
  274. printf("NO this oper!n");
  275. return 0;
  276.          } // switch
  277.       }//else
  278.    } // while
  279.    result=gettop(&OPND);
  280.    return result;
  281. } // EvaluateExpression
  282. void main(){
  283. char *s="5*(7-1)-6";
  284. int result,t=1;
  285. int numer[4];
  286. printf("/***************************************************/n");
  287. printf("                 24点游戏   dos  版本n");
  288. printf("      北京工商大学微机024班 欧阳锦林 版权所有n");
  289. printf("                 完成于2004年4月15日n");
  290. printf("/***************************************************/n");
  291. printf("The four numbers are 3,4,A,QnWhen you input the formula,n");
  292. printf("you should look A as 1,J as 11,Q as 12,k as 13n");
  293. while(t!=0){
  294. // gets(s);
  295. result=EvaluateExpression(s);
  296. if(result==24){
  297. printf("Very good!!It's right.n");
  298.                         }
  299. else {
  300. printf("sorry!You are wrong!Thank you!n");
  301. }
  302. printf("Contine?Or not??please input Y/N??n");
  303. /*     ch=getchar();
  304. if(ch=='n'||ch=='N')
  305. t=0;
  306. else  if (ch=='Y'||ch=='y')   continue;
  307. else{
  308. printf("your choic is not exact!!"); 
  309. t=0;
  310.         }*/
  311. t=0;
  312. }//end while
  313. //printf("all finished!the result is %dn",result);
  314. }