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

控制台编程

开发平台:

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