返回顶部
首页 > 资讯 > 移动开发 >Android实现简易计算器功能
  • 872
分享到

Android实现简易计算器功能

2024-04-02 19:04:59 872人浏览 泡泡鱼
摘要

本项目为大家分享了Android实现计算器功能的具体代码,供大家参考,具体内容如下 项目介绍 练手项目。能实现加减乘除及括号运算。 开发思路 界面布局  1.界面布

项目为大家分享了Android实现计算器功能的具体代码,供大家参考,具体内容如下

项目介绍

练手项目。能实现加减乘除及括号运算。

开发思路

界面布局

 1.界面布局分三大块:公式文本区、结果文本区、按钮区。
 2.通过点击按钮录入数学公式,实时展示在公式文本区。
 3.点击等号,计算结果展示在结果文本区。
 4.另外还有清空数据和删除一个字符功能。

计算逻辑

 1.将中缀表达式转换为后缀表达式
 2.计算后缀表达式得出结果

其他说明

栈数据结构简单说明:

 1.栈数据结构像弹夹一样,先压进去的子弹后打出来,后压进去的子弹先打出来
 2.入栈:将元素放进栈里,并改变栈顶指针
 3.出栈:将元素从栈里拿出来,并改变栈顶指针
 4.查看栈顶,取得栈顶元素,但不改变栈顶指针

中缀表达式转后缀表达式简单说明

 1.如果是数字,直接放进后缀表达式里。

 2.如果是左括号,入栈。

 3.如果是右括号,依次出栈(放到后缀表达式里),直到遇到左括号。

 4.运算符号:

  1).空栈或栈顶是左括号,入栈
  2).栈顶符号优先级比当前符号小,入栈
  3).栈顶符号优先级大于等于当前符号,依次出栈(放到后缀表达式里),直到遇到不满足条件的元素或栈被掏空。

 5.最后如果栈还有符号,依次出栈(放到后缀表达式里)

后缀表达式计算简单说明

 1.如果是数字,入栈
 2.如果是运算符,将栈顶的两个数字弹出并计算(先出栈的数字放在运算符后面进行计算),再将计算结果入栈。

代码

