0
点赞
收藏
分享

微信扫一扫

A HTML两个小例子(计算器、复利计算器)

Gaaidou 2022-01-17 阅读 81
html前端

一 .复利计算器
效果图
复利计算器
遇到的问题:
1.保留小数点后几位,四舍五入时
使用Math.round(x)–返回最接近x的int型值。
例如:34.489 * 100 —> 返回最接近3448.9的int型 ----3449
2.使用innerHTML给标签内容加换行符时,注意格式
em.innerHTML = 要显示的内容 + “
”;

html代码如下

//流程:通过name属性得到三个标签对象ele[]-----getElementsByName("name")
//      通过ele[i].value得到本金、利息、总额三个值
//      统一需要输出的的内容格式
//      由于需要在页面上输出内容,在<body>内添加一个标签,设置好id值
//      通过标签的id值得到标签对象,通过innerHTML设置标签内容(标签内容会在html页面输出)-------getElementById("id")
//      注意,由于是在一个标签内输出,所以每次都是在追加标签内容,每次追加内容时都加上换行
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script>
		function save(x){//Math.round()返回最接近参数类型的int,可用来四舍五入
			return Math.round(x*1000)/1000;
		}
		function cul(){
			var ele = [];
			ele = document.getElementsByName("id1");
			var year = parseInt(ele[1].value);
			var mon = parseFloat(ele[0].value);
			var ra = (ele[2].value)/100;
			var sum = 0;
			var rat = 0;
			var em = document.getElementById("r1");
			em.innerHTML = "";
			for(var i = 1;i <=ele[1].value; i++){
			    em = document.getElementById("r1");
				rat = save(mon * ra);
				sum = mon + rat;
				em.innerHTML+="第"+i+"年,本金"+mon+",利息"+rat+",总收益"+sum+"<br>";
				mon = sum;	
			}
		}
		</script>
	</head>
	<body>
		<input type="text" placeholder="本金" name="id1" />
		<input type="text" placeholder="时长/年" name="id1"/>
		<input type="text" placeholder="年利率%" name="id1" />
		<input type="button" value="计算" onclick="cul();"/>
		<p id="r1"></p>
	</body>
</html>

二 .计算器

效果图
计算器
遇到的问题:
1.function 函数的参数不能是特殊字符,比如 " ."
2.clear是关键字
3.保留小数点后两位。由于是把字符转成了数字,会有一定误差,直接保留两位小数查看。

html代码如下:

//流程:
1.通过<tr><td></td></tr>设置单元格,以及colspan、rowspan合并单元格
2.设置加、减、乘、除函数,在对应的单元格标签里添加onclick="function()",点击单元格时,触发执行相应函数。在函数中通过追加getElementById("显示屏标签id名"),控制显示屏标签,将点击单元格内容追加到显示屏。    
例如:点击4,触发执行函数f1(4),由于显示屏标签的id为t1,通过em = document.getElementById("t1")得到显示屏标签对象,通过em.innerHTML += a追加显示屏标签内容。
这样就将点击的内容显示在显示屏上。    加减乘除小数点等号都是一样的过程
3.点击 = 后,触发sum函数,也是通过id得到显示屏内容,var em = document.getElementById("t1");
var num = em.innerHTML; 此时的num是一个字符数组,也就是运算式的中缀表达形式。
4.通过模拟栈进行中缀表达式求值。   其中stack()时进行栈操作,prio()是得到算符优先级,Fun()是进行
x ch y 的操作

