Android计算器

idea编写的安卓Android项目,计算器 idea编写的安卓Android项目,计算器简介项目展示代码页面 简介 用idea编写的安卓项目 项目展示 代码页面 activity_calculator.xml <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android. 阅读详情

GitHub地址

先上图



这里写图片描述
这里写图片描述

UI

采用百分比布局,在app\build.gradle的dependencies里面加上

implementation 'com.android.support:percent:28.0.0-alpha3'

后面对应SDK版本,我的是28.0.0-alpha3
两个TextView用于显示我的APP名称和用户输入的计算式
其他均为按钮

<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FAFFF0">


    <TextView
        android:id="@+id/app_name"
        android:layout_width="wrap_content"
        android:layout_height="58dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:text="CalculatorByLPD"
        android:textColor="#292421"
        android:textSize="35sp" />

    <TextView
        android:id="@+id/view_input"
        android:layout_width="match_parent"
        android:layout_height="117dp"
        android:layout_above="@+id/button_AC"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginBottom="-3dp"
        android:layout_marginLeft="0dp"
        android:layout_marginStart="0dp"
        android:layout_marginTop="98dp"
        android:gravity="left|top"
        android:text=""
        android:textColor="#292421"
        android:textSize="30sp" />


    <Button
        android:id="@+id/button_0"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:background="#BDFCC9"
        android:text="0"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_1"
        android:layout_above="@+id/button_0"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:background="#BDFCC9"
        android:text="1"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_2"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_above="@+id/button_0"
        android:layout_toEndOf="@+id/button_0"
        android:layout_toRightOf="@+id/button_0"
        android:background="#BDFCC9"
        android:text="2"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_3"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_above="@+id/button_0"
        android:layout_toEndOf="@+id/button_2"
        android:layout_toRightOf="@+id/button_2"
        android:background="#BDFCC9"
        android:text="3"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_4"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_above="@+id/button_1"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:background="#BDFCC9"
        android:text="4"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_5"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_above="@+id/button_1"
        android:layout_toEndOf="@+id/button_0"
        android:layout_toRightOf="@+id/button_0"
        android:background="#BDFCC9"
        android:text="5"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_6"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_above="@+id/button_1"
        android:layout_toEndOf="@+id/button_2"
        android:layout_toRightOf="@+id/button_2"
        android:background="#BDFCC9"
        android:text="6"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_7"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_above="@+id/button_4"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:background="#BDFCC9"
        android:text="7"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_8"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_above="@+id/button_4"
        android:layout_toEndOf="@+id/button_0"
        android:layout_toRightOf="@+id/button_0"
        android:background="#BDFCC9"
        android:text="8"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_9"
        android:layout_width="225dp"
        android:layout_height="121dp"
        android:layout_above="@+id/button_4"
        android:layout_toEndOf="@+id/button_2"
        android:layout_toRightOf="@+id/button_2"
        android:background="#BDFCC9"
        android:text="9"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_point"
        android:layout_alignParentBottom="true"
        android:layout_toEndOf="@+id/button_0"
        android:layout_toRightOf="@+id/button_0"
        android:background="#BDFCC9"
        android:text="."
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_divi"
        android:layout_above="@+id/button_7"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:background="#FFFFCD"
        android:text="/"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_end"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:background="#FFFFCD"
        android:text="="
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_mul"
        android:layout_above="@+id/button_4"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:background="#FFFFCD"
        android:text="×"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_sub"
        android:layout_above="@+id/button_1"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:background="#FFFFCD"
        android:text="-"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_add"
        android:layout_above="@+id/button_0"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:background="#FFFFCD"
        android:text="+"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_AC"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/button_7"
        android:background="#FFFFCD"
        android:text="AC"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_del"
        android:layout_alignParentBottom="true"
        android:layout_toEndOf="@+id/button_2"
        android:layout_toRightOf="@+id/button_2"
        android:background="#FFFFCD"
        android:text="DEL"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_brac"
        android:layout_above="@+id/button_8"
        android:layout_toEndOf="@+id/button_0"
        android:layout_toRightOf="@+id/button_0"
        android:background="#FFFFCD"
        android:text="("
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_brac2"
        android:layout_above="@+id/button_9"
        android:layout_toEndOf="@+id/button_2"
        android:layout_toRightOf="@+id/button_2"
        android:background="#FFFFCD"
        android:text=")"
        android:textSize="40sp"
        app:layout_heightPercent="12.5%"
        app:layout_widthPercent="25%" />

    <Button
        android:id="@+id/button_exit"
        android:layout_width="34dp"
        android:layout_height="35dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="12dp"
        android:layout_marginStart="12dp"
        android:layout_marginTop="12dp"
        android:background="@drawable/exit" />