界面代码


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="Http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <TextView
            android:id="@+id/the_expression"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="right"
            android:textSize="50dp" />
    </LinearLayout>

    <View
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:background="#000" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <TextView
            android:id="@+id/the_result"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="right"
            android:textSize="50dp" />
    </LinearLayout>

    <View
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:background="#000" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/left_bracket"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="("
            android:textSize="30sp" />

        <Button
            android:id="@+id/right_bracket"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text=")"
            android:textSize="30sp" />

        <Button
            android:id="@+id/clear"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="C"
            android:textSize="30sp" />

        <Button
            android:id="@+id/delete"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="DEL"
            android:textSize="30sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/seven"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="7"
            android:textSize="30sp" />

        <Button
            android:id="@+id/eight"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="8"
            android:textSize="30sp" />

        <Button
            android:id="@+id/nine"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="9"
            android:textSize="30sp" />

        <Button
            android:id="@+id/substraction"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="-"
            android:textSize="30sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/four"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="4"
            android:textSize="30sp" />

        <Button
            android:id="@+id/five"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="5"
            android:textSize="30sp" />

        <Button
            android:id="@+id/six"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="6"
            android:textSize="30sp" />

        <Button
            android:id="@+id/add"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="+"
            android:textSize="30sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/one"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="1"
            android:textSize="30sp" />

        <Button
            android:id="@+id/two"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="2"
            android:textSize="30sp" />

        <Button
            android:id="@+id/three"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="3"
            android:textSize="30sp" />

        <Button
            android:id="@+id/division"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="÷"
            android:textSize="30sp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/zero"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="0"
            android:textSize="30sp" />

        <Button
            android:id="@+id/point"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="."
            android:textSize="30sp" />

        <Button
            android:id="@+id/equal"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="="
            android:textSize="30sp" />

        <Button
            android:id="@+id/mulitipliction"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="×"
            android:textSize="30sp" />

    </LinearLayout>
</LinearLayout>

后台逻辑


package com.example.calc;

import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.calc.utils.Stack;

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

public class MainActivity extends AppCompatActivity {

    static final String ADD_TEXT = "+";
    static final String SUBSTRACTION_TEXT = "-";
    static final String MULTIPLICATION_TEXT = "×";
    static final String DIVISION_TEXT = "÷";
    static final String LEFT_BRACKET_TEXT = "(";
    static final String RIGHT_BRACKET_TEXT = ")";
    //符号集合
    static final List<String> SYMBOLS = Arrays.asList(ADD_TEXT, SUBSTRACTION_TEXT, MULTIPLICATION_TEXT, DIVISION_TEXT, LEFT_BRACKET_TEXT, RIGHT_BRACKET_TEXT);
    //符号优先级
    static final Map<String, Integer> SYMBOL_PRIORITY_LEVEL = new HashMap<String, Integer>(4) {{
        put(ADD_TEXT, 1);
        put(SUBSTRACTION_TEXT, 1);
        put(MULTIPLICATION_TEXT, 2);
        put(DIVISION_TEXT, 2);
    }};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        TextView expTextView = findViewById(R.id.the_expression);
        TextView resultTextView = findViewById(R.id.the_result);
        //数字与运算符按钮
        int[] ids = {R.id.zero, R.id.one, R.id.two, R.id.three, R.id.four, R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine, R.id.point, R.id.add, R.id.substraction, R.id.mulitipliction, R.id.division, R.id.left_bracket, R.id.right_bracket};
        for (int id : ids) {
            findViewById(id).setOnClickListener((v) -> {
                String newText = expTextView.getText().toString() + ((Button) v).getText().toString();
                expTextView.setText(newText);
            });
        }
        //删除一个字符
        findViewById(R.id.delete).setOnClickListener((v) -> {
            CharSequence text = expTextView.getText();
            if (text != null && text.length() > 0) {
                if (text.length() == 1) {
                    expTextView.setText(null);
                } else {
                    expTextView.setText(text.subSequence(0, text.length() - 1));
                }
            }
        });
        //清理
        findViewById(R.id.clear).setOnClickListener((v) -> {
            expTextView.setText(null);
            resultTextView.setText(null);
        });
        //等于
        findViewById(R.id.equal).setOnClickListener((v) -> {
            List<String> infix = getInfix(expTextView.getText().toString());
            List<String> suffix = infixToSuffix(infix);
            Double result1 = getResult(suffix);
            String result = String.valueOf(result1);
            if (result.contains(".") && result.split("\\.")[1].replace("0", "").length() == 0) {
                result = result.split("\\.")[0];
            }
            resultTextView.setText(result);
        });
    }

    //字符串转中缀表达式
    private List<String> getInfix(String exp) {
        List<String> texts = new ArrayList<>();
        char[] chars = exp.toCharArray();
        StringBuilder sText = new StringBuilder();
        for (char c : chars) {
            String text = String.valueOf(c);
            if (SYMBOLS.contains(text)) {
                if (sText.length() > 0) {
                    texts.add(sText.toString());
                    sText.delete(0, sText.length());
                }
                texts.add(text);
            } else {
                sText.append(text);
            }
        }
        if (sText.length() > 0) {
            texts.add(sText.toString());
            sText.delete(0, sText.length());
        }
        return texts;
    }

    //中缀表达式转后缀表达式
    private List<String> infixToSuffix(List<String> infix) {
        List<String> sufText = new ArrayList<>();
        Stack<String> stack = new Stack<>(infix.size());
        for (String text : infix) {
            if (!SYMBOLS.contains(text)) {
                //数值,直接放到后缀表达式
                sufText.add(text);
            } else if (LEFT_BRACKET_TEXT.equals(text)) {
                //左括号,直接入栈
                stack.push(text);
            } else if (RIGHT_BRACKET_TEXT.equals(text)) {
                //右括号,依次取出栈顶元素放到后缀表达式,直到遇到左括号
                while (!stack.isEmpty()) {
                    String pop = stack.pop();
                    if (!LEFT_BRACKET_TEXT.equals(pop)) {
                        sufText.add(pop);
                    } else {
                        break;
                    }
                }
            } else {
                //其他符号(+-*/)
                buildSuffix(text, sufText, stack);
            }
        }
        //取出剩余栈内数据放到后缀表达式
        while (!stack.isEmpty()) {
            sufText.add(stack.pop());
        }
        return sufText;
    }

    //后缀表达式求结果
    private Double getResult(List<String> suffix) {
        Stack<Double> stack = new Stack<>(suffix.size());
        for (String text : suffix) {
            switch (text) {
                case SUBSTRACTION_TEXT: {
                    Double pop1 = stack.pop();
                    Double pop2 = stack.pop();
                    stack.push(pop2 - pop1);
                    break;
                }
                case ADD_TEXT: {
                    Double pop1 = stack.pop();
                    Double pop2 = stack.pop();
                    stack.push(pop1 + pop2);
                    break;
                }
                case DIVISION_TEXT: {
                    Double pop1 = stack.pop();
                    Double pop2 = stack.pop();
                    stack.push(pop2 / pop1);
                    break;
                }
                case MULTIPLICATION_TEXT: {
                    Double pop1 = stack.pop();
                    Double pop2 = stack.pop();
                    stack.push(pop1 * pop2);
                    break;
                }
                default:
                    stack.push(Double.valueOf(text));
                    break;
            }
        }
        return stack.pop();
    }

    private void buildSuffix(String symbol, List<String> suffix, Stack<String> stack) {
        if (stack.isEmpty()) {
            //是空栈符号直接入栈
            stack.push(symbol);
        } else {
            //栈顶查看
            String peek = stack.peek();
            //栈顶是左括号符号或当前符号优先级大于栈顶符号直接入栈
            if (LEFT_BRACKET_TEXT.equals(peek) || isGreaterThanLevel(symbol, peek)) {
                stack.push(symbol);
            } else {
                //栈顶不是左括号,依次取出比当前符号优先级小或优先级相同的符号放到后缀表达式
                while (!stack.isEmpty()) {
                    if (isLessThanOrEquals(symbol, stack.peek())) {
                        suffix.add(stack.pop());
                    } else {
                        //遇到不符合条件的栈顶数据,直接退出
                        break;
                    }
                }
                //取完数据后,将当前符号入栈
                stack.push(symbol);
            }
        }
    }

    private boolean isGreaterThanLevel(String symbol, String peek) {
        Integer symbolLevel = SYMBOL_PRIORITY_LEVEL.get(symbol);
        Integer peekLevel = SYMBOL_PRIORITY_LEVEL.get(peek);
        return symbolLevel != null && peekLevel != null && symbolLevel > peekLevel;
    }

    private boolean isLessThanOrEquals(String symbol, String peek) {
        Integer symbolLevel = SYMBOL_PRIORITY_LEVEL.get(symbol);
        Integer peekLevel = SYMBOL_PRIORITY_LEVEL.get(peek);
        return symbolLevel != null && peekLevel != null && symbolLevel <= peekLevel;
    }
}

