本文实例讲述了JS实现可针对算术表达式求值的计算器功能。分享给大家供大家参考,具体如下:
HTML部分:
<div> <div id="in"> <input name="in" type="text" class="clsin" id="input" value="" readonly="readonly" /> <input type="button" name="=" value="=" onClick="exp_result()"/> </div> <div id="num"> <input type="button" name="seven" value="7" onClick="test(this);"/> <input type="button" name="8" value="8" onClick="test(this);"/> <input type="button" name="9" value="9" onClick="test(this)"/> <input type="button" name="/" value="/" onClick="test(this)"/> <!--span id="showValue"></span--> <br /> <input type="button" name="4" value="4" onClick="test(this)"/> <input type="button" name="5" value="5" onClick="test(this)" /> <input type="button" name="6" value="6" onClick="test(this)"/> <input type="button" name="*" value="*" onClick="test(this)"/> <br /> <input type="button" name="1" value="1" onClick="test(this);"/> <input type="button" name="2" value="2" onClick="test(this);"/> <input type="button" name="3" value="3" onClick="test(this);"/> <input type="button" name="-" value="-" onClick="test(this);"/> <br /> <input type="button" name="0" value="0" onClick="test(this);"/> <input type="button" name="+/-" value="(" onClick="test(this);"/> <input type="button" name="." value=")" onClick="test(this);"/> <input type="button" name="+" value="+" onClick="test(this);"/> </div> </div>
CSS部分:
/* CSS Document */ body { /* padding-right:40%; padding-left:40%;*/ text-align:center; } div{ background-color:orange; height:300px; width:300px; margin-left:auto; margin-right:auto; margin-bottom:auto; margin-top:50px; border-style: groove; border-color: Green; /* margin-top:auto;*/ } #in{ position:relative; margin-left:20px; margin-top:10px; height:27px; width:260px; background:red; top:40px } .clsin { height:27px; width:200px; background-color:#FFF; } #num{ position:relative; margin-left:20px; margin-top:45px; height:150px; width:250px; background-color:green; text-align:left; } #num input { margin-right:10px; margin-top:10px; width:35px; }
js部分:
str_exp=""; //存放表达式 function test(obj) //数字 运算符 btn click { str_exp+=obj.value; document.getElementById("input").value=str_exp; } function compare( ch1, ch2) //比较运算符ch1和ch2优先级 { array1=new Array('+','-','*','/','(',')','@'); array20=new Array('>','>','<','<','<','>', '>'); array21=new Array( '>','>','<','<','<','>','>'); array22=new Array( '>','>','>','>','<','>','>'); array23=new Array('>','>','>','>','<','>','>'); array24=new Array('<','<','<','<','<','=',' '); array25=new Array('>','>','>','>',' ','>','>'); array26=new Array( '<','<','<','<','<',' ','='); array2=new Array(array20,array21,array22,array23,array24,array25,array26); // b[7][7]={'>','>','<','<','<','>','>', // + // '>','>','<','<','<','>','>', // - // '>','>','>','>','<','>','>', // * // '>','>','>','>','<','>','>', // / // '<','<','<','<','<','=',' ', // ( // '>','>','>','>',' ','>','>', // ) // '<','<','<','<','<',' ','=' }; // @ for(var i=0;ch1!=array1[i];i++); for(var j=0;ch2!=array1[j];j++); return array2[i][j]; } function operate(a,preop,b) //计算a?b的值 { // var num1=parseInt(a,10); // var num2=parseInt(b,10); var num1=parseFloat(a); var num2=parseFloat(b); // alert("a:"+num1+preop+"b:"+num2); switch(preop) { case'+':return(num1+num2);break; case'-':return(num1-num2);break; case'*':return(num1*num2);break; case'/':return(num1/num2);break; // default: cout<<"erro"<<endl;return 0; } } function isNum( ch) //判断读取ch是否为操作数 { if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='@') return 0; else return 1; } function extend(str) //将开始一定情况下‘-'转换为'(0-1)*',从而支持负数 { var str1=new Array(); if(str.charAt(0)=='-') { str1+="(0-1)*"; } else { str1+=str.charAt(0); } for(var i=1;i<str.length;i++) { if(str.charAt(i)=='-'&&str.charAt(i-1)=='(') { str1+="(0-1)*"; } else str1+=str.charAt(i); } return str1; } function divided(str) //分离表达式中操作数与操作符存放到返回值中 { var str2=extend(str); // alert(str2); var str_temp=new Array(); var j=0; var expTemp; var expPre; for(var i=0;i<str2.length;i++) { // alert(str2.charAt(i)); expTemp=""; expTemp=str2.charAt(i); if(i==0) str_temp[0]=expTemp; if(i>0) { expPre=str2.charAt(i-1); ///////////////////////!! if(isNum(expTemp)&&isNum(expPre)) //判断前后连续取到的是否都是数字字符,是则拼接 { str_temp[j-1]+=expTemp; j--; } else { str_temp[j]=expTemp; } } j++; } return str_temp; } function exp_result() { str_exp=str_exp+'@'; str=divided(str_exp); numArray=new Array(); //存放操作数 symbolArray =new Array();//存放操作符 symbolArray.push('@'); // numArray.push('@'); // alert(str.length); for(var i=0;str[i]!='@'||symbolArray[symbolArray.length-1]!='@';i++) { // alert(str[i]); // alert(symbolArray[symbolArray.length-1]); if(isNum(str[i])) { // alert("Num push:"+str[i]); numArray.push(str[i]); } else { // alert("symbol:"+str[i]); preop=symbolArray[symbolArray.length-1]; //取栈顶元素 switch(compare(preop,str[i])) { case'<':symbolArray.push(str[i]);break; case'=':symbolArray.pop();break; case'>':b=numArray.pop();a=numArray.pop();preop=symbolArray.pop(); //取两操作数与之前操作符运算 numArray.push(operate(a,preop,b)); //计算结果入栈 // str.push(str[i]); //当前操作符入栈 i--; //继续与之前的操作符比较 break; } } } if(isNaN(numArray[0])) { alert("算术表达式输入有误!!"); } else alert("结果为:"+numArray[0]); str_exp=""; document.getElementById("input").value=str_exp; }
运行效果如下图所示:
感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.jb51.net/code/WebCodeRun测试上述代码运行效果。
PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:
在线一元函数(方程)求解计算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi
科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue
在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq
更多关于JavaScript相关内容还可查看本站专题:《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript操作DOM技巧总结》及《JavaScript字符与字符串操作技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
JS,算术表达式,计算器
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 《庄心妍 实力唱将 发烧音乐精选集》[WAV+CUE][380MB]
- [音展纪念碟]2006年《TAA台湾第十六届国际HI-ENDHI-FI音响展》2cd[WAV]
- 中国音乐地图之听见西藏山歌牧歌酒歌2020[WAV分轨]
- 王宏伟2017-永远的红飘带[太平洋影音][WAV+CUE]
- 费翔.1997-NOW现在【第一中国】【WAV+CUE】
- 新格合唱团.1981-我唱你和2辑(滚石新格民歌系列)【新格】【WAV+CUE】
- 陈柏宇.2011-QUINQUENNIUM【SONY】【WAV+CUE】
- 雨果唱片-《金唛系列-蔷薇依韵琼瑶》WAV
- 陈百强《凝望(2012华纳LPCD45限量版)[DMI]》[WAV整轨]
- 模拟之声慢刻CD《徐小凤45周年》[德国母带][低速原抓WAV+CUE]
- 《庄心妍 实力唱将 发烧音乐精选集》[WAV+CUE][380MB]
- 《王菲 单曲合集》[FlAC/分轨][520MB]
- 《费玉清 原味再现 水长流》[WAV+CUE][430MB]
- 群星.1992-畅销榜老歌金曲10CD【风格】【WAV+CUE】
- 孙悦.2024-时光音乐会【金蜂】【WAV+CUE】