Android开发简单计算器实现代码

计算器项目,要求实现加、减、乘、除、求倒数、求平方根等简单运算。
真机调试结果如下图:
Android开发简单计算器实现代码
文章图片

布局文件:main_activity.xml


活动页面:MainActivity.java
package com.example.calculator; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.example.calculator.cal.CoreAlgorithm; public class MainActivity extends AppCompatActivity implements View.OnClickListener{private TextView tv_result; // 声明一个文本视图对象private double result =0; // 当前的计算结果private String showText = ""; // 显示的文本内容private final StringBuilder builder=new StringBuilder(); //存储运算式子的字符串构造器@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_result = findViewById(R.id.tv_result); int[] buttonSeq={R.id.btn_cancel, // “取消”按钮R.id.btn_divide,// “除法”按钮R.id.btn_multiply , // “乘法”按钮R.id.btn_clear , // “清除”按钮R.id.btn_seven , // 数字7R.id.btn_eight , // 数字8R.id.btn_nine , // 数字9R.id.btn_plus , // “加法”按钮R.id.btn_four , // 数字4R.id.btn_five , // 数字5R.id.btn_six , // 数字6R.id.btn_minus , // “减法”按钮R.id.btn_one , // 数字1R.id.btn_two , // 数字2R.id.btn_three , // 数字3R.id.btn_reciprocal , // 求倒数按钮R.id.btn_zero , // 数字0R.id.btn_dot , // “小数点”按钮R.id.btn_equal , // “等号”按钮R.id.ib_sqrt // “开平方”按钮}; for(int buttonId:buttonSeq)findViewById(buttonId).setOnClickListener(this); builder.append(0); }//符号分类//数字//四则运算符//小数点//根号,倒数,等号,直接出结果//CE C@Overridepublic void onClick(View v) {int id=v.getId(); String inputText=""; //if(result!=0){//如果结果不为0,则按照结果进行运算//clear(); //builder.append(result); //}//若不为根号,因为根号按钮无法取值if(id!=R.id.ib_sqrt) {inputText = ((TextView) v).getText().toString(); //判断是否为数字、小数点以及四则运算符if (inputText.matches("\\d|\\.")) {//输入是否为数字或点号resultCheck(); if(builder.toString().equals("0")){builder.deleteCharAt(builder.length()-1); }builder.append(inputText); if(verifyExp(builder.toString())){refreshText(builder.toString()); //表达式正确刷新}else{builder.deleteCharAt(builder.length() - 1); //表达式不正确删除最后一位字符}} else if (inputText.matches("\\+|-|×|÷")) {//输入为四则运算符resultCheck(); builder.append(inputText); if(verifyExp(builder.toString())){refreshText(builder.toString()); }else{//更替运算符操作builder.deleteCharAt(builder.length() - 1); builder.deleteCharAt(builder.length() - 1); builder.append(inputText); refreshText(builder.toString()); }}else {//点击了CE C 1/X =switch (inputText) {case "CE":resultCheck(); //有字符才能删除if (builder.length() > 0) {builder.deleteCharAt(builder.length() - 1); refreshText(builder.toString()); } else {Toast.makeText(this, "没有数字可删了", Toast.LENGTH_SHORT).show(); }break; case "C":refreshText(""); result=0.0; builder.delete(0, builder.length()); //builder清空builder.append(0); break; case "1/x":resultCheck(); result=1/(CoreAlgorithm.calExp(builder.toString())); refreshText("1/("+builder.toString()+")=\n"+result); break; case "=":resultCheck(); if(result==0.0) {result = CoreAlgorithm.calExp(builder.toString()); //builder.append("="); //容易出错 ,按等号会把这个式子进行运算refreshText(builder.toString() + "=\n" + result); }break; default:Toast.makeText(this, "error", Toast.LENGTH_SHORT).show(); }}}else{// 点击了开根号,由于算法不支持有运算符在前,目前已经支持resultCheck(); //经过一次检查结果被清零,结果存于builder中result = Math.sqrt(CoreAlgorithm.calExp(builder.toString())); refreshText("√(" + builder.toString() + ")=\n" + result); }}//检查整个表达式public boolean verifyExp(String exp){//验证整个表达式是否合法String lastNum=""; String[] sp=exp.split("\\+|-|×|÷"); //将操作数分割出来char lastChar=exp.charAt(exp.length()-1); //获得最后一个字符lastNum=sp[sp.length-1]; //取得最后一位操作数if(String.valueOf(lastChar).matches("\\+|-|×|÷"))//如果当前符号为四则运算符{lastNum=""; return exp.matches(".*(\\d[+-×÷])|.*(\\.[+-×÷])"); //验证最后的运算符是否符合只有一个原则}else{//最后一位为运算数returnlastNum.matches("^[-]?\\d*\\.?\\d*"); //验证最后一位运算数是否合法}}// 刷新文本显示private void refreshText(String text) {showText = text; tv_result.setText(showText); }// 清空并初始化private void clear() {builder.delete(0, builder.length()); showText=""; }//基本每个出结果的按钮都要执行一次这个函数public void resultCheck(){//运算结果检查,有结果用结果,结果不为数字进行处理if(result!=0){//如果结果不为0,则按照结果进行运算String res=String.valueOf(result); if(res.matches("^[-]?\\d*\\.?\\d*")){//若为浮点数字clear(); builder.append(result); result=0; //结果不清零,检查的时候就会一直重复放入结果}else{//若结果为字母,分母为0会返回Infinity,以及负数开方clear(); builder.append("0"); result=0; }}if(builder.length()==0){builder.append(0); }}}

核心算法:CoreAlgorithm.java
package com.example.calculator.cal; import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CoreAlgorithm {private static final Stack st = new Stack<>(); //原始数字栈private static final Queue qu = new ArrayDeque<>(); //序列化数字队列,private static final Queue queOp = new ArrayDeque<>(); //符号队列private static final Queue newQueOp = new ArrayDeque<>(); public static double calExp(String exp) {//String str="1+3*2-8/2+6"; //String str="1+3*2/1"; //本算法似乎不支持符号在前面,目前算法已经改进//处理运算符在式子最后if (exp.matches(".*[\\+\\-×÷]")) {exp = exp.substring(0, exp.length() - 1); }String[] sp; //存放分割数组//运算符在式子最前面if (exp.matches("[\\+\\-×÷].*")) {String fistElem=exp.substring(0,1); //截取首个字符exp=exp.substring(1); //舍去首个字符//分割字符,提取数字sp = exp.split("\\+|-|×|÷"); if(fistElem.equals("-")){//首个字符为负号sp[0]="-"+sp[0]; //添加负号}}else{//没有符号在前sp = exp.split("\\+|-|×|÷"); }//之前直接分割字符会导致,数组第一位为空,导致程序无法运行for (int i = sp.length - 1; i >= 0; i--) {if (sp[i].equals(".")) {st.push(0.0); //替换点号} else {st.push(Double.parseDouble(sp[i])); }}//寻找匹配字符串Pattern p = Pattern.compile("\\+|-|×|÷"); Matcher m = p.matcher(exp); while (m.find()) {queOp.add(m.group()); }//for(int i=sp.length-1; i>=0; i--){//System.out.println(st.pop()); //}//int size=queNum.size(); //for(int i=0; i 0) {String currOp; if (queOp.size() > 0) {currOp = queOp.poll(); } else {currOp = "0"; }switch (currOp) {case "×":st.push(st.pop() * st.pop()); break; case "÷":st.push(st.pop() / st.pop()); break; case "+":qu.add(st.pop()); newQueOp.add("+"); break; case "-":qu.add(st.pop()); newQueOp.add("-"); break; default:qu.add(st.pop()); }}//正常运算if (qu.size() > 0) {double res = qu.poll(); while (qu.size() > 0) {String op = ""; if (newQueOp.size() > 0) {op = newQueOp.poll(); } else {op = "none"; }switch (op) {case "+":res += qu.poll(); break; case "-":res -= qu.poll(); break; default:System.out.println("none"); }}return res; }return 0.0; }}

【Android开发简单计算器实现代码】到此这篇关于Android开发简单计算器实现的文章就介绍到这了,更多相关Android开发计算器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读