</android.support.percent.PercentRelativeLayout>

按钮点击事件的处理或逻辑判断

这个我先写完了基本的功能,就是保证正确的输入,然后会得到正确的结果,最后一步一步的测问题,改代码,禁止用户一些错误的输入,和处理一些能出现问题的操作。方法的调用和输入的判断我已经在代码里面注释好了,还有什么疑问还可以可以评论留言

package com.example.calculator;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView view_input;
    private StringBuilder sb = new StringBuilder(); //把所有的输入放在这个StringBuilder里面
    private int FLAG = 0;   //这个是用于二次计算的标记
    private int FLAG2 = 0;  //这个是检测括号输入的标记 输入一个左括号+1 输入一个右括号-1
                            //要注意的就是要是有删除、清空、计算结果时要改变这个的值

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {    //隐藏自带标题
            actionBar.hide();
        }

        view_input = (TextView) findViewById(R.id.view_input);
        Button button_1 = (Button) findViewById(R.id.button_1);
        Button button_0 = (Button) findViewById(R.id.button_0);
        Button button_2 = (Button) findViewById(R.id.button_2);
        Button button_3 = (Button) findViewById(R.id.button_3);
        Button button_4 = (Button) findViewById(R.id.button_4);
        Button button_5 = (Button) findViewById(R.id.button_5);
        Button button_6 = (Button) findViewById(R.id.button_6);
        Button button_7 = (Button) findViewById(R.id.button_7);
        Button button_8 = (Button) findViewById(R.id.button_8);
        Button button_9 = (Button) findViewById(R.id.button_9);
        Button button_point = (Button) findViewById(R.id.button_point);
        Button button_divi = (Button) findViewById(R.id.button_divi);
        Button button_end = (Button) findViewById(R.id.button_end);
        Button button_mul = (Button) findViewById(R.id.button_mul);
        Button button_brac = (Button) findViewById(R.id.button_brac);
        Button button_brac2 = (Button) findViewById(R.id.button_brac2);
        Button button_exit = (Button) findViewById(R.id.button_exit);
        Button button_add = (Button) findViewById(R.id.button_add);
        Button button_sub = (Button) findViewById(R.id.button_sub);
        Button button_del = (Button) findViewById(R.id.button_del);
        Button button_AC = (Button) findViewById(R.id.button_AC);

        button_0.setOnClickListener(this);
        button_1.setOnClickListener(this);
        button_2.setOnClickListener(this);
        button_3.setOnClickListener(this);
        button_4.setOnClickListener(this);
        button_5.setOnClickListener(this);
        button_6.setOnClickListener(this);
        button_7.setOnClickListener(this);
        button_8.setOnClickListener(this);
        button_9.setOnClickListener(this);
        button_point.setOnClickListener(this);
        button_divi.setOnClickListener(this);
        button_end.setOnClickListener(this);
        button_mul.setOnClickListener(this);
        button_brac.setOnClickListener(this);
        button_brac2.setOnClickListener(this);
        button_exit.setOnClickListener(this);
        button_add.setOnClickListener(this);
        button_sub.setOnClickListener(this);
        button_del.setOnClickListener(this);
        button_AC.setOnClickListener(this);
        view_input.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button_0:
                if (!inScope()) {   //检测输入字符串的总长度,下同
                    Toast.makeText(getBaseContext(),
                            "Out of scope", Toast.LENGTH_SHORT).show(); // 提示长度超限,下同
                    break;
                }
                if (haveBrac()) break;// 数字不能加在右括号后面,下同
                changeFlag();       //更改二次计算用的标记,下同
                if (sb.length() == 0) {
                    view_input.setText("0"); //这个是用于处理不断输入0的时候屏幕上会一直显示0的问题
                } else {
                    sb.append("0"); //如果长度不为零那么就显示0 并加在sb后面
                    view_input.setText(sb.toString());
                }
                break;
            case R.id.button_1:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("1");
                view_input.setText(sb.toString());
                break;
            case R.id.button_2:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("2");
                view_input.setText(sb.toString());
                break;
            case R.id.button_3:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("3");
                view_input.setText(sb.toString());
                break;
            case R.id.button_4:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("4");
                view_input.setText(sb.toString());
                break;
            case R.id.button_5:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("5");
                view_input.setText(sb.toString());
                break;
            case R.id.button_6:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("6");
                view_input.setText(sb.toString());
                break;
            case R.id.button_7:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("7");
                view_input.setText(sb.toString());
                break;
            case R.id.button_8:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("8");
                view_input.setText(sb.toString());
                break;
            case R.id.button_9:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (haveBrac()) break;
                changeFlag();
                sb.append("9");
                view_input.setText(sb.toString());
                break;
            case R.id.button_add:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                changeFlagByMethod();   //计算完一次后 会改变FLAG的值
                                        // 当再次输入运算符号时会改变这个标记的值
                                        //效果就是计算玩一次后  若输入运算符号会直接在上次的结果上进行运算  若输入数字表示重新进行其他的运算
                                          // 其他运算符调用这个函数的作用相同下同
                if (sb.length() == 0)   //等于零不会显示加号
                    break;
                String s = sb.substring(sb.length() - 1, sb.length());
                if (s.equals("("))      //加号不能加在左括号后面
                    break;
                if (couldAdd(s)) {      // 还是用于能否输入这个加号的
                                        // 如果不能那就替换原本的运算符号为+
                                        //  其他运算符调用这个函数的作用相同下同
                                        // 具体实现看下面的函数
                    sb.delete(sb.length() - 1, sb.length());
                }
                sb.append("+");
                view_input.setText(sb.toString());
                break;
            case R.id.button_sub:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                changeFlagByMethod();
                if (sb.length() == 0)
                    break;
                s = sb.substring(sb.length() - 1, sb.length());
                if (s.equals("("))
                    break;
                if (couldAdd(s)) {
                    sb.delete(sb.length() - 1, sb.length());
                }
                sb.append("-");
                view_input.setText(sb.toString());
                break;
            case R.id.button_mul:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                changeFlagByMethod();
                if (sb.length() == 0)
                    break;
                s = sb.substring(sb.length() - 1, sb.length());
                if (s.equals("("))
                    break;
                if (couldAdd(s)) {
                    sb.delete(sb.length() - 1, sb.length());
                }
                sb.append("×");
                view_input.setText(sb.toString());
                break;
            case R.id.button_divi:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                changeFlagByMethod();
                if (sb.length() == 0)
                    break;
                s = sb.substring(sb.length() - 1, sb.length());
                if (s.equals("("))
                    break;
                if (couldAdd(s)) {
                    sb.delete(sb.length() - 1, sb.length());
                }
                sb.append("/");
                view_input.setText(sb.toString());
                break;
            case R.id.button_point:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (sb.length() == 0) {     //如果这个长度为0 而且还直接输入了. 那么就直接变为0.
                    sb.append("0.");
                    view_input.setText(sb.toString());
                    break;
                }

                s = sb.substring(sb.length() - 1, sb.length());
                if (s.equals("("))
                    break;
                if (s.equals(")"))
                    break;
                if (couldAdd(s)) {      //还是检测能不能添加这个 小数点
                    sb.delete(sb.length() - 1, sb.length());
                }
                if (havePoint())        //这个是检测如果输入了一个小数 那么就不能再输入小数点了
                    break;
                sb.append(".");
                view_input.setText(sb.toString());
                break;
            case R.id.button_brac:
                if (!inScope()) {
                    Toast.makeText(getBaseContext(), "Out of scope", Toast.LENGTH_SHORT).show();
                    break;
                }
                if (bracAddLeft()) {    //这个也是检测能不能把左括号加在这里
                    sb.append("(");
                    view_input.setText(sb.toString());
                    FLAG2++;        //如果加了  那么就给这个标记+1  表示目前有一个左括号没有被匹配
                }
                break;
            case R.id.button_brac2:
                if (FLAG2 == 0) break;  // 如果是0 说明没有未匹配的左括号
                if (bracAddRight() && bracAddFromLeft()) {  //检测能否加这个括号
                    sb.append(")");
                    view_input.setText(sb.toString());
                    FLAG2--;        //加了以后就会减少一个未被匹配的左括号数
                }
                break;
            case R.id.button_end:
                try {//抛一个最大的异常 直接提示Error
                    dealBrac();//这个是比较重要的一个方法,作用是补全没有输上的')' 
                    //比如输入((9+1 他会根据FLAG2的值进行补输 变成((9+1))
                    FLAG2 = 0;  //计算完后应该恢复这个检测括号的标记
                    FLAG = 1;   //这个这个是用于下次计算的标记
                    String end = InfixInToDuffix.dealEquation(InfixInToDuffix.toSuffix(sb));
                                //这个是将中缀表达式转为后缀表达式 并求值
                    sb.delete(0, sb.length()); //清空字符串缓冲
                    sb.append(end); //把结果添加到字符串缓冲
                    view_input.setText(end);
                } catch (Exception e) {
                    sb.delete(0, sb.length());
                    sb.append("Error");
                    view_input.setText(sb.toString());
                    sb.delete(0, sb.length());
                }
                break;
            case R.id.button_AC:
                sb.delete(0, sb.length());
                view_input.setText(sb.toString());
                FLAG2 = 0;  //这里注意 不仅要清空字符串缓冲区
                           // 还要改变用于检测括号匹配的标记
                break;
            case R.id.button_del:
                if (sb.length() >= 1) {
                    char c = sb.charAt(sb.length() - 1);
                    if (c == ')') FLAG2++;  //这里要注意 如果遇到删除左右括号要改变标记的值
                    if (c == '(') FLAG2--;
                    sb.delete(sb.length() - 1, sb.length());
                    view_input.setText(sb.toString());
                }
                break;
            case R.id.button_exit:
                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
                dialog.setTitle("Dialog");  // 弹出一个会话框 询问知否退出
                dialog.setMessage("Are you sure to exit?");
                dialog.setCancelable(true);
                dialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        finish();
                    }
                });
                dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    }
                });
                dialog.show();
                break;
            default:
                break;

        }
    }

    // 下面的函数在上面的调用时 已经介绍过作用
    // 不过多解释了 都是一些用于判断的函数
    private void dealBrac() {
        if (FLAG2 == 0) {
            return;
        }
        for (int i = 0; i < FLAG2; i++) {
            sb.append(")");
        }
    }

    private boolean haveBrac() {
        char[] c = sb.toString().toCharArray();
        boolean b = false;
        if (c.length == 0)
            return b;
        if (c[c.length - 1] == ')')
            b = true;
        return b;
    }

    private boolean inScope() {
        boolean b = true;
        if (sb.length() == 90)
            b = false;
        return b;
    }

    private boolean havePoint() {
        boolean b = false;
        int i;
        char[] c = sb.toString().toCharArray();
        for (i = c.length - 1; i >= 0 && (c[i] >= '0' && c[i] <= '9'); i--) {
        }
        if (i != -1) {
            if (c[i] == '.')
                b = true;
        }
        return b;
    }

    private void changeFlag() {
        if (FLAG == 1) {
            sb.delete(0, sb.length());
            FLAG = 0;
        }
    }

    private void changeFlagByMethod() {
        if (FLAG == 1) {
            FLAG = 0;
        }
    }

    private boolean couldAdd(String s) {
        boolean b = false;
        if (s.equals("+")) b = true;
        if (s.equals("-")) b = true;
        if (s.equals("×")) b = true;
        if (s.equals("/")) b = true;
        if (s.equals(".")) b = true;
        if (s.equals("(")) b = true;
        return b;
    }

    private boolean bracAddFromLeft() {
        int i = sb.length();
        boolean b = false;
        if (sb.indexOf("(") >= 0) {
            b = true;
        }
        return b;
    }

    private boolean bracAddLeft() {
        boolean b = false;
        if (sb.length() == 0) {
            b = true;
            return b;
        }
        String s = sb.substring(sb.length() - 1, sb.length());
        if (s.equals("+")) b = true;
        if (s.equals("-")) b = true;
        if (s.equals("×")) b = true;
        if (s.equals("/")) b = true;
        if (s.equals("(")) b = true;
        return b;
    }

    private boolean bracAddRight() {
        Boolean b = true;
        if (sb.length() == 0) {
            b = false;
            return b;
        }
        String s = sb.substring(sb.length() - 1, sb.length());
        if (s.equals("+")) b = false;
        if (s.equals("-")) b = false;
        if (s.equals("×")) b = false;
        if (s.equals("/")) b = false;
        if (s.equals(".")) b = false;
        if (s.equals("(")) b = false;
        return b;
    }
}

