js计算器运算部分的逻辑(附代码)

4 篇文章 0 订阅

运算部分逻辑的文字说明:

输入符号的计算逻辑:

	点击符号时调用函数operation(join, newlevel),join为当前运算符,newlevel为当前运算符的参数(权重);

	设置一个全部变量:level,初始为零,每次输入符号将当前符号的参数push进level的末尾;

		设置while条件:新输入的符号参数小于等于level的最后一位(即可以进行运算,权重不会对后面算式造成影响),就用函数(正则方式)过滤当前公式。过滤函数为parse()。

	

	关于过滤计算函数parse():

		因为上面已经说明,要计算的是权重更高的公式(乘除权重最高为6,其次加减权重5,其次左右移位运算权重4,最后按位与3、或2、非1运算),所以过滤为:

				(/^(.*\d[\+\-\*\/\%\^\&\|x\<\>])?([+-]?[0-9a-f\.]+)([\+\-\*\/\%\^\&\|x\<\>])([+-]?[0-9a-f\.]+)$/)

				$1:前面权重低不需要计算的公式返回到stack,$2为算式第一个数,$3为算式符号,$4为算式第二个数,再将$2,$3,$4传入函数cypher(left, join, right)作为参数。

					cypher()函数:

					判断$3的符号,并进行运算,将运算结果返回,同时level的最后一位slice掉。

		到这里,while的第一次循环已经结束,level的最后一位已经slice掉(进行一次运算),如果还满足while条件(连续的乘除运算),则继续进行上面的循环,直到循环结束。

	
	计算过程:

		level初始为0

		2+3    level:05

		2+3+   level:055(满足while条件,计算2+3)

		2+3*3  level:056(不满足while条件,不计算)

		2+3*3* level:0566(满足while条件,计算3*3)

		2+3*3+ level:0565 (满足while条件,计算2+3*3)

输入括号的逻辑:

	设置全局变量level,代表括号的层数(权重级别)

	每次点击括号时level++,同时截取第level个括号后(里)的值。

输入扩回的逻辑:

	每次点击扩回,计算当前level下的括号的值,将当前value的值写入display中,同时level--(减少一层括号)。

输入等号的逻辑:

	运算算式,如有括号未扩回,将括号中的值优先计算,算到level为0(没有括号),再将得出的等式用过滤函数计算。在operation()函数的控制下,stack的运算最多三层,还是用parse()将stack运算。

相关函数代码:

运算符:

	function operation(join, newlevel) {
		// if(document.calc.display.value==="0" && document.calc.notes.value.charAt(document.calc.notes.value.length-1)=="+"){return}
	 endNumber = true;
		var temp = stack.substr(stack.lastIndexOf("(") + 1) + document.calc.display.value
		while (newlevel != 0 && (newlevel <= (level.charAt(level.length - 1)))) {
   		 temp = parse(temp)
   		 level = level.slice(0, -1)
	  }
	 if (temp.match(/^(.*\d[\+\-\*\/\%\^\&\|x])?([+-]?[0-9a-f\.]+)$/))
    		document.calc.display.value = RegExp.$2
	 document.calc.notes.value += join;
		stack = stack.substr(0, stack.lastIndexOf("(") + 1) + temp + join
		document.calc.operator.value = " " + join + " "
		level = level + newlevel
	}

括号:

	function addbracket() {
		endNumber = true
	 document.calc.display.value = 0
		document.calc.notes.value += "("
		stack = stack + "("
		document.calc.operator.value = "   "
		level = level + 0

	 layer += 1
	}


括回:

	function disbracket() {
	   endNumber = true
	  var temp = stack.substr(stack.lastIndexOf("(") + 1) + document.calc.display.value
	  while ((level.charAt(level.length - 1)) > 0) {
 		   //验证表达式格式是否正确
	     temp = parse(temp)
 		   level = level.slice(0, -1)
	  }
		document.calc.display.value = temp
		document.calc.notes.value += ")"
		stack = stack.substr(0, stack.lastIndexOf("("))
		document.calc.operator.value = "   "
		level = level.slice(0, -1)
	 layer -= 1

}

