Android Studio实现整数加减乘除的计算器(20220907)

作者 by admin / 2022-09-10 / 暂无评论 / 2131 个足迹

题目
使用Android Studio写一个简易的计算器,只需要实现整数的基本运算即可。
界面上需要包含0-9和加减乘除,并有退格、清零功能。

所需知识:
Java:String的基本知识,数组(或者List)的运用
Android:绑定控件Button和TextView并使用,Button的按键监听,设置TextView的文本内容

实现计算器不同的功能,所编写的代码的难度也不同
较简单:实现两位数的加减乘除并输出结果
中等:计算一个计算式的加减乘除并保证先乘除后加减
较难:实现以上目标的同时,加入历史数据查看并添加错误判断,如果还想实现历史数据本地存储,请学习SharedPreferences

写完之后请将运行视频发到群里,需要你计算:
较简单:加减乘除案例各一个,如1+1、5-2、2*2、9/3
中等及较难:一次运算包含加减乘除中的其中三种运算,如55*22+66/22


题目本身不难,重点在于实现计算器的计算逻辑,如果只考虑整数的话很简单。我使用的思路是将一整个计算式(字符串格式)转为数字和符号的List,如[55,*,22,+,66,/,22],遵循先乘除后加减,先遍历寻找乘号和除号,每次寻找到便抽取该符号的前后数字进行相应计算,计算后将结果写至该符号前数字,删去符号和符号后数字。随后再遍历加号和减号,步骤同上。直到List长度为1时输出结果。
如计算1+2*3,List变化:[1,+,2,*,3] (计算2*3) -> [1,+,6,*,3] (写结果) -> [1,+,6] (删除) -> [7,+,6] (计算1+6) -> [7] (删除,至此可以输出结果)

我的核心计算函数:

    /**
     * 计算函数,传入一行待计算的字符串,输出其结果
     * @param str
     *      传入的字符串
     * @return
     */
    public static String CalRes(String str){
        int symbolNum=0;//统计计算符号个数
        str=str.replace("-","+-");//将减号变加号,实现负数运算
        List<String> cal=new ArrayList<>();
        // TODO 利用split分割出数字
        String[] num=str.split("[+*/]");
        // TODO 向symbol写入计算符号
        for(int i=0;i<str.length();i++){
            switch (str.charAt(i)){
                case '+':
                    cal.add("+");
                    symbolNum++;
                    break;
                case '*':
                    cal.add("*");
                    symbolNum++;
                    break;
                case '/':
                    cal.add("/");
                    symbolNum++;
                    break;
                case '-':
                    break;
                default:
                    if(i+1>=str.length()||str.charAt(i+1)=='+'||
                            str.charAt(i+1)=='*'|| str.charAt(i+1)=='/'){
                        cal.add(num[symbolNum]);
                    }
            }
        }
        if(num.length!=symbolNum+1){//如果数字个数不等于符号个数加一,说明有错误,不能计算
            return "ERROR!";
        }else {
            Log.d("Cal",cal.toString());
            // TODO 这里开始计算
            // TODO 计算乘法,检测到乘号后,将两个值相乘写入第一个值,并置空其他的index方便清除
            for (int i = 0; i < cal.size(); i++) {
                if (cal.get(i).equals("*")) {
                    int s1 = Integer.parseInt(cal.get(i - 1));
                    int s2 = Integer.parseInt(cal.get(i + 1));
                    s1 = s1 * s2;
                    cal.set(i - 1, String.valueOf(s1));
                    cal.set(i, "");
                    cal.set(i + 1, "");
                    cal.remove("");//清除空值,清除两次是因为生成了两个空值
                    cal.remove("");
                    i = 0;//计算完后返回到开头重新寻找指定符号
                }
            }
            Log.d("Cal", cal.toString());
            // TODO 计算除法
            for (int i = 0; i < cal.size(); i++) {
                if (cal.get(i).equals("/")) {
                    int s1 = Integer.parseInt(cal.get(i - 1));
                    int s2 = Integer.parseInt(cal.get(i + 1));
                    s1 = s1 / s2;
                    cal.set(i - 1, String.valueOf(s1));
                    cal.set(i, "");
                    cal.set(i + 1, "");
                    cal.remove("");//清除空值
                    cal.remove("");
                    i = 0;
                }
            }
            Log.d("Cal", cal.toString());
            // TODO 计算加法
            for (int i = 0; i < cal.size(); i++) {
                if (cal.get(i).equals("+")) {
                    int s1 = Integer.parseInt(cal.get(i - 1));
                    int s2 = Integer.parseInt(cal.get(i + 1));
                    s1 = s1 + s2;
                    cal.set(i - 1, String.valueOf(s1));
                    cal.set(i, "");
                    cal.set(i + 1, "");
                    cal.remove("");//清除空值
                    cal.remove("");
                    i = 0;
                }
            }
            Log.d("Cal", cal.toString());
            //不需要计算减法,是因为我将减号全部编程加号和符号,即 “-5” -> “+(-5)”

            //返回计算结果
            return cal.get(0);
        }
    }

如果要加入小数计算,这个逻辑会复杂一点,在计算时可以使用kahan求和算法、小数转整数解决、调用BigDecimal函数、自定义字符串计算函数等等来解决,当然求懒可以加一倍精度,改用decimal。

最后附上我写的安卓工程,包含详细注释。
Calculators.zip
PS:该工程中没有做被除数是0的错误判断,懒得改。

评论已关闭