<!DOCTYPE html>
//有一些数值类型转换啰嗦的地方。
<html>
	<head>
		<!-- 控制台debug
		f10继续下一行--
		 蓝色的按钮(或者f8会逐步执行,而且跳过其他js文件)11--= -->
		<meta charset="utf-8">
		<title></title>
		<style>
		.def{ 
		    color: black; 
			font-weight: 460;
			font-size: 22px;
			text-align: center;
		}
		.top{
			font-weight: 600;
			font-size: 24px;
			text-align: center;
		}
		</style>
		<script language="JavaScript">
		function save(x){
			return Math.round(x*100)/100;
		}
			function f1(a) {
				/* function参数不能是特殊字符 */
				// 别忘了要加""
				var em = document.getElementById("t1");
				// 设置标签元素的内容
				if (a == 10) {
					em.innerHTML += "."
				} else {
					em.innerHTML += a;
				}
			}

			function add() {
				var em = document.getElementById("t1");
				em.innerHTML += "+";
				// var v = em.innerHTML;
				// console.info(v);
			}

			function cut() {
				var em = document.getElementById("t1");
				em.innerHTML += "-";
			}

			function mul() {
				var em = document.getElementById("t1");
				em.innerHTML += "*";
			}

			function divi() {
				var em = document.getElementById("t1");
				em.innerHTML += "/";
			}

			function Clear() {
				/* clear()是关键字 */
				var em = document.getElementById("t1");
				em.innerHTML = "";
				// console.info(em.innerHTML);
			}

			function prio(x) { //运算符优先级
				if (x == '+' || x == '-') return 1;
				else if (x == '*' || x == '/') return 2;
				else return 0;
			}

			function sum() {
				var em = document.getElementById("t1");
				var num = em.innerHTML; /* 字符数组 */
				console.info(num);
				// 模拟栈来计算
				// console.info(stack(num));
				em.innerHTML = save(stack(num));
			}

			function Fun(x, y, ch) {
				if (ch == '+') return x + y;
				else if (ch == '-') return x - y;
				else if (ch == '*') return x * y;
				else return x / y;
			}

			function stack(num) { //模拟栈计算
				var k = 0;
				var j = 0;
				var t1 = 0;
				var t2 = 0;
				var s1 = new Array(20); //数栈
				var s2 = new Array(20); //符号栈
				// console.info(num);
				for (var i = 0; i <= num.length; i++) {
					console.info(i + ':' + num[i]);
					if (num[i] == '+' || num[i] == '-' || num[i] == '*' || num[i] == "/" || i == num.length) {

						var str = num.substring(j, i); //第一个操作数
						s1[++t1] = parseFloat(str); //操作数入栈
						var ch = num[i];
						if (i != num.length) {
							if (prio(num[i]) > prio(s2[t2])) { //符号入栈
								s2[++t2] = num[i];
								j = i + 1;
							} else { //取数字栈两个元素和符号栈顶元素进行计算
								while (prio(ch) <= prio(s2[t2])) {
									console.info(ch);
									// for (k = i + 1; k <= num.length; k++) {
									// 	if (num[k] == '+' || num[k] == '-' || num[k] == '*' || num[k] == "/" || k == num
									// 		.length) {
									// 		var str = num.substring(i + 1, k);
									// 		break;
									// 	}
									var y = s1[t1--];
									var x = s1[t1--];
									z = Fun(x,y,s2[t2--]);
									s1[++t1] = z;
									}
									//当 当前操作符可以入栈时退出循环
									s2[++t2] = ch;
									j = i+1;
								}
							}
						}

						console.info(t1 + ":" + s1[t1]);
						console.info(t2 + ":" + s2[t2]);
					}
					console.info("**************");
					while (t2 > 0) {
						y = s1[t1--];
						x = s1[t1--];
						var z = Fun(x, y, s2[t2--]);
						s1[++t1] = z;
					}
					console.info(s1[t1]);
					console.info(parseFloat(s1[t1]));
					return s1[t1];
				}
				// var str = num.substring(j,num.length);
				// s1[++t1] = parseFloat(str);
		</script>
	</head>
	<body>
		<table border="3" cellspacing="0" width="500px" height="500px" align="center">
			<tr>
				<td colspan="4" class="top">计算器</td>
			</tr>
			<tr>
				<td colspan="3" id="t1"></td>
				<td onclick="Clear();" class="def">C</td>
			</tr>
			<tr>
				<td onclick="f1(1);" class="def">1</td>
				<td onclick="f1(2);" class="def">2</td>
				<td onclick="f1(3);" class="def">3</td>
				<td onclick="add();" class="def"></td>
			</tr>
			<tr>
				<td onclick="f1(4);" class="def">4</td>
				<td onclick="f1(5);" class="def">5</td>
				<td onclick="f1(6);" class="def">6</td>
				<td onclick="cut();" class="def"></td>
			</tr>
			<tr>
				<td onclick="f1(7);" class="def">7</td>
				<td onclick="f1(8);" class="def">8</td>
				<td onclick="f1(9);" class="def">9</td>
				<td onclick="mul();" class="def"></td>
			</tr>
			<tr>
				<td onclick="f1(0);" class="def">0</td>
				<td onclick="f1(10)" class="def">.</td>
				<td onclick="sum()" class="def">=</td>
				<td onclick="divi();" class="def"></td>
			</tr>
		</table>
	</body>
</html>

举报

相关推荐

0 条评论