老师,看看我这个计算器可以怎么优化一下吗?

老师,看看我这个计算器可以怎么优化一下吗?

<!DOCTYPE html>
<html>
<head>
	<title>简易计算器</title>
	<link rel="stylesheet" type="text/css" href="index.css">
	<script type="text/javascript" src="index.js"></script>
</head>
<body onload="init()">
	<div class="div_out" id="div1">
		<div class="div_in" id="div2">
			<input type="text" name="text1" id="text1"/>
		</div>
		<div class="div_in" id="div3">
			<input type="text" name="text2" id="text2"/>
		</div>
		<div class="div_in" id="div4">
			<input type="button" name="button" value="C" id="C" />
			<input type="button" name="button" value="( )" id="( )" />
			<input type="button" name="button" value="⬅" id="⬅" />
			<input type="button" name="button" value="/" id="÷" />
			<input type="button" name="button" value="7" id="7" />
			<input type="button" name="button" value="8" id="8" />
			<input type="button" name="button" value="9" id="9" />
			<input type="button" name="button" value="*" id="×" />
			<input type="button" name="button" value="4" id="4" />
			<input type="button" name="button" value="5" id="5" />
			<input type="button" name="button" value="6" id="6" />
			<input type="button" name="button" value="-" id="-" />
			<input type="button" name="button" value="1" id="1" />
			<input type="button" name="button" value="2" id="2" />
			<input type="button" name="button" value="3" id="3" />
			<input type="button" name="button" value="+" id="+" />
			<input type="button" name="button" value="+/-" id="+/-" />
			<input type="button" name="button" value="0" id="0" />
			<input type="button" name="button" value="." id="." />
			<input type="button" name="button" value="=" id="=" />
		</div>
	</div>
</body>
</html>
*{
	margin:0px;
	padding:0px;
	border:0px;
}
div{
	left:0px;
	right:0px;
	margin:auto;
	border:1px solid grey;
}
.div_out{
	width:300px;
	height:450px;
	top:50px;
	position:relative;
}
.div_in{
	width:295px;
}
#div2{
	height: 40px;
}
#div3{
	height:40px;
}
input[type="text"]{
	width: 295px;
	text-align:right;
	padding-right:10px;
	box-sizing:border-box;
}
#text1{
	line-height:39px;
	font-size:25px;
	color:#33CCFF;
}
#text2{
	line-height:39px;
	font-size:35px;
}
input[type="button"]{
	width:60px;
	height:60px;
	margin:5px;
	font-size:20px;
}
input[type="button"]:hover{
	background-color:#33CCFF;
	border:1px solid grey;
}
//初始化
function init(){
	var text1=document.getElementById("text1");
	text1.value="";
	var text2=document.getElementById("text2");
	text2.value=0;
	key_onclick();
	var key_value;
}
//为每个按键添加点击事件,
function key_onclick(){
	var buttons=document.getElementsByName("button");
	for(var i=0;i<buttons.length;i++){
		buttons[i].onclick=function(){
		judge(this.value); //调用函数(该函数根据botton值进行判断如何处理)
	}
	}
}
var flag;//用于标记是否按下“=”符号,"false"="未按下","true"="已按下"
function judge(key_value){	
	if(flag==true){
		text1.value="";  //“=”符号已按下,再次输入时将清空text1文本框以便显示接下来输入的值
		flag=false;
	}
	if(!isNaN(key_value)){
		text1.value=text1.value+key_value;
		calculate();  //调用函数(该函数实现计算功能)
	}else if(isNaN(key_value)){
		switch(key_value){
			case "+":
			case "-":
			case "*":
			case "/":judgeLastIsMathematicalOperator(); //调用函数(该函数将对同时输入多个运算符的情况进行处理)
					 text1.value=text1.value+key_value;
					 break;
			case ".":key_value=judgeLastIsNumber(); //调用函数(该函数将对小数点如何输入进行处理)
					 text1.value=text1.value+key_value;
					 break;
			case "=":text1.value=text2.value;
					 text2.value="";
					 flag=true;
					 break;
			case "C":text1.value="";
					 text2.value="0";
					 break;
			case "⬅":deleteStr(); //调用函数(该函数将删除计算式最后一个字符)
					 calculate(); //调用函数(该函数实现计算功能)
					 break;
			case "( )":alert("该功能正在完善中!");
					    break;
			case "+/-":alert("该功能正在完善中!");
					    break;
		}
	}
	}