计算

通过上面的逻辑处理,最终得到的sb就是一个正确的中缀表达式,计算的思路就是将中缀表达式转换成后缀表达式,然后进行计算得到结果,具体算法我不过多阐述,代码是借用别人的,我附上中缀表达式和后缀表达式的介绍和转换计算的代码,新建一个类
public static String toSuffix(StringBuilder infix)方法是将中缀表达式转为后缀表达式
public static String dealEquation(String equation)方法是计算后缀表达式的值并返回
将中缀表达式转化为后缀表达式
图解后缀表达式的计算过程

package com.example.calculator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class InfixInToDuffix {

    private static final Map<Character, Integer> basic = new HashMap<Character, Integer>();

    static {
        basic.put('-', 1);
        basic.put('+', 1);
        basic.put('×', 2);
        basic.put('/', 2);
        basic.put('(', 0);
    }


    public static String toSuffix(StringBuilder infix) {
        List<String> queue = new ArrayList<String>();
        List<Character> stack = new ArrayList<Character>();

        char[] charArr = infix.substring(0, infix.length()).trim().toCharArray();
        String standard = "×/+-()";
        char ch = '&';
        int len = 0;
        for (int i = 0; i < charArr.length; i++) {
            int last = 0;
            if (i > 0) {
                last = charArr[i - 1];
            }
            ch = charArr[i];
            if (Character.isDigit(ch)) {
                len++;
            } else if (ch == '.') {
                len++;
            } else if (ch == '-' && (last == '×' || last == '/' || i == 0)) {
                len++;
                continue;
            } else if (standard.indexOf(ch) != -1) {
                if (len > 0) {
                    queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i)));
                    len = 0;
                }
                if (ch == '(') {
                    stack.add(ch);
                    continue;
                }

                if (!stack.isEmpty()) {
                    int size = stack.size() - 1;
                    boolean flag = false;
                    while (size >= 0 && ch == ')' && stack.get(size) != '(') {
                        queue.add(String.valueOf(stack.remove(size)));
                        size--;
                        flag = true;
                    }
                    if (ch == ')' && stack.get(size) == '(') {
                        flag = true;
                    }
                    while (size >= 0 && !flag && basic.get(stack.get(size)) >= basic.get(ch)) {
                        queue.add(String.valueOf(stack.remove(size)));
                        size--;
                    }
                }
                if (ch != ')') {
                    stack.add(ch);
                } else {
                    stack.remove(stack.size() - 1);
                }
            }
            if (i == charArr.length - 1) {
                if (len > 0) {
                    queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len + 1, i + 1)));
                }
                int size = stack.size() - 1;
                while (size >= 0) {
                    queue.add(String.valueOf(stack.remove(size)));
                    size--;
                }
            }

        }
        String a = queue.toString();
        return a.substring(1, a.length() - 1);
    }


    public static String dealEquation(String equation) {

        String[] arr = equation.split(", ");
        List<String> list = new ArrayList<String>();


        for (int i = 0; i < arr.length; i++) {
            int size = list.size();
            switch (arr[i]) {
                case "+":
                    double a = Double.parseDouble(list.remove(size - 2)) + Double.parseDouble(list.remove(size - 2));
                    list.add(String.valueOf(a));
                    break;
                case "-":
                    double b = Double.parseDouble(list.remove(size - 2)) - Double.parseDouble(list.remove(size - 2));
                    list.add(String.valueOf(b));
                    break;
                case "×":
                    double c = Double.parseDouble(list.remove(size - 2)) * Double.parseDouble(list.remove(size - 2));
                    list.add(String.valueOf(c));
                    break;
                case "/":
                    double d = Double.parseDouble(list.remove(size - 2)) / Double.parseDouble(list.remove(size - 2));
                    list.add(String.valueOf(d));
                    break;
                default:
                    list.add(arr[i]);
                    break;
            }
        }

        return list.size() == 1 ? list.get(0) : "运算失败";
    }

}
Android布局小案例——安卓版计算器 分析:主要路基思维在于加减乘除四则运算的优先级,把这个解决了也就没什么难的了,可以把等式先化成字符数组,在转换成字符集合(数和运算符),之后进行计算。计算时第一个数字符串的下标为0,只用判断第二字符串运算符是否为乘或除或取余。2.如果不是,则判断下标为3的运算符是否为乘或除或取余。1.如果是这直接进行计算,之后把结果放在下标为0的集合中,删除后面两个元素。caseR.id.btn19: //点击=号算结果。caseR.id.btn01: //清空。caseR.id.btn02: //回退。 阅读详情

