计算器项目,要求实现加、减、乘、除、求倒数、求平方根等简单运算。
真机调试结果如下图:
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:background="#FFFFFF" androID:orIEntation="vertical" androID:padding="3dp"> <ScrollVIEw androID:layout_wIDth="match_parent" androID:layout_height="wrap_content"> <linearLayout androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:orIEntation="vertical"> <TextVIEw androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:gravity="center" androID:text="简单计算器" androID:textcolor="#000000" androID:textSize="20sp" /> <linearLayout androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:background="#ffffff" androID:orIEntation="vertical"> <TextVIEw androID:ID="@+ID/tv_result" androID:background="#4E4B4B" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:gravity="right|bottom" androID:lines="3" androID:maxlines="3" androID:scrollbars="vertical" androID:text="0" androID:textcolor="#FFFFFF" androID:textSize="35sp" /> </linearLayout> <GrIDLayout androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:columnCount="4" > <button androID:ID="@+ID/btn_cancel" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:shadowcolor="@color/purple_500" androID:text="CE" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_divIDe" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="÷" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_multiply" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="×" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_clear" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="C" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_seven" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="7" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_eight" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="8" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp" /> <button androID:ID="@+ID/btn_nine" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="9" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_plus" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="+" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_four" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="4" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_five" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="5" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_six" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="6" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_minus" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="-" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_one" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="1" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_two" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="2" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_three" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="3" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <Imagebutton androID:ID="@+ID/ib_sqrt" androID:layout_wIDth="90dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:scaleType="centerInsIDe" androID:src="@drawable/sqrt" androID:gravity="center" androID:layout_marginStart="4dp"/> <button androID:ID="@+ID/btn_reciprocal" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="1/x" androID:textcolor="@color/black" androID:textSize="28sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_zero" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="0" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_dot" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="." androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> <button androID:ID="@+ID/btn_equal" androID:layout_wIDth="85dp" androID:layout_height="70dp" androID:backgroundTint="@color/gray" androID:gravity="center" androID:text="=" androID:textcolor="@color/black" androID:textSize="30sp" androID:layout_marginStart="5dp"/> </GrIDLayout> </linearLayout> </ScrollVIEw></linearLayout>
## 活动页面: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(); //当前输入的字符串构造器,以运算符为界限 @OverrIDe protected 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 , // 数字7 R.ID.btn_eight , // 数字8 R.ID.btn_nine , // 数字9 R.ID.btn_plus , // “加法”按钮 R.ID.btn_four , // 数字4 R.ID.btn_five , // 数字5 R.ID.btn_six , // 数字6 R.ID.btn_minus , // “减法”按钮 R.ID.btn_one , // 数字1 R.ID.btn_two , // 数字2 R.ID.btn_three , // 数字3 R.ID.btn_reciprocal , // 求倒数按钮 R.ID.btn_zero , // 数字0 R.ID.btn_dot , // “小数点”按钮 R.ID.btn_equal , // “等号”按钮 R.ID.ib_sqrt // “开平方”按钮 }; for(int buttonID:buttonSeq) findVIEwByID(buttonID).setonClickListener(this); builder.append(0); }//符号分类 //数字 //四则运算符 //小数点 //根号,倒数,等号,直接出结果 //CE C @OverrIDe public 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{ //最后一位为运算数 return lastNum.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<Double> st = new Stack<>(); //原始数字栈 private static final Queue<Double> qu = new arraydeque<>(); //序列化数字队列, private static final Queue<String> queOp = new arraydeque<>(); //符号队列 private static final Queue<String> 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<size;i++)// System.out.println(queNum.poll()); //运算降级序列化 while (st.size() > 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开发——简单计算器实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)