24NEW1.C
上传用户:janny_wxd
上传日期:2010-02-03
资源大小:261k
文件大小:5k
源码类别:

控制台编程

开发平台:

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 STACK_INIF_SIZE 50
  10. #define STACKINCREMENT 10
  11. typedef int status;
  12. typedef struct sqstack{
  13. int *base;
  14. int *top;
  15. int stacksize;
  16. }sqstack;
  17. typedef struct sqlist{
  18. int bol;
  19. int num_ch;
  20. struct sqlist *next;
  21. }sqlist;
  22. sqlist *init_sq(){
  23. sqlist *l;
  24. l=(sqlist*)malloc(sizeof(sqlist));
  25. if(l==NULL){
  26. exit(OVERFLOW);
  27. }
  28. l->next=NULL;
  29. return l;
  30. }
  31. status insert_sq(sqlist **p,int e,int bl){
  32. sqlist *q;
  33. q=(sqlist*)malloc(sizeof(sqlist));
  34. q->num_ch=e;
  35. q->bol=bl;
  36. q->next=NULL;
  37. (*p)->next=q;
  38. (*p)=(*p)->next;
  39.     printf("insert %d is succssed!n",e);
  40. return OK;
  41. }
  42. sqtack *initstack(){
  43. sqstack *s;
  44. s->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));
  45. if(s->base==NULL) exit(OVERFLOW);
  46. s->top=s->base;
  47. s->stacksize = STACK_INIF_SIZE;
  48. return s;
  49. }
  50. int *gettop(sqstack *s){
  51. int e;
  52. if(s->top==s->base){
  53.  printf("NULL1n");
  54.  return NULL;
  55.  }
  56. e=*(s->top-1);
  57. return &e;
  58. }
  59. status push(sqstack *s,int e){
  60. if(s->top-s->base>=s->stacksize){
  61. s->base=(int*)realloc(s->base ,(s->stacksize+STACKINCREMENT)*sizeof(int));
  62. if(!s->base) exit(OVERFLOW);
  63. s->stacksize+= STACKINCREMENT;
  64. }
  65. *(s->(top++))=e;
  66.     printf("push %d is OKn",e);
  67. return OK;
  68. }
  69. status pop(sqstack *s,int *e){
  70. if(s->top==s->base){
  71. printf("NULL2n");
  72. return ERROR;
  73. }
  74. *e=*((--s)->top);
  75.     printf("pop %d is OK!/n",*e);
  76. return OK;
  77. }
  78. status chang(char *s,sqlist *l){
  79. int t=0,temp,i=0;
  80.     int bl;
  81. int a1,a2,a,ii;
  82. sqlist *p=l;
  83. for (;i<strlen(s);i++){
  84. if(s[i]>47&&s[i]<58&&t==0){
  85. a1=(int)s[i]-48;
  86. t++;
  87. }
  88. else if(s[i]>47&&s[i]<58&&t==1){
  89. a2=(int)s[i]-48;
  90. a=a1*10+a2;
  91. t++;
  92.             }
  93. else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){
  94. if(t==1){
  95.                         bl=0;
  96. insert_sq(&p,a1,bl);
  97.                 t=0;
  98. }
  99. else if(t==2){
  100. bl=0;
  101. insert_sq(&p,a,bl);
  102.                 t=0;
  103. }
  104. bl=1;
  105. insert_sq(&p,s[i],bl);
  106.             t=0;
  107. }
  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.     printf("chang is OKn");
  121. return OK;
  122. }
  123. int operate(int a,char c,int b){
  124. if(c=='+') return(a+b);
  125. else if(c=='-') return(a-b);
  126. else if(c=='*') return(a*b);
  127. else if(c=='/'){
  128. if (b==0) {
  129. printf("除数不能为零n");
  130. exit(ERROR);
  131. }
  132. else return (a/b);
  133. }
  134. }
  135. char precede(char c1,char c2){
  136. int tt=1;
  137. char c3;
  138. if(c1=='+'||c1=='-'){
  139. if(c2=='*'||c2=='/'||c2=='(') c3='<';
  140. else c3='>';
  141. }
  142. else if(c1=='*'||c1=='/'){
  143. if(c2=='(') c3='<';
  144. else c3='>';
  145. }
  146. else if(c1=='('){
  147. if(c2==')') c3='=';
  148. else if(c2=='#'){
  149. printf("ERROR2!n");
  150. tt=0;
  151. }
  152. else c3='<';
  153. }
  154. else if(c1==')'){
  155. if(c2==')')
  156. {printf("ERROR!2n"); tt=0;  }
  157. else if(c2=='#') c3='=';
  158. else c3='<';
  159. }
  160. else printf("无此字符n");
  161. if(tt==0) exit(ERROR);
  162.         return(c3);
  163. }
  164. int evaluateExpression(sqlist *l){
  165. int a,b,theta,result;
  166. char c,ch;
  167. sqlist *r=l;
  168.     sqstack *optr,*opnd;
  169. ch='#';
  170. optr=initstack();
  171. push(optr,ch);
  172. opnd=initstack();
  173. c=r->num_ch;
  174. while(c!=35||gettop(optr)->ch!='#'){
  175. if(c>0&&c<14){
  176. push(opnd,c);
  177. r=r->next;
  178. c=r->num_ch;
  179. }
  180. else    {
  181. switch(prcede(gettop(optr),c)){
  182. case'<':
  183. push(optr,c);
  184. r=r->next;
  185. c=r->num_ch;
  186. break;
  187.  case'=':
  188. pop(optr,&c);
  189. r=r->next;
  190. c=r->num_ch;
  191. break;
  192.  case'>':
  193. pop(optr,&theta);
  194. pop(opnd,&b);
  195. pop(opnd,&a);
  196. result=operate(a,theta,b);
  197. push(opnd,result);
  198. break;
  199.  }//end switch
  200. } //end else
  201. }  //end while 
  202. return *gettop(opnd);
  203. }
  204. void main (){
  205. char *s,ch,tt[41];
  206.     int t=1;
  207.     int result;
  208. sqlist *l;
  209. l=init_sq();
  210. printf("/***************************************************/n");
  211. printf("                 24点游戏   dos  版本n");
  212. printf("      北京工商大学微机024班 欧阳锦林 版权所有n");
  213. printf("                 完成于2004年4月15日n");
  214. printf("/***************************************************/n")
  215. printf("The four numbers are 3,4,A,QnWhen you input the formula,n");
  216. printf("you should look A as 1,J as 11,Q as 12,k as 13n");
  217. while(t!=0){
  218. gets(tt);
  219. s=tt;
  220.   chang(s,l);
  221. result=evaluateExpression(l);
  222. if(result==24){
  223. printf("Very good!!It's right.");
  224.                         }
  225. else {
  226. printf("sorry!You are wrong!Thank you!");
  227. }              
  228. printf("Contine?Or not??please input Y/N??");
  229.     ch=getchar();
  230. if(ch=='n'||ch=='N')
  231. t=0;
  232. else  if (ch=='Y'||ch=='y')   continue;
  233. else{
  234. printf("your choic is not exact!!"); 
  235. t=0;
  236.         }
  237. }//end while 
  238. }