相关推荐

安卓开发之简易计算器教程

真·简易计算器,只支持两个整型数据进行简单的加减乘除四则运算,仅作为熟悉安卓开发的练手项目。 一共包括两个界面,一是主界面,如图1-1所示,是计算器的主体部分,二是选择运算符界面,如图1-2所示。 1-1主界面 1-2选择界面 主界面代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ap

qq_40174589的博客 1660

Android Studio实现简单的计算器

本次项目主要实现了简单的计算器功能,包括加减乘除基本运算,还有小数点和清零功能。可以算得上是很好的Android界面和按钮点击事件学习实例。刚用模拟器显示hello world的同学或者完全没有接触过Android的同学都可以直接上手。

振华OPPO的博客世界 2万+

用安卓写一个简单的计算器 android studio

具体源代码 MainActivity.java package com.example.calculator; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity ex...

loveyelong的博客 1937

Android计算器实现

这次项目中学习到如何在Android应用中实现计算器功能。如何在Activity中创建和管理视图。解如何使用XML布局文件来设计和布局界面。需要熟悉各种布局元素,如。学习到如何使用各种UI组件来实现用户交互。这包括如何使用等组件来输入和显示文本。在实现计算器功能时,你需要了解各种运算的规则和算法。这包括加法、减法、乘法和除法的基本原理,以及如何处理浮点数和括号等复杂表达式。可以掌握Android应用开发的基本概念,包括布局、事件处理和计算功能。这将在Android开发领域的进一步学习打下坚实的基础。

