当前位置:   article > 正文

html+css+js 实现计算器_js不使用 eval函数实现科学计算器

js不使用 eval函数实现科学计算器

JavaScript制作一个计算器,可以进行加、减、乘除、指数、根号、括号运算。

功能上较难实现的是指数与根号运算,但在算法实现上两者其实大同小异。

一种方案是用 ** 直接实现指数运算。

另一种方案较麻烦,也比较锻炼人,则是修改表达式,使之用Math.pow()函数去运算,本次实验中,我使用的也是这种方法。

还需改进的地方:精度问题。

重点掌握eval()


css:

  1. table{
  2. background-color: white;
  3. height:500px;
  4. }
  5. td{
  6. height:100px;
  7. width:120px;
  8. background-color: slategray;
  9. color:white;
  10. border-collapse: ;
  11. text-align:center;
  12. font-size:30px;
  13. }
  14. .left{
  15. text-align:left;
  16. }
  17. .darkorange{
  18. background-color: darkorange;
  19. }

html:

  1. <form>
  2. <table id="table1">
  3. <tr>
  4. <td class="darkorange" colspan="6">
  5. 0
  6. </td>
  7. </tr>
  8. <tr>
  9. <td>1</td>
  10. <td>2</td>
  11. <td>3</td>
  12. <td>*</td>
  13. <td>/</td>
  14. <td>^</td>
  15. </tr>
  16. <tr>
  17. <td>4</td>
  18. <td>5</td>
  19. <td>6</td>
  20. <td>+</td>
  21. <td>-</td>
  22. <td> root </td>
  23. </tr>
  24. <tr>
  25. <td>7</td>
  26. <td>8</td>
  27. <td>9</td>
  28. <td>(</td>
  29. <td>)</td>
  30. <td class="darkorange" rowspan="2">=</td>
  31. </tr>
  32. <tr>
  33. <td class="darkorange" colspan="2">c</td>
  34. <td>0</td>
  35. <td>.</td>
  36. <td>del</td>
  37. </tr>
  38. </table>
  39. </form>
