Android Studio——简易计算器实现

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
第一次写博客嘿嘿嘿,很激动,记录一下Android开发课第一次试验——简易计算器。

P.S.刚接触Android Studio,纯探索式完成,代码以及内容有些粗糙QAQ

好啦,进入正题
----------------------------------布局activity_main.xml文件---------------------------
首先是布局activity_main.xml文件,先上代码:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <EditText
        android:id="@+id/msg"
        android:inputType="number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:autofillHints="" tools:targetApi="o">
    </EditText>
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/clc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/clc"></Button>

    <Button
        android:id="@+id/mod"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/per"></Button>

    <Button
        android:id="@+id/div"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/div"></Button>

    <Button
        android:id="@+id/mul"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/mul"></Button>
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/seven"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/seven"></Button>

    <Button
        android:id="@+id/eight"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/eight"></Button>

    <Button
        android:id="@+id/nine"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/nine"></Button>

    <Button
        android:id="@+id/sub"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/sub"></Button>
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/four"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/four"></Button>

    <Button
        android:id="@+id/five"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/five"></Button>

    <Button
        android:id="@+id/six"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/six"></Button>

    <Button
        android:id="@+id/add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/borderlessButtonStyle"
        android:text="@string/add"></Button>
</LinearLayout>

<LinearLayout android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="false">
    <LinearLayout android:orientation="vertical"
        android:layout_weight="3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <LinearLayout android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:id="@+id/one"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                style="?android:attr/borderlessButtonStyle"
                android:text="@string/one"></Button>

            <Button
                android:id="@+id/two"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                style="?android:attr/borderlessButtonStyle"
                android:text="@string/two"></Button>

            <Button
                android:id="@+id/three"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                style="?android:attr/borderlessButtonStyle"
                android:text="@string/three"></Button>
        </LinearLayout>
        <LinearLayout android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:id="@+id/zero"
                android:layout_width="0px"
                android:layout_height="wrap_content"
                android:layout_weight="2"
                style="?android:attr/borderlessButtonStyle"
                android:text="@string/zero"></Button>

            <Button
                android:id="@+id/dot"
                style="?android:attr/borderlessButtonStyle"
                android:layout_width="0px"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/dot"></Button>
        </LinearLayout>
    </LinearLayout>
    <LinearLayout android:orientation="vertical"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

        <Button
            android:id="@+id/equ"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            style="?android:attr/borderlessButtonStyle"
            android:text="@string/equ"></Button>
    </LinearLayout>
</LinearLayout>

-------------------------------布局效果图-------------------------------------------------
bu
---------------------------------数字键--------------------------------------------------
下面是MainActivity.java文件,主要分为四种键分开处理:C键(单个字符清除键),=键(EditText获取所有表达式字符处理键),数字键以及操作符键:
首选是数字键(0~9),其主要实现把本身的value(activity中设置)传给EditText显示出来,由于代码基本一致,就先放一个例子:

zero.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            msg.append(zero.getText().toString());
        }
    });

--------------------------------------操作符键--------------------------------------------
其次是操作符键(±*/.),其实现思路原本和数字键一样,但是不知道为什么append方法不适用于这些操作符,有大佬知道原因的话,烦请告知啊QAQ,于是:

add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.setText(msg.getText()+"+");
            }
        });

------------------------------------C(单个字符清除键)-----------------------
之后是C(单个字符清除键),其思路是假设EditText中有n个字符,先取出n-1个字符,再把第n位用“ ”代替,代码如下:

clc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int count=0;//记录覆盖的空格的个数,由于空格也计入字符串长度中,对下面的每次删去的个数有影响,所以记录并在下面减去
                String  s = msg.getText().toString();
                for(int i=0;i<s.length();i++)
                    if((s.substring(i,i+1)==""))
                        count++;
                    //考虑边界情况
                    if(count>=s.length()-1)
                        count = s.length()-1;
                s = (String) s.subSequence(0,s.length()-1-count);
                s = s.concat("");
                msg.setText(s);
            }
        });

