JavaScript实现简易计算器

完成样式

完成样式如图,计算器支持一般的加减乘除。

  • C:清屏
  • <-:退格
  • +/-:正负转换
  • H:历史记录(暂未完善)

在这里插入图片描述

实现函数和界面

此计算器中不包括历史记录,需要实现以下函数:

  • clickBtn():用于传递当前按键值的函数。
  • display():用于显示输入字符和显示结果的函数。
  • clearRes():用于清空结果和已输入字符的函数。
  • backSpace():用于实现退格操作的函数。
  • convert():用于实现反转正负的函数。

在此计算器中,每一个按键都是一个div,数字按键、小数点按键和加减乘除按键都是用的同一个函数clickBtn(),区别就是传递的参数不同,对应按键传递对应的参数。
使用一个输入框display来显示所得结果,界面排布使用flex布局进行设置。

HTML界面代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#all {
				width: 400px;
				height: 650px;
				border: solid 1px black;
				margin: auto;
				border-radius: 5px;
				margin-top: 30px;
			}
			
			#top {
				height: 120px;
				display: flex;
				justify-content: center;
				align-items: center;
			}
			
			#bottom {
				height: 530px;
				display: flex;
				flex-wrap: wrap;
				justify-content: center;
				align-items: flex-start;
			}
			
			#display {
				width: 370px;
				height: 75px;
				border: solid 1px black;
				border-radius:5px;
				font-size: 40px;
				text-align: right;
			}
			
			#btn {
				width: 80px;
				height: 80px;
				border: solid 1px black;
				flex-shrink: 0;
				border-radius:5px;
				font-size: 20px;
				margin: 7px;
				display: flex;
				justify-content: center;
				align-items: center;
				cursor: pointer;
			}
			
			#btn:hover {
				background-color: gainsboro;
			}
			
		</style>
	</head>
	<body>
		<div id="all">
			<div id="top">
				<input type="text" id="display">
			</div>
			<div id="bottom">
				<div id="btn" onclick="backSpace()">
					<-
				</div>
				<div id="btn" onclick="clearRes()">
					C
				</div>
				<div id="btn" onclick="convert()">
					+/-
				</div>
				<div id="btn" value="+" onclick="clickBtn('+')">
					+
				</div>
				
				
				<div id="btn" value="9" onclick="clickBtn('9')">
					9
				</div>
				<div id="btn" value="8" onclick="clickBtn('8')">
					8
				</div>
				<div id="btn" value="7" onclick="clickBtn('7')">
					7
				</div>
				<div id="btn" value="-" onclick="clickBtn('-')">
					-
				</div>
				
				
				<div id="btn" value="6" onclick="clickBtn('6')">
					6
				</div>
				<div id="btn" value="5" onclick="clickBtn('5')">
					5
				</div>
				<div id="btn" value="4" onclick="clickBtn('4')">
					4
				</div>
				<div id="btn" value="*" onclick="clickBtn('*')">
					x
				</div>
				
				
				<div id="btn" value="3" onclick="clickBtn('3')">
					3
				</div>
				<div id="btn" value="2" onclick="clickBtn('2')">
					2
				</div>
				<div id="btn" value="1" onclick="clickBtn('1')">
					1
				</div>
				<div id="btn" value="/" onclick="clickBtn('/')">
					÷
				</div>
				
				
				<div id="btn" value="0" onclick="clickBtn('0')">
					0
				</div>
				<div id="btn" value="." onclick="clickBtn('.')">
					.
				</div>
				<div id="btn">
					H
				</div>
				<div id="btn" onclick="display()">
					=
				</div>
			</div>
		</div> 
	</body>
</html>

全局变量

  • res:显示最终结果。
  • d:获取显示结果的输入框display对象。
  • res_x:显示用户输入的式子。
var res = "";
var d = document.getElementById("display");
var res_x = "";

计算结果

使用一个变量res和变量res_x来存储计算的式子和结果。使用者在点击不同按键时不断传递参数,res 不断与传进来的参数进行相加即字符串拼接并将结果输出在输入框display上,最后调用eval()方法计算最终结果把值输出在输入框display上。

res和res_x有何不同?他们两个都是用于计算结果的,可是在用户显示界面上,要想让乘号显示“ x ”而不是代码中的“ * ”(除号同理),所以需要res_x变量来用于存放该显示给用户的字符串,而真正用于计算结果的还是变量res。

代码如下:

