HTML5+CSS3+JS:计算器(代码全+解析+实现结果)

HTML如何实现一个计算器?

代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Yummy计算机</title>
		<style type="text/css">
		.bg{
			width:35%;
			height: 400px;
			background:pink;
			margin-left: 35%;
			margin-right: 35%;
		}
		.uup{
			width: 100%;
			height: 9%;
			text-align: "center";
		}
		.up{
			width: 88%;
			height: 12%;
			border: solid 1px black;
			margin: 3% 5% 2% 6%;
		}
		.down{
			width: 88%;
			height: 65%;
			border: solid 1px black;
			margin: 2% 6% 4% 6%;
		}
		.logo{
			width: 32%;
			height: 95%;
			margin-top: 0px;
			margin-left: 0px;
			/*background-color: pink;*/
			font-size: 24px;
			color: white;
		}
		.show{
			width: 100%;
			height: 100%;
			background-color: white;
		}
		.numtable tr td{
			width: 28%;
			height: 25%;
		}
		.numtable input{
			width: 75%;
			height: 100%;
			margin: 8%;
			background-color: white;
		}
		
		</style>
		<script type="text/javascript">
			window.onload=initZero;
	var str = new Array();//保留输入字符数组
	var numStr = new Array();//数字栈
	var charStr = new Array();//运算符栈
	var flag = new Array();//负数标志位,true表示负数,与运算符栈相等
	var buttonId = new Array("reset","plus","minus","del","num7","num8","num9","multiply","num4","num5","num6","divide","num1","num2","num3","point","leftbracket","num0","rightbracket","equal");
	//按钮ID名
	function $(id){
		return document.getElementById(id);
	}
	function initZero(){
		$("inputframe").value=0;//结果显示框清零
		initCE();//保存数据的栈和数组“清空”
		addListener();//为每个按钮添加click事件监听器
	}
	function initCE(){
		while(str.length!=0){
			str.pop();//删除数组最后一个元素
		}
		while(numStr.length!=0){
			numStr.shift();//删除数组第一个元素
		}
		while(charStr.length!=0){
			charStr.shift();//删除数组第一个元素
		}	
		while(flag.length!=0){
			flag.shift();
		}
		charStr[0] = "0";//运算符栈先插入一个优先级最低的“0”元素
		flag[0] = false;
	}
	function addListener(){
		for (var i=0; i<buttonId.length; i++){
			$(buttonId[i]).addEventListener("click",function(){//为每个按钮添加click事件监听器
				if(this.id == "equal"){//如果按下”=“按钮
					var result = getResult();
					/*if (isNaN(result)){
						alert("输入有错误!");
					}else{//numStr[0]位结果,按下equal时不清空*/
						if(str.length==0){
							$("inputframe").value = 0;
						}else{
							$("inputframe").value = showStr() + "=" + result;
							initCE();
						}
				}else if(this.id == "reset"){
					initCE();//如果按下“CE”,进行复位,数字栈,运算符栈清空并插入“0”元素
					$("inputframe").value = "0";//显示结果框清空
				}else if(this.id == "del"){
					str.pop();//按下“del”,撤回
					$("inputframe").value = showStr();	
				}else{//如果按下其他运算符和数字按钮,插入str数组中
					str.push(this.value);
					$("inputframe").value = showStr();//显示结果框中数字随着按钮按下不断增加
				}
			});
		}
	}
	function mul(num1,num2){//JavaScript存在小数计算精度丢失的问题,通过升级降级移动小数点解决
		var pointNum1 = 0;
		var pointNum2 = 0;
		var numStr1 = num1.toString();
		var numStr2 = num2.toString();
		if(numStr1.indexOf(".",0)!=-1){
			pointNum1 = numStr1.length-numStr1.indexOf(".",0)-1;//小数点个数
			num1 = Number(numStr1.replace(".",""));//移动小数点将实数升级
		}
		if(numStr2.indexOf(".",0)!=-1){
			pointNum2 = numStr2.length-numStr2.indexOf(".",0)-1;
			num2 = Number(numStr2.replace(".",""));
		}
		var pointNum = pointNum1+pointNum2;//运算结果小数点个数
		var resStr = (num1*num2).toString();
		if(pointNum!=0){
			if(resStr.length>pointNum){//升级后运算结果位数比小数点位数多
				var num = resStr.length-pointNum;
				var sstr = resStr.split("");
				resStr="";
				for(var i=0;i<num;i++){
					resStr = resStr.concat(sstr[i]);
				}	
				resStr = resStr.concat(".");
				for(var i=num;i<sstr.length;i++){
					resStr = resStr.concat(sstr[i]);
				}
			}else{
				var zero = "0";
				var point = ".";
				var num = pointNum-resStr.length+2;
				for(var i=0;i<num;i++){
					if(i==num-2){
						resStr = point.concat(resStr);
					}else{
						resStr = zero.concat(resStr);					
					}
				}
			}
		}
		return Number(resStr);
	}
	function div(num1,num2){
		var pointNum1 = 0;
		var pointNum2 = 0;
		var numStr1 = num1.toString();
		var numStr2 = num2.toString();
		if(numStr1.indexOf(".",0)!=-1){
			pointNum1 = numStr1.length-numStr1.indexOf(".",0)-1;
			num1 = Number(numStr1.replace(".",""));
		}
		if(numStr2.indexOf(".",0)!=-1){
			pointNum2 = numStr2.length-numStr2.indexOf(".",0)-1;
			num2 = Number(numStr2.replace(".",""));
		}		
		var resStr = num2/num1;
		
		var pointNum = pointNum1>pointNum2?pointNum1-pointNum2:pointNum2-pointNum1;
		var pointSum = 1;
		if(pointNum!=0){
			for(var i = 0; i< pointNum; i++){
				pointSum = pointSum*10;
			}
			resStr = resStr/pointSum;
		}
		return resStr;
	}
	function charRes(num1, num2, ch){//根据表达式返回运算结果
		var res = 0;
		switch(ch){
			case "+":res = num2+num1;break;
			case "-":res = num2-num1;break;
			//case "*":res = num2*num1;break;
			case "*":res = mul(num1,num2);break;
			//case "/":res = num2/num1;break;
			case "/":res = div(num1,num2);break;
		}
		//JavaScript存在小数计算精度丢失的问题
		return res;
	}
	function charNum(str){//为每个运算符指定数组下标
		var num = 0;
		switch(str){
			case "+":num = 0;break;
			case "-":num = 1;break;
			case "*":num = 2;break;
			case "/":num = 3;break;
			case "(":num = 4;break;
			case ")":num = 5;break;
			case "0":num = 5;break;
		}
		return num;
	}
	function judgePriority(str1,str2){
		//通过operator二维数组的值,判断运算符优先级,大于零表示str1优先级大,
		//等于零表示遇到括号,小于零表示str2优先级大
		var operator = new Array(6);
		operator[0] = new Array(-1,-1,1,1,1,0);
		operator[1] = new Array(-1,-1,1,1,1,0);
		operator[2] = new Array(-1,-1,-1,-1,1,0);
		operator[3] = new Array(-1,-1,-1,-1,1,0);
		operator[4] = new Array(1,1,1,1,1,0);
		operator[5] = new Array(1,1,1,1,1,0);
		//下面为二位数组的格式
		/*   + - x / ( )
		   + 
		   -
		   X
		   /
		   (
		   0
		*/
		var i = charNum(str1);
		var j = charNum(str2);
		return operator[i][j];

	}
	function getResult(){//返回总运算结果
		var j = 0;
		var finalNum = "";//将数字分离出来
		var fflag;
		for(var i=0; i<str.length; i++){
			finalNum = "";
			fflag = false;
			if(!isNaN(str[i])){//如果是数字,可能是多位
				j = i+1;
				while(j<str.length){//找到可能是多位数字的最后一位,j-1位最后一位
					if(!isNaN(str[j])){//是数字
						j++;
					}else if(str[j]=="."){
						j++;
					}else{
						break;
					}
				}
				for (m=i; m<j; m++){//将纯数字字符串分离出来
					finalNum += str[m];
				}		
				numStr.unshift(Number(finalNum));//操作数入numStr栈
				i = j-1;
			}
			else{
				//负数只有下面两种情况
				if(str[i]=="-"){
					if(i==0){//如果为-6+4*3
						fflag=true;
					}else {
						if(str[i-1]=="("){//如果为5+(-6-2)
							fflag=true;//flag=true代表为负数	
						}else{
							fflag=false;
						}	
					}
				}
				//alert("flag:"+flag);
				if(judgePriority(charStr[0],str[i]) > 0){//前面优先级大,则入charStr栈
					charStr.unshift(str[i]);
					flag.unshift(fflag);
				}else{	
					var ch = charStr.shift();
					if(judgePriority(charStr[0],str[i]) == 0){//当碰到右括号时
						while(ch!="("){
							var num1 =  numStr.shift();
							if(ch=="-" && flag[0]==true){
								numStr.unshift(0);
							}
							flag.shift();
							var num2 = numStr.shift();
							//alert("two:" + charRes(num1,num2,ch));							
							numStr.unshift(charRes(num1,num2,ch));//并将新的操作数入numStr栈	
							ch = charStr.shift();//直到弹出左括号
						}
						flag.shift();//与左括号配对的负号位标志弹出
						i++;//使指针指向下一个
					}else{
						var num1 = numStr.shift();
						if(ch=="-" && flag[0]==true){//ch为负号而不是减号
							numStr.unshift(0);
						}
						flag.shift();
						var num2 = numStr.shift();	
						//alert("first:"+charRes(num1,num2,ch));
						numStr.unshift(charRes(num1,num2,ch));//并将新的操作数入numStr栈
					}
					i--;//保持指针仍然指向该运算符
				} 
			}
		}
		while(charStr.length!=1){
			var ch = charStr.shift();
			var num1 = numStr.shift();
			if(ch=="-" && flag[0]==true){
				numStr.unshift(0);				
			}
			flag.shift();
			var num2 = numStr.shift();
			numStr.unshift(charRes(num1,num2,ch));//向数组开头插入一个元素
		}
		return numStr[0];
	}
	function showStr(){
		var equalStr = "";
		if(str.length==0){
			equalStr="0";
		}
		for (var i=0;i<str.length;i++){
			equalStr += str[i];
		}
		return equalStr;
	}

	</script>
	</head>
	<body>
		<!--背景-->
		<div class="bg">
			<!--最上标签-->
			<div class="uup">
				<p class="logo">Yummy</p>
			</div>
			<!--设置输入框可以编辑-->
			<div class="up">
				<input type="text" class="show" id="inputframe" disabled="false" />
				<!--disabled设置输入框不可编辑-->
				<!--<input type="text" class="show" id="inpurame" disabled="false" />-->
			</div>
			<div class="down">
				<table class="numtable">
					<tr>
						<td><input type="button" value="CE" id="reset"/></td>
						<td><input type="button" value="+" id="plus"/></td>
						<td><input type="button" value="-" id="minus"/></td>
						<td><input type="button" value="DEL" id="del"/></td>
					</tr>
					<tr>
						<td><input type="button" value="7" id="num7"/></td>
						<td><input type="button" value="8" id="num8"/></td>
						<td><input type="button" value="9" id="num9"/></td>
						<td><input type="button" value="*" id="multiply"/></td>
					</tr>
					<tr>
						<td><input type="button" value="4" id="num4"/></td>
						<td><input type="button" value="5" id="num5"/></td>
						<td><input type="button" value="6" id="num6"/></td>
						<td><input type="button" value="/" id="divide"/></td>
					</tr>
					<tr>
						<td><input type="button" value="1" id="num1"/></td>
						<td><input type="button" value="2" id="num2"/></td>
						<td><input type="button" value="3" id="num3"/></td>
						<td><input type="button" value="." id="point"/></td>
					</tr>
					<tr>
						<td><input type="button" value="(" id="leftbracket"/></td>
						<td><input type="button" value="0" id="num0"/></td>
						<td><input type="button" value=")" id="rightbracket"/></td>
						<td><input type="button" value="=" id="equal"/></td>
					</tr>
				</table>
			</div>
		</div>
	</body>