m0_72104085的博客 6829

【Android】安卓野路子学习项目之Android计算器(一)——界面布局

圆角矩形参考站内作者:jackiesky1206的文章使用软件:Android studio 的 2022.3.1 Patch 1 版本。

m0_70857716的博客 2122

生物信息学新手必看:MAFFT多序列比对从安装到实战(附参数优化技巧)

本文为生物信息学新手提供了MAFFT多序列比对工具的完整指南。从Linux环境下的安装部署,到核心算法策略(如FFT-NS-i、L-INS-i)的选择逻辑,再到空位罚分等关键参数的深度解析与优化技巧,手把手教你完成从原始序列到高质量比对结果的实战流程,为后续进化树构建等分析奠定坚实基础。

weixin_29230773的博客 484

Android——计算器(Calculator)

步骤: 1:输入一个数储存在变量num1中 2:选择 + - * /任意一个运算符 3:输入另一个数储存在变量num2中 4:并把运算结果保存到变量result中并显示 //如果被除数为0则结果默认显示为0 //在把String类型转化成double时有可能出现NumberFormatException异常,tyr,catch一下就可以了 /activity_main.xml效果图如下/ /activity_main.xml代码如下/ <?xml version="1.0" encoding="ut

FranzLiszt的博客 6068

Android开发者必看:5分钟搞定DeepSeek API接入(附完整代码示例)

