Android开发——简单计算器实现

Android开发——简单计算器实现,第1张

概述计算器项目,要求实现加、减、乘、除、求倒数、求平方根等简单运算。真机调试结果如下图:布局文件:main_activity.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apkes/android"android:layout_width="match

计算器项目,要求实现加、减、乘、除、求倒数、求平方根等简单运算。

真机调试结果如下图:

布局文件:main_activity.xml
<?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开发——简单计算器实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1086647.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存