function clickBtn(nums) {	
				res = res + nums;
				if(nums == '*') {
					nums = 'x';
				}
				if(nums == '/') {
					nums = '÷';
				}
				res_x = res_x + nums;
				d.value = res_x;
			}

显示结果

显示结果只需调用eval方法并将结果输出至输入框即可。代码如下:

function display() {
				d.value = eval(res);
				res = "";
				res_x = "";
			}

清屏

清屏功能只需要将res和res_x清空,再将结果输出至输入框。代码如下:

function clearRes() {
				 res = "";
				 res_x = "";
				 d.value = res_x;
			}
			

退格

退格功能只需使用substring方法,截取从下标0到res.length - 1的长度的字符串,然后覆盖原先的res。代码如下:

function backSpace() {
				res = res.substring(0,res.length - 1);
				res_x = res_x.substring(0,res_x.length - 1);
				d.value = res_x;
			}

正负反转

正负反转功能只需将结果乘以-1并输出至输入框。代码如下:

function convert() {
				res = res * (-1);
				d.value = res;
			}

完整代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#all {
				width: 400px;
				height: 650px;
				border: solid 1px black;
				margin: auto;
				border-radius: 5px;
				margin-top: 30px;
			}
			
			#top {
				height: 120px;
				display: flex;
				justify-content: center;
				align-items: center;
			}
			
			#bottom {
				height: 530px;
				display: flex;
				flex-wrap: wrap;
				justify-content: center;
				align-items: flex-start;
			}
			
			#display {
				width: 370px;
				height: 75px;
				border: solid 1px black;
				border-radius:5px;
				font-size: 40px;
				text-align: right;
			}
			
			#btn {
				width: 80px;
				height: 80px;
				border: solid 1px black;
				flex-shrink: 0;
				border-radius:5px;
				font-size: 20px;
				margin: 7px;
				display: flex;
				justify-content: center;
				align-items: center;
				cursor: pointer;
			}
			
			#btn:hover {
				background-color: gainsboro;
			}
			
		</style>
	</head>
	<body>
		<div id="all">
			<div id="top">
				<input type="text" id="display">
			</div>
			<div id="bottom">
				<div id="btn" onclick="backSpace()">
					<-
				</div>
				<div id="btn" onclick="clearRes()">
					C
				</div>
				<div id="btn" onclick="convert()">
					+/-
				</div>
				<div id="btn" value="+" onclick="clickBtn('+')">
					+
				</div>
				
				
				<div id="btn" value="9" onclick="clickBtn('9')">
					9
				</div>
				<div id="btn" value="8" onclick="clickBtn('8')">
					8
				</div>
				<div id="btn" value="7" onclick="clickBtn('7')">
					7
				</div>
				<div id="btn" value="-" onclick="clickBtn('-')">
					-
				</div>
				
				
				<div id="btn" value="6" onclick="clickBtn('6')">
					6
				</div>
				<div id="btn" value="5" onclick="clickBtn('5')">
					5
				</div>
				<div id="btn" value="4" onclick="clickBtn('4')">
					4
				</div>
				<div id="btn" value="*" onclick="clickBtn('*')">
					x
				</div>
				
				
				<div id="btn" value="3" onclick="clickBtn('3')">
					3
				</div>
				<div id="btn" value="2" onclick="clickBtn('2')">
					2
				</div>
				<div id="btn" value="1" onclick="clickBtn('1')">
					1
				</div>
				<div id="btn" value="/" onclick="clickBtn('/')">
					÷
				</div>
				
				
				<div id="btn" value="0" onclick="clickBtn('0')">
					0
				</div>
				<div id="btn" value="." onclick="clickBtn('.')">
					.
				</div>
				<div id="btn">
					H
				</div>
				<div id="btn" onclick="display()">
					=
				</div>
			</div>
		</div> 
		<script type="text/javascript">
			var res = "";
			var d = document.getElementById("display");
			var res_x = "";
			function clickBtn(nums) {	
				res = res + nums;
				if(nums == '*') {
					nums = 'x';
				}
				if(nums == '/') {
					nums = '÷';
				}
				res_x = res_x + nums;
				d.value = res_x;
			}
			
			function display() {
				d.value = eval(res);
				res = "";
				res_x = "";
			}
			
			function clearRes() {
				 res = "";
				 res_x = "";
				 d.value = res_x;
			}
			
			function backSpace() {
				res = res.substring(0,res.length - 1);
				res_x = res_x.substring(0,res_x.length - 1);
				d.value = res_x;
			}
			
			function convert() {
				res = res * (-1);
				d.value = res;
			}
		</script>
	</body>
</html>
### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值