本文为Android开发者提供快速接入DeepSeek API的完整指南,包含环境配置、网络层设计、请求体构建等关键步骤,并附有详细代码示例。通过工程化实践,帮助开发者高效集成AI对话、代码生成等高级功能,提升移动应用竞争力。

bush的博客 535

【Android Studio】简易计算器

简易计算器要求: 1,操作简单,易于掌握,界面简单。 2.方便进行加,减,乘,除等操作。数字保留小数点后两位。 3.包含小数点运算和输入回退功能。 4.能够进行多次叠加运算。 5.系统能够进行多次叠加运算。 6.系统可以稳定运行。 功能图如下: 逻辑流程图如下: 项目建立 项目的创建。 新建项目:项目名称设置为MainActicity。 在Activity模板中选择Blank Activity或者empty Activity模板。 其余操作不变,完成项目的创建。 计算器主界面的实现 1.设计界面布局XM

gelly_的博客 8015

Flink实战项目——城市交通实时监控平台

本项目是与公安交通管理综合应用平台、机动车缉查布控系统等对接的,并且基于交通部门现有的数据平台上,进行的数据实时分析项目。

yangwei2048的博客 837

STM32入门教程:水位传感器应用

这是一个简单的STM32水位检测系统的入门教程。希望通过学习本教程,您能对STM32微控制器的基本应用有更深入的了解,并能成功构建一个水位检测系统。如果您需要更详细的代码实例和教程,请参考相关的STM32开发手册和应用笔记。STM32是一款功能丰富且广泛应用于嵌入式系统的微控制器系列。在本教程中,我们将介绍如何使用STM32微控制器和水位传感器构建一个水位检测系统。