----------------------=(表达式处理得出结果键)----------------------------
最后是=键(表达式处理得出结果键),其思路是把中缀表达式转化成后缀表达式,在通过后缀表达式计算,代码如下(代码十分粗糙,由于只会C,不大会java,很多方法都是先查的QAQ):

   equ.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int i = 0, j = 0, k = 0,count=1;//count 记录小数点后面有几位
            char b;
            String str=msg.getText().toString();
            double data[] = new double[100];//模拟数字栈
            String strr = "";//模拟操作符栈
            //入栈
            for (i = 0; i < str.length(); i++) {
                count=1;
                data[j]=0;
                //首先判断是都是数字,注意多位数的情况
                while ((i < str.length()) && (str.substring(i, i + 1).equals("0") || str.substring(i, i + 1).equals("1") || str.substring(i, i + 1).equals("2") || str.substring(i, i + 1).equals("3") || str.substring(i, i + 1).equals("4") || str.substring(i, i + 1).equals("5") || str.substring(i, i + 1).equals("6") || str.substring(i, i + 1).equals("7") || str.substring(i, i + 1).equals("8") || str.substring(i, i + 1).equals("9")) && (j < 100)) {
                    data[j] = data[j] * 10 + Integer.parseInt(str.substring(i, i + 1));
                    i++;
                }
                j++;
                //考虑操作数是小数的情况
                if((i < str.length()) &&(str.substring(i,i+1).equals(".")))
                {
                    i++;
                    j--;
                    while ((i < str.length()) && (str.substring(i, i + 1).equals("0") || str.substring(i, i + 1).equals("1") || str.substring(i, i + 1).equals("2") || str.substring(i, i + 1).equals("3") || str.substring(i, i + 1).equals("4") || str.substring(i, i + 1).equals("5") || str.substring(i, i + 1).equals("6") || str.substring(i, i + 1).equals("7") || str.substring(i, i + 1).equals("8") || str.substring(i, i + 1).equals("9")) && (j < 100)) {
                        data[j] = data[j] * 10 + Integer.parseInt(str.substring(i, i + 1));
                        i++;
                        count=count*10;
                    }
                    data[j]=data[j]*1.0/count;
                    j++;
                    System.out.println(data[j]);
                }
                if (i >= str.length()) break;
                if ((k == 0)||(i<str.length())&&(pric(str.charAt(i)) >= pric(strr.charAt(k - 1)))) {
                    strr = strr.concat(str.substring(i, i + 1));
                    //System.out.println("strr:"+strr);
                    k++;
                }
                else {
                        //还要考虑一直大于的情况,一直字符串出栈
                    while (k >= 1 && (pric(str.charAt(i)) < pric(strr.charAt(k - 1)))) {
                        j--;
                        k--;
                        b = strr.charAt(k);
                        if (b == '+') data[j - 1] = add(data[j - 1], data[j]);
                        else if (b == '-') data[j - 1] = sub(data[j - 1], data[j]);
                        else if (b == '*') data[j - 1] = mul(data[j - 1], data[j]);
                        else if (b == '/') data[j - 1] = div(data[j - 1], data[j]);
                    }
                    strr = (String) strr.subSequence(0, k);
                    strr = strr.concat(str.substring(i, i + 1));
                    k++;
                }
            }
            k--;
            //出栈
            while (k >= 0 && j >= 0) {
                j--;
                b = strr.charAt(k);
                System.out.println("b:" + b);
                if (b == '+') data[j - 1] = add(data[j - 1], data[j]);
                else if (b == '-') data[j - 1] = sub(data[j - 1], data[j]);
                else if (b == '*') data[j - 1] = mul(data[j - 1], data[j]);
                else if (b == '/') data[j - 1] = div(data[j - 1], data[j]);
                k--;
            }
            msg.setText(Double.toString(data[0]));
        }
        @org.jetbrains.annotations.Contract(pure = true)
        private  double  add(double a, double b)
        {
            return a+b;
        }
        @org.jetbrains.annotations.Contract(pure = true)
        private  double  sub(double a, double b)
        {
            return a-b;
        }
        @org.jetbrains.annotations.Contract(pure = true)
        private  double  mul(double a, double b)
        {
            return a*b;
        }
        @org.jetbrains.annotations.Contract(pure = true)
        private  double  div(double a, double b)
        {
            return a*1.0/b;
        }
        @org.jetbrains.annotations.Contract(pure = true)
        private  int  pric(char a)
        {
            if(a=='+')return 1;
            else if(a=='-')return 2;
            else if(a=='*')return 3;
            else if(a=='/')return 4;
            return 0;
        }
    });

