calculator.h
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:3k
源码类别:

游戏

开发平台:

Visual C++

  1. ///////本程序完成简易的calculator,为用户输入做准备!
  2. #define MAX_STACK_SIZE 50
  3. #define MAX_EXPR_SIZE 50
  4. enum  precedence{lparen,rparen,plus,minus,times,divide,eos,operand};
  5. static int isp[7]={0,19,12,12,13,13,0};
  6. static int icp[7]={20,19,12,12,13,13,0};
  7. //expr 是中缀表达式以等于号结束!
  8. char expr[MAX_EXPR_SIZE];
  9. //string 是后缀表达式
  10. char string[MAX_EXPR_SIZE];
  11. //length 是string 的长度
  12. precedence pstack[MAX_STACK_SIZE];
  13. float stack[MAX_STACK_SIZE];
  14. short poke[4];
  15. ///////////////////////////////////////
  16. void add(int &top,float p)
  17. {
  18. if(top<49)
  19. stack[++top]=p;
  20. else
  21. exit(-1);
  22. }
  23. float  del(int &top)
  24. {
  25. if(top==-1)
  26. exit(0);
  27. else
  28. return stack[top--];
  29. }
  30. //////////////////////////////////////////////
  31. void add(int &top,precedence poke)
  32. {
  33. if(top<49)
  34. pstack[++top]=poke;
  35. else 
  36. exit(-1);
  37. }
  38. precedence delt(int &top)
  39. {
  40. if(top==-1)
  41. exit(-1);
  42. else
  43. return pstack[top--];
  44. }
  45. char print_token(precedence token)
  46. {
  47. switch(token)
  48. {
  49. case lparen:return '(';
  50. case rparen:return ')';
  51. case plus: return '+';
  52. case minus: return '-';
  53. case times: return '*';
  54. case divide:return '/';
  55. case eos: return '=';
  56. default :return NULL ;
  57. }
  58. }
  59. precedence get_token(char&symbol,int &n)
  60. {
  61. symbol=expr[n++];
  62. switch(symbol)
  63. {
  64. case '(':return lparen;
  65. case ')':return rparen;
  66. case '+':return plus;
  67. case '-':return minus;
  68. case '*':return times;
  69. case '/':return divide;
  70. case '=':return eos;
  71. default :return operand;
  72. }
  73. }
  74. void postfix( )
  75. {
  76. char symbol;
  77. precedence token;
  78. int n=0;
  79. pstack[0]=eos;
  80. int top=0;
  81. int length=0;
  82. for(token=get_token(symbol,n);token!=eos;token=get_token(symbol,n))
  83. {
  84. if(token==operand)
  85. string[length++]=symbol;
  86. else if(token==rparen)
  87. {
  88. while(pstack[top]!=lparen)
  89. {
  90. string[length++]=print_token(delt(top));
  91. }
  92. delt(top);
  93. }
  94. else{
  95. while(isp[pstack[top]]>=icp[token])
  96. string[length++]=print_token(delt(top));
  97. add(top,token);
  98. }
  99. }
  100. while((int)(token=delt(top))!=(int)eos)
  101. {
  102. string[length++]=print_token(token);
  103. }
  104. string[length++]='=';
  105. string[length]=NULL;
  106. }
  107. precedence gettoken(char&symbol,int &n)
  108. {
  109. symbol=string[n++];
  110. switch(symbol)
  111. {
  112. case '+':return plus;
  113. case '-':return minus;
  114. case '*':return times;
  115. case '/':return divide;
  116. case '=':return eos;
  117. default :return operand;
  118. }
  119. }
  120. float eval()
  121. {
  122. precedence token;
  123. char symbol;
  124. float op1;
  125. float op2;
  126. int n=0;
  127. int top=-1;
  128. token=gettoken(symbol,n);//应用
  129. while(token!=eos)
  130. {
  131. if(token==operand)
  132. add(top,poke[(int)symbol-48]);//应用
  133. else{
  134. op2=del(top);
  135. op1=del(top);
  136. switch(token)
  137. {
  138. case plus:add(top,op1+op2);break;
  139. case minus: add(top,op1-op2);break;
  140. case times: add(top,op1*op2);break;
  141. case divide: add(top,op1/op2);break;
  142. }
  143. }
  144. token=gettoken(symbol,n);
  145. }
  146. return del(top);
  147. }