//该函数将对同时输入多个运算符的情况进行处理
function judgeLastIsMathematicalOperator(){  
	var length=text1.value.length;
	var lastStr=text1.value.substr(-1,);
	if(lastStr=="+"||lastStr=="-"||lastStr=="*"||lastStr=="/"){
		text1.value=text1.value.substr(0,length-1);
	}
}

//该函数将对小数点如何输入进行处理
function judgeLastIsNumber(){
	var length=text1.value.length; //text1的value值长度
	var lastStr=text1.value.substr(-1,);  //获取text1的value值最后一个字符
	if(lastStr==""){
		return "0."  //如果lastStr为空(最后一个字符为空,即此前无输入),则返回“0.”
	}else{
		if(isNaN(lastStr)){
		return "0."  //如果lastStr不为空,且最后一个字符不为数字,返回0.
		}else{
			var index=text1.value.lastIndexOf(".");		//获取最后一个"."的索引值,若未找到则返回“-1”
			if(index!=-1){	
				var pointToLast=text1.value.substr(index+1,); //获取"."到最后一个字符的字符串
				if(!isNaN(pointToLast)){					
					return "";
				}
			}else{
				return ".";
			}
			}
		}
}

//该函数将删除计算式最后一个字符
function deleteStr(){
	var length=text1.value.length; //text1的value值长度
	text1.value=text1.value.substr(0,length-1);
}

//该函数实现计算功能
function calculate(){
	if (text1.value!="") {
		var lastStr=text1.value.substr(-1,);		
		if(!isNaN(lastStr)){
			text2.value=eval(text1.value);
		}else{
			text2.value="";
		}
	}else text2.value="0";	
}

上午干到下午,终于完成到现在这个样子。。。但是这个括号以及正负号的功能没有做 ,感觉这两个有点麻烦,希望老师也能说一下这两个功能实现的方法。。。。

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,同学可以参考如下思路:

1、()括号实现如下:

a. 在js文件中定义一个全局变量并赋值为true,如var flag=true;

b. 当点击()按钮时,先判断flag的值,如果flag为true,显示出(左括号,如果flag为false,显示出右括号)。例如(2+10)-(3+2)

同学也可以修改html代码,将(左括号和)右括号分别作为一个按钮,这样用户就可以自己选择了。

2、+/-按钮是取当前结果的相反数,实现如下:

a. 当点击+/-时,在第一行表达式最前面和最后面加上左括号和右括号,并在前面添加-负号,例如:-(5+3)

b. 将表达式的结果显示在第二行中。

http://img1.sycdn.imooc.com//climg/5f97f2db096b334405520245.jpg

  • 谁叫我这么坏 提问者 #1
    要是括号多层级嵌套使用怎么处理呢?还有括号输入的位置以及数量不对造成无法计算这个情况怎么处理呢?
    2020-10-27 18:23:31
好帮手慕阿慧 2020-10-27 18:57:22

同学你好,

1、多层嵌套可以计算出结果。如下:

http://img1.sycdn.imooc.com//climg/5f97fca709ae10f702910194.jpg

结果如下:

http://img1.sycdn.imooc.com//climg/5f97fcc3094dcff904400123.jpg

2、同学可以使用eval()方法测试一下表达式,并使用try catch处理异常。当表达式有误时,会执行catch中的代码。

例如:

http://img1.sycdn.imooc.com//climg/5f97faed09b11ec003760341.jpg

运行结果如下:

http://img1.sycdn.imooc.com//climg/5f97fb24094b410705710405.jpg

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师