-------------------------------------------------------------------------------------------------
然后放一下MainActivity.java所有代码:

package com.example.calculator;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {

    private EditText msg;
    private Button zero;
    private Button one;
    private Button two;
    private Button three;
    private Button four;
    private Button five;
    private Button six;
    private Button seven;
    private Button eight;
    private Button nine;
    private Button add;
    private Button sub;
    private Button mul;
    private Button div;
    private Button mod;
    private Button dot;
    private Button clc;
    private Button equ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.msg = findViewById(R.id.msg);
        this.zero = findViewById(R.id.zero);
        this.one = findViewById(R.id.one);
        this.two = findViewById(R.id.two);
        this.three = findViewById(R.id.three);
        this.four = findViewById(R.id.four);
        this.five = findViewById(R.id.five);
        this.six = findViewById(R.id.six);
        this.seven  = findViewById(R.id.seven);
        this.eight = findViewById(R.id.eight);
        this.nine = findViewById(R.id.nine);
        this.add = findViewById(R.id.add);
        this.sub = findViewById(R.id.sub);
        this.mul = findViewById(R.id.mul);
        this.div = findViewById(R.id.div);
        this.equ = findViewById(R.id.equ);
        this.clc = findViewById(R.id.clc);
        this.dot = findViewById(R.id.dot);

        zero.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(zero.getText().toString());
            }
        });
        one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(one.getText().toString());
            }
        });
        two.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(two.getText().toString());
            }
        });
        three.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(three.getText().toString());
            }
        });
        four.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(four.getText().toString());
            }
        });
        five.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(five.getText().toString());
            }
        });
        six.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(six.getText().toString());
            }
        });
        seven.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(seven.getText().toString());
            }
        });
        eight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(eight.getText().toString());
            }
        });
        nine.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.append(nine.getText().toString());
            }
        });
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.setText(msg.getText()+"+");
            }
        });
        sub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.setText(msg.getText()+"-");
            }
        });
        mul.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.setText(msg.getText()+"*");
            }
        });
        div.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.setText(msg.getText()+"/");
            }
        });
        dot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.setText(msg.getText()+".");
            }
        });
        clc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int count=0;//记录覆盖的空格的个数
                String  s = msg.getText().toString();
                for(int i=0;i<s.length();i++)
                    if((s.substring(i,i+1)==""))
                        count++;
                    if(count>=s.length()-1)
                        count = s.length()-1;
                s = (String) s.subSequence(0,s.length()-1-count);
                s = s.concat("");
                msg.setText(s);
            }
        });
        equ.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int i = 0, j = 0, k = 0,count=1;//count 记录小数点后面有几位
                char b;
                String str=msg.getText().toString();
                double data[] = new double[100];//模拟数字栈
                String strr = "";//模拟字符栈
                //入栈
                for (i = 0; i < str.length(); i++) {
                    count=1;
                    data[j]=0;
                    while ((i < str.length()) && (str.substring(i, i + 1).equals("0") || str.substring(i, i + 1).equals("1") || str.substring(i, i + 1).equals("2") || str.substring(i, i + 1).equals("3") || str.substring(i, i + 1).equals("4") || str.substring(i, i + 1).equals("5") || str.substring(i, i + 1).equals("6") || str.substring(i, i + 1).equals("7") || str.substring(i, i + 1).equals("8") || str.substring(i, i + 1).equals("9")) && (j < 100)) {
                        data[j] = data[j] * 10 + Integer.parseInt(str.substring(i, i + 1));
                        i++;
                    }//取数字保存在data中
                    j++;
                    if((i < str.length()) &&(str.substring(i,i+1).equals(".")))
                    {
                        i++;
                        j--;
                        while ((i < str.length()) && (str.substring(i, i + 1).equals("0") || str.substring(i, i + 1).equals("1") || str.substring(i, i + 1).equals("2") || str.substring(i, i + 1).equals("3") || str.substring(i, i + 1).equals("4") || str.substring(i, i + 1).equals("5") || str.substring(i, i + 1).equals("6") || str.substring(i, i + 1).equals("7") || str.substring(i, i + 1).equals("8") || str.substring(i, i + 1).equals("9")) && (j < 100)) {
                            data[j] = data[j] * 10 + Integer.parseInt(str.substring(i, i + 1));
                            i++;
                            count=count*10;
                        }//取数字保存在data中

                        data[j]=data[j]*1.0/count;
                        j++;
                        System.out.println(data[j]);
                    }
                    if (i >= str.length()) break;
                    if ((k == 0)||(i<str.length())&&(pric(str.charAt(i)) >= pric(strr.charAt(k - 1)))) {
                        strr = strr.concat(str.substring(i, i + 1));
                        k++;
                    }
                    else {//还要考虑一直大于的情况,一直字符串出栈

                        while (k >= 1 && (pric(str.charAt(i)) < pric(strr.charAt(k - 1)))) {
                            j--;
                            k--;
                            b = strr.charAt(k);
                            if (b == '+') data[j - 1] = add(data[j - 1], data[j]);
                            else if (b == '-') data[j - 1] = sub(data[j - 1], data[j]);
                            else if (b == '*') data[j - 1] = mul(data[j - 1], data[j]);
                            else if (b == '/') data[j - 1] = div(data[j - 1], data[j]);
                        }
                        strr = (String) strr.subSequence(0, k);
                        strr = strr.concat(str.substring(i, i + 1));
                        k++;
                    }
                }
                k--;
                //出栈
                while (k >= 0 && j >= 0) {
                    j--;
                    b = strr.charAt(k);
                    System.out.println("b:" + b);
                    if (b == '+') data[j - 1] = add(data[j - 1], data[j]);
                    else if (b == '-') data[j - 1] = sub(data[j - 1], data[j]);
                    else if (b == '*') data[j - 1] = mul(data[j - 1], data[j]);
                    else if (b == '/') data[j - 1] = div(data[j - 1], data[j]);
                    k--;
                }
                System.out.println(data[0]);
                msg.setText(Double.toString(data[0]));
            }
            @org.jetbrains.annotations.Contract(pure = true)
            private  double  add(double a, double b)
            {
                return a+b;
            }
            @org.jetbrains.annotations.Contract(pure = true)
            private  double  sub(double a, double b)
            {
                return a-b;
            }
            @org.jetbrains.annotations.Contract(pure = true)
            private  double  mul(double a, double b)
            {
                return a*b;
            }
            @org.jetbrains.annotations.Contract(pure = true)
            private  double  div(double a, double b)
            {
                return a*1.0/b;
            }
            @org.jetbrains.annotations.Contract(pure = true)
            private  int  pric(char a)
            {
                if(a=='+')return 1;
                else if(a=='-')return 2;
                else if(a=='*')return 3;
                else if(a=='/')return 4;
                return 0;
            }
        });
    }
}

然后说一下这个计算器的BUG:
1.中缀转后缀表达式的中间无法解决出现负数的情况,负数入栈还不知道怎么考虑
2.%虽然设计在上面也没有考虑
其他暂时还未发现什么bug,有发现的同学告知一下哈!

最后强调一下Android Studio的Debug真的很好用,具体见博客:
https://blog.csdn.net/csdn_aiyang/article/details/79483848

最后实现的图:
在这里插入图片描述在这里插入图片描述

好啦,结束啦!在这里插入代码片

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值