栈数据结构


package com.example.calc.utils;

public class Stack<T> {

    private int size;
    private Object[] elements;
    private int top = -1;

    public Stack(int size) {
        this.size = size;
        elements = new Object[size];
    }

    //压栈
    public void push(T element) {
        if (top != size - 1) {
            elements[top + 1] = element;
            top++;
        } else {
            throw new RuntimeException("stack is full!");
        }
    }

    //弹栈
    public T pop() {
        if (top > -1) {
            top--;
            return (T) elements[top + 1];
        } else {
            throw new RuntimeException("stack is null!");
        }
    }

    //查看栈顶
    public T peek() {
        if (top > -1) {
            return (T) elements[top];
        } else {
            return null;
        }
    }

    public boolean isEmpty(){
        return top == -1;
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Android实现简易计算器功能

本文链接: https://lsjlt.com/news/129066.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android实现简易计算器功能
    本项目为大家分享了Android实现计算器功能的具体代码,供大家参考,具体内容如下 项目介绍 练手项目。能实现加减乘除及括号运算。 开发思路 界面布局  1.界面布...
    99+
    2024-04-02
  • Android实现简易计算功能
    本文实例为大家分享了Android实现简易计算功能的具体代码,供大家参考,具体内容如下 效果如图: activity_main.xml <?xml version...
    99+
    2024-04-02
  • 用Android studio实现简易计算器功能
    用Android studio做一个简易计算器,供大家参考,具体内容如下 长话短说,先建立一个Android项目; 创建完成后打开activity_main.xml,构建我们的应...
    99+
    2024-04-02
  • python实现简易计算器功能
    本文实例为大家分享了python实现简易计算器功能的具体代码,供大家参考,具体内容如下 一、功能目标 用户输入一个类似  1-2*((60-30+(-40/5)*(9-2*...
    99+
    2024-04-02
  • Pyqt实现简易计算器功能
    本文实例为大家分享了Pyqt实现简易计算器的具体代码,供大家参考,具体内容如下 环境:pycharm、python3.7 首先用qtDesigner设计出如下界面。 再用pyUIC...
    99+
    2024-04-02
  • jQuery实现简易计算器功能
    jQuery制作一个简易计算器,供大家参考,具体内容如下 页面效果: 源码: <!DOCTYPE html> <html> <head>    ...
    99+
    2024-04-02
  • SpringMvc实现简易计算器功能
    用SpringMvc做一个简易计算器,供大家参考,具体内容如下 一 .domain类 package ssm1.domain; public class JiSuan {     ...
    99+
    2024-04-02
  • Swift实现简易计算器功能
    用Swift写一个简单计算器的Demo,供大家参考,具体内容如下 实验环境: Xcode v6.4   & OS X Yosemite 10.10 功能描述: 1、...
    99+
    2024-04-02
  • C++实现简易计算器功能
    本文实例为大家分享了C++实现简易计算器功能的具体代码,供大家参考,具体内容如下 介绍 介绍:仅支持自然数间的+ - * /操作,并没有括号。 实现:利用栈实现存储运算数以及运算符。...
    99+
    2024-04-02
  • Android studio如何实现简易的计算器功能
    这篇文章主要讲解了“Android studio如何实现简易的计算器功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android studio如何实现简易的计算器功能...
    99+
    2023-06-30
  • C#实现简易计算器小功能
    本文实例为大家分享了C#实现简易计算器小功能的具体代码,供大家参考,具体内容如下 简易的登陆界面。 具有幻灯片效果。(picturebox time控件)计算器支持多位数,小数,括...
    99+
    2024-04-02
  • javascript实现简易的计算器功能
    本文实例为大家分享了javascript实现简易的计算器的具体代码,供大家参考,具体内容如下 javascript实现简易计算器,只有两个input输入框,简单实现加减乘除: <...
    99+
    2024-04-02
  • Androidstudio实现简易计算器App功能
    在Android studio实现简易计算器App并实现加减乘除功能,供大家参考,具体内容如下 结果 activity_main.xml <xml version="1.0...
    99+
    2024-04-02
  • Androidstudio实现简易的计算器功能
    本文实例为大家分享了android studio简易运算器,供大家参考,具体内容如下 JAVA语句代码块: package com.example.douyingming; im...
    99+
    2024-04-02
  • vue实现简易的计算器功能
    本文实例为大家分享了vue实现简易计算器功能的具体代码,供大家参考,具体内容如下 实现功能:将两个输入框中的值进行加减乘除计算 用到的知识点: 1.v-model数据双向绑定 2. ...
    99+
    2024-04-02
  • C语言实现简易计算器功能
    本文实例为大家分享了C语言实现简易计算器功能的具体代码,供大家参考,具体内容如下 表达式求值项目(多功能计算器)。该项目主要包含了10个模块,10项功能: 1:加法运算:主要进行两个...
    99+
    2024-04-02
  • 简单实现Android计算器功能
    自己写的安卓的计算器: 注:这个是在mac中开发的,如果要在windows的eclipse中运行可能会出现路径问题,解决办法从windows中已有的安卓工程根目录下复制一下cl...
    99+
    2022-06-06
    Android
  • Android Studio实现简易计算器设计
    本文实例为大家分享了Android Studio实现简易计算器的具体代码,供大家参考,具体内容如下 一、题目 1、如图所示(实际设计,类似此界面样式即可,全屏时,按钮将会纵向拉伸),...
    99+
    2024-04-02
  • C#实现简易计算器功能(附源码)
    本文实例为大家分享了C#实现简易计算器功能的具体代码,供大家参考,具体内容如下 剖析: 1、先设计界面(按钮、文本框(一个显示算式,一个显示结果))布局 2、单击按钮将其对应内容显示...
    99+
    2024-04-02
  • Java利用栈实现简易计算器功能
    利用栈实现一个简易计算器(Java实现),供大家参考,具体内容如下 一、思路分析 当我们输入一个类似于“7*2+100-5+3-4/2”的简单中缀表达式时,我...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作