wx_linying1029的博客 533

【安卓】Android Studio简易计算器(实现加减乘除,整数小数运算,正数负数运算)

随着移动互联网的普及,手机应用程序已经成为人们生活中不可或缺的一部分。计算器是一类被广泛使用的应用程序之一,因此学习如何开发一款简易的计算器应用程序是学习Android Studio开发的一个很好的开始。Android Studio是一款Google开发的用于创建安卓应用的集成开发环境(IDE), 它可以帮助开发者快速设计、开发和测试应用程序。接下来我将为大家介绍如何使用Android Studio创建一个简易的计算器应用程序。

qq_73830179的博客 1万+

在鸿蒙中使用AVPlayer完成视频的播放【坚果派】

播放的全流程包含:创建AVPlayer,设置播放资源和窗口,设置播放参数(音量/倍速/缩放模式),播放控制(播放/暂停/跳转/停止),重置,销毁资源。5.准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置缩放模式、音量等。8.退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。6.视频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。今天我们来看一下视频如何正常播放。

坚果的博客 4056

java编写安卓计算器_Android计算器编写代码

其实这个安卓计算机,所有的后台思想与《C#计算器编写代码》是一模一样的。Win窗体程序移植到安卓,从C#到Java其实很简单的,因为两者的基本语法都很相像,唯一的难点是安卓的xml布局部分,不像C#窗体能够直接拖。还是如下图一个能够完成基本四则运算的计算器:先在res\values\strings.xml设置按钮相应的字体,以免布局文件警告满天飞:计算器1234567890.CE+-×÷=之后,布...

weixin_32540087的博客 1272

汇川AM系列ethercat控制伺服的使用说明(含转矩模式)

本文以一个实际例子,介绍ethercat伺服驱动器的工作原理,以及在汇川AM系列PLC中,如何点动、定位、速度、转矩控制ethercat伺服。

qq_34047402的博客 5111

《爬虫和逆向教程》 - 专栏介绍和目录

本专栏为爬虫初学者和进阶开发者量身定制的爬虫和逆向学习园地。为你提供全面而深入的爬虫和逆向技术指导,从入门到精通,从基础理论到高级实战,助你在数据的海洋中畅游,挖掘出有价值的信息。通过本专栏的学习,你将具备独立开发和优化爬虫程序的能力,及逆向分析能力和项目开发能力,成为爬虫领域的佼佼者。

数据知道的博客 2万+

【Android】最新安卓开发实例——计算器

序言 跟着优快云学院的安卓开发课做了一个计算器。 包括以下功能: 1.实现简单的四则运算,并有淡入淡出效果 2.清零和退格 3.横竖屏不同UI界面 4.右上角关于按钮放置相关信息 5.软件语言随着系统语言的改变而改变 文章目录序言AS文件目录AboutActivity.javaMainActivity.javafade_in.xmlfade_out.xmldigital_btn_selector.xmlsymbol_dark_selector.xmlsymbol_light_selector.xmlact