</html>

那Python如何实现一个计算器呢?请查阅:Python:计算器

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 HTML+JS+CSS 计算器的示例代码,可以进行加、减、乘、除、取模和清除操作。 HTML 代码: ```html <!DOCTYPE html> <html> <head> <title>计算器</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="calculator"> <div class="display"></div> <button class="operator" value="+">+</button> <button class="operator" value="-">-</button> <button class="operator" value="*">×</button> <button class="operator" value="/">÷</button> <button class="operator" value="%">%</button> <button class="number" value="7">7</button> <button class="number" value="8">8</button> <button class="number" value="9">9</button> <button class="number" value="4">4</button> <button class="number" value="5">5</button> <button class="number" value="6">6</button> <button class="number" value="1">1</button> <button class="number" value="2">2</button> <button class="number" value="3">3</button> <button class="number" value="0">0</button> <button id="clear">C</button> <button id="equal">=</button> </div> <script src="script.js"></script> </body> </html> ``` CSS 代码: ```css .calculator { width: 240px; border: 1px solid #ccc; border-radius: 5px; margin: 50px auto; padding: 10px; text-align: center; } .display { font-size: 24px; height: 40px; margin-bottom: 10px; padding: 5px; text-align: right; } button { font-size: 18px; width: 40px; height: 40px; margin: 5px; background: #eee; border: none; border-radius: 5px; cursor: pointer; } button:hover { background: #ddd; } button.operator { background: #f90; color: #fff; } button#clear { background: #ccc; } button#equal { background: #5cb85c; color: #fff; } ``` JS 代码: ```js const display = document.querySelector('.display'); const operators = document.querySelectorAll('.operator'); const numbers = document.querySelectorAll('.number'); const clear = document.querySelector('#clear'); const equal = document.querySelector('#equal'); let firstOperand = ''; let secondOperand = ''; let currentOperator = null; function clearDisplay() { firstOperand = ''; secondOperand = ''; currentOperator = null; display.textContent = '0'; } function calculate() { let result = 0; switch (currentOperator) { case '+': result = parseFloat(firstOperand) + parseFloat(secondOperand); break; case '-': result = parseFloat(firstOperand) - parseFloat(secondOperand); break; case '*': result = parseFloat(firstOperand) * parseFloat(secondOperand); break; case '/': result = parseFloat(firstOperand) / parseFloat(secondOperand); break; case '%': result = parseFloat(firstOperand) % parseFloat(secondOperand); break; } display.textContent = result; firstOperand = result; secondOperand = ''; currentOperator = null; } numbers.forEach(number => { number.addEventListener('click', () => { if (currentOperator === null) { firstOperand += number.value; display.textContent = firstOperand; } else { secondOperand += number.value; display.textContent = secondOperand; } }); }); operators.forEach(operator => { operator.addEventListener('click', () => { if (currentOperator !== null) { calculate(); } currentOperator = operator.value; }); }); equal.addEventListener('click', () => { calculate(); }); clear.addEventListener('click', () => { clearDisplay(); }); ``` 这个计算器非常简单,仅供参考。你可以在此基础上进行修改和扩展,例如添加更多的运算符和函数等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

濯一一

你的鼓励:我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值