js:

  1. var formula='';
  2. var symbol=0,flag=0,Clear=1,pri=0;
  3. var formula2='';
  4. var row=1,col=0;
  5. var index=0;
  6. for(;row<5;row++){
  7. for(col=0;col<6;col++){
  8. if((col==0||col==3||col==4||col==5)&&row==4) continue;
  9. if(row==3&&col==5) continue;
  10. document.getElementById("table1").rows[row].cells[col].addEventListener("click",show,false);
  11. }
  12. }
  13. //del
  14. document.getElementById("table1").rows[4].cells[3].addEventListener("click",del,false);
  15. //=
  16. document.getElementById("table1").rows[3].cells[5].addEventListener("click",equal,false);
  17. //c
  18. document.getElementById("table1").rows[4].cells[0].addEventListener("click",clear,false);
  19. //^
  20. document.getElementById("table1").rows[1].cells[5].addEventListener("click",exponent,false);
  21. //root
  22. document.getElementById("table1").rows[2].cells[5].addEventListener("click",root,false);
  23. //right
  24. document.getElementById("table1").rows[3].cells[4].addEventListener("click",right,false);
  25. //left
  26. document.getElementById("table1").rows[3].cells[3].addEventListener("click",left,false);
  27. function show(){
  28. //have entered "="
  29. if(flag==1){
  30. if(!isNaN(this.innerHTML)||this.innerHTML=='.'||this.innerHTML=='('||this.innerHTML==')'){
  31. if(this.innerHTML=='0')
  32. document.getElementById("table1").rows[0].cells[0].innerHTML="0";
  33. formula='';
  34. formula2='';
  35. flag=0;
  36. }
  37. }
  38. //enter
  39. // check the first key
  40. if(formula.length==0&&flag==0){
  41. Clear=0;
  42. // enter "0" at the begin
  43. if(this.innerHTML=='0')
  44. formula='';
  45. // if the first key isNaN
  46. else{
  47. if( isNaN(this.innerHTML)&&this.innerHTML!='('&&this.innerHTML!=')')
  48. formula="0"+this.innerHTML;
  49. // if the first key is a number or "()"
  50. else
  51. formula+=this.innerHTML;
  52. document.getElementById("table1").rows[0].cells[0].innerHTML=formula;
  53. formula2=formula;
  54. }
  55. }
  56. //not the first key
  57. else{
  58. flag=0;
  59. // choose one opearation at one time
  60. if(isNaN(this.innerHTML)){
  61. var a=formula[formula.length-1];
  62. if((isNaN(a)&&a!='('&&a!=')'&&this.innerHTML!='('&&this.innerHTML!=')')||a==' ')
  63. del();
  64. }
  65. formula+=this.innerHTML;
  66. // have chosen "^" or "root"
  67. if(isNaN(this.innerHTML)&&symbol!=0&&pri==0&&this.innerHTML!='.' ){
  68. if(this.innerHTML=='(') pri=1 ;
  69. else {
  70. formula2+=')';
  71. symbol=0;
  72. }
  73. }
  74. formula2+=this.innerHTML;
  75. formula.trim();
  76. document.getElementById("table1").rows[0].cells[0].innerHTML=formula;
  77. }
  78. }
  79. //=
  80. function equal(){
  81. if(formula2.length!=0){
  82. if(symbol!=0){
  83. formula2+=')';
  84. symbol=0;
  85. }
  86. formula2.trim();
  87. try {
  88. document.getElementById("table1").rows[0].cells[0].innerHTML=eval(formula2);
  89. formula=eval(formula2).toString();
  90. formula2=formula;
  91. flag=1;
  92. }
  93. catch (Exception) {
  94. document.getElementById("table1").rows[0].cells[0].innerHTML="ERROR";
  95. formula='';
  96. formula2='';
  97. flag=1;
  98. }
  99. }
  100. }
  101. //c
  102. function clear(){
  103. formula='';
  104. formula2='';
  105. document.getElementById("table1").rows[0].cells[0].innerHTML="0";
  106. Clear=1;
  107. }
  108. //del
  109. function del(){
  110. if(flag!=1&&Clear!=1){
  111. if(formula[formula.length-1]=='^'||formula[formula.length-1]==' '){
  112. var k=formula2.lastIndexOf('(');
  113. var j=formula2.lastIndexOf(',');
  114. formula2 = formula2.substring(0,k-8)+formula2.substring(k+1,j);
  115. if(formula[formula.length-1]==' ')
  116. formula=formula.substring(0,formula.length-6);
  117. else
  118. formula=formula.substring(0,formula.length-1);
  119. symbol=0;
  120. }
  121. else{
  122. formula=formula.substring(0,formula.length-1);
  123. formula2=formula2.substring(0,formula2.length-1);
  124. }
  125. document.getElementById("table1").rows[0].cells[0].innerHTML=formula;
  126. }
  127. }
  128. //^
  129. function exponent(){
  130. symbol=1;
  131. i=formula2.length-2;
  132. cal();
  133. }
  134. //root
  135. function root(){
  136. symbol=2;
  137. i=formula2.length-7;
  138. cal();
  139. }
  140. // calculate "^" and "root"
  141. function cal(){
  142. var temp1='',temp2='';
  143. var str="Math.pow(";
  144. for(;i>=0;i--){
  145. var ch=formula2[i];
  146. if(isNaN(ch)&&ch!='.'){
  147. if(ch=='(') {
  148. str="(Math.pow("
  149. continue;
  150. }
  151. else break;
  152. }
  153. else
  154. temp1+=ch;
  155. }
  156. temp1=temp1.split("").reverse().join("");
  157. // ^
  158. if(symbol==1)
  159. formula2=formula2.substring(0,i+1)+str+temp1+",";
  160. // root
  161. if(symbol==2)
  162. formula2=formula2.substring(0,i+1)+str+temp1+",1/";
  163. i=0;
  164. }
  165. //(
  166. function left(){
  167. pri=1;
  168. }
  169. //)
  170. function right(){
  171. var j=formula2.length;
  172. var k=formula2.lastIndexOf('(');
  173. var temp1,temp2;
  174. temp2=eval(formula2.substring(k,j));
  175. formula2= formula2.substring(0,k)+temp2;
  176. pri=0;
  177. }

该实验比较复杂的地方在于它的容错性,在参考了微软自带计算器后,做了如下设置:

              1)初始化界面:

                     ①   显示0;

                     ②   按下等号、删除键: 无反应;

                     ③   按下运算符号: 显示“0”+“运算符号”;

                     ④   按下“.”: 显“0”+“.”;

                     ⑤   按下数字或括号: 显示数字或括号;

 

              2)按下等号:

                     ①   显示结果;

                     ②   按下等号、删除键: 无反应;

                     ③   按下运算符号: 显示结果+“运算符号”;

                     ④   按下“.”: 初始化,并显“0”+“.”;

                     ⑤   按下数字或括号: 初始化,并显示数字或括号;

 

              3)按下c:

                     返回初始化界面;

 

              4)表达式存在除数为0:

      按下等号之后,显示 Infinity;

 

              5)表达式错误:

                     按下等号之后,显示 ERROR;

             

              6)一次只能选择一个运算符号,括号不算。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/163840
推荐阅读
相关标签
  

闽ICP备14008679号