qq_45888298的博客 2318

【Agent实战】Agent Skills 深度解析:从原理到落地的完整指南

本文深入解析了Agent Skills的概念及其在AI协作中的实际应用。Skill是一种可被AI按需发现和加载的任务执行说明书,它将团队经验、规则和步骤固化为结构化文档,如SKILL.md。文章阐明了Skill与Prompt、MCP、Function Calling的关系,强调Skill专注于"怎么做"而非底层能力。重点介绍了SKILL.md的编写规范,包括元数据命名规则、描述技巧和正文内容优化,旨在帮助开发者高效构建可复用的知识资产,提升Agent的任务执行稳定性与专业性。通过清晰的示例和对比,为AI架构

少说,多做 115

安卓开发例程之计算器项目

安卓开发之计算器项目

qq_54122113的博客 732

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

从零打造Android计算器(安卓开发初体验)

使用Android Studio开发,SharedPreferences存储数据,java动态生成组件等技术。(可下载源码) 1. 渲染计算器所需的数字、符号、算式、结果 2. 实现计算逻辑(需要用到*数据结构*相关知识,看不懂可跳过) 3. 保存算式,即使关闭程序算式与结果仍然存在(使用SharedPreferences) 4. 旋转操作(很简单)...

m0_46193443的博客 3176

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

安卓手机计算器,精工计算器Android版下载,多功能计算工具安卓版

精工计算器app是一款多功能计算工具,集基础计算、科学计算、单位换算、理财计算等功能于一体。支持语音播报、按键震动,包含房贷计算、个税计算、汇率换算等实用功能,并提供30+国家汇率实时更新。特色功能包括亲戚关系计算、大小写转换、多进制转换等,满足日常计算到专业财务的各种需求。操作简单,通过设置可开启语音功能,适合各类用户群体使用。

sinat_37775891的博客 3136

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

安卓开发编写计算器(工具 android studio)

问题:编写一个计算器。 用网格布局编写界面: activity_main.xml 代码 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.and...

wujiancai1163的博客 6962

简单计算器 安卓 Android 作业

Android老师布置的课程作业——简单计算器 功能要求实现四则运算,参考界面见下图: 首先给各位老铁提供apk安装包以及项目压缩包,略表诚意~ github地址:https://github.com/wonke/Calculator 使用GirdLayout比较适合计算器这种规则的布局,每行有几个按钮几乎都是固定的,遇到一个按钮需要占两个常规按钮空间时,使用android:la...

weixin_34088583的博客 405

Android studio实验一——简单计算器的实现

需求分析 在Android studio中设计并实现一个简单的计算器,实现连续的加减乘除运算。 界面设计 采用网格GridLayout布局,设计了一个6行4列的网格,最上边是一个EditText用来显示用户输入的运算数字和运算符,以及相关的运算结果,其占4列,文本框大小为50dip;依次往下的界面分别设置了数字和运算符以及操作的按钮,各行各列的每个按钮的大小均设为26sp, 编程分析 设计了两...

lxjune1st61的博客 5万+

android应用程序设计计算器,课程设计-安卓计算器.doc

山西大学工程学院—操作系统课程设计—S计本1205班—刘航成第 PAGE 3页·共 NUMPAGES 33页山西大学工程学院操作系统 课程设计报告书题 目 安卓计算器的开发与设计系 别 计算机工程系专 业 计算机科学与技术班 级 S计本1205姓 名刘航成指导教师尹老师下达日期 2013年 6 月 13 日设计时间自201...

weixin_36099799的博客 628

安卓开发环境下android studio简易的计算器

安卓APP简易的计算器1.     Androidstduio布局及操作代码,采用线性布局,对按钮、文本、编辑框进行,表格布局,线性布局与表格布局相接合2.布局代码在activity_main.xml中&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;LinearLayout xmlns:android="http://schemas.android....

laiqiang9511的博客 1672
上一篇: GitHub的简单使用
下一篇: Android多人聊天室—服务器
PdKingLiu
博客等级 码龄9年 89粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值