等号(计算):

	function result() {
	 endNumber = true
	 while (layer > 0)
    		disbracket()
		temp = stack + document.calc.display.value
		while ((level.charAt(level.length - 1)) > 0) {
    
    		temp = parse(temp)
    		level = level.slice(0, -1)
	 }
		document.calc.display.value = temp
		document.calc.operator.value = ""
		document.calc.notes.value = ""
		stack = ""
		level = "0"
	}


过滤后的计算函数:

	function cypher(left, join, right) {
	 left = todec(left, carry)
		right = todec(right, carry)
		if (join == "+")
    		return (decto(parseFloat(left) + parseFloat(right), carry))
	 if (join == "-")
    		return (decto(left - right, carry))
	 if (join == "*")
	     return (decto(left * right, carry))
	 if (join == "/" && right != 0)
	     return (decto(left / right, carry))
	 if (join == "%")
	     return (decto(left % right, carry))
	 if (join == "&")
	     return (decto(left & right, carry))
	  if (join == "|")
	      return (decto(left | right, carry))
		if (join == "^")
		    return (decto(Math.pow(left, right), carry))
	 if (join == "x")
 		   return (decto(left ^ right, carry))
		if (join == "<")
		    return (decto(left << right, carry))
	 if (join == ">")
		    return (decto(left >> right, carry))
	  alert("除数不能为零")
	  return (left)
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Android Studio计算器的连续运算,需要涉及到以下几个步骤: 1. 定义一个字符串变量存储表达式,用于保存用户输入的数字和运算符。 2. 通过按钮监听器,获取用户输入的数字和运算符,并将其添加到表达式。 3. 当用户点击等号时,将表达式传递给计算器引擎,进行计算,并显示结果。 4. 如果用户继续输入运算符,将结果作为新的操作数,并将运算符添加到表达式。 以下是一个简单的实现示例: ``` public class CalculatorActivity extends AppCompatActivity { private TextView mResultTextView; private String mExpression = ""; // 存储表达式 private boolean mIsResultShown = false; // 记录是否已经显示了结果 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_calculator); mResultTextView = findViewById(R.id.result_text_view); // 设置按钮监听器 findViewById(R.id.button_0).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onNumberClicked("0"); } }); // 省略其他数字按钮的设置 findViewById(R.id.button_add).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onOperatorClicked("+"); } }); // 省略其他运算符按钮的设置 findViewById(R.id.button_equal).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onEqualClicked(); } }); } // 处理数字按钮点击事件 private void onNumberClicked(String number) { if (mIsResultShown) { mExpression = ""; mIsResultShown = false; } mExpression += number; mResultTextView.setText(mExpression); } // 处理运算符按钮点击事件 private void onOperatorClicked(String operator) { if (mIsResultShown) { mIsResultShown = false; } mExpression += operator; mResultTextView.setText(mExpression); } // 处理等号按钮点击事件 private void onEqualClicked() { if (mExpression.isEmpty()) { return; } double result = evaluateExpression(mExpression); // 调用计算器引擎进行计算 mExpression = Double.toString(result); // 将结果转化为字符串作为下一次运算的操作数 mResultTextView.setText(mExpression); mIsResultShown = true; } // 计算表达式的值 private double evaluateExpression(String expression) { // 省略计算器引擎的具体实现,可以使用JavaScript引擎或手写算法等方式进行实现 } // 相关问题: // 1. 如何处理用户输入错误的情况? // 2. 是否支持括号和优先级? // 3. 如何进行界面美化和性能优化? } ``` 注意,这只是一个简单的示例代码,实际上需要根据具体的需求进行适当修改和扩展。例如,可以添加处理用户输入错误的逻辑、支持括号和优先级、进行界面美化和性能优化等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值