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

article/2025/9/19 10:02:10

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

真机调试结果如下图:

布局文件: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"><ScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="简单计算器"android:textColor="#000000"android:textSize="20sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ffffff"android:orientation="vertical"><TextViewandroid: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><GridLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:columnCount="4"><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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" /><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><ImageButtonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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();  //存储运算式子的字符串构造器@Overrideprotected 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 , // 数字7R.id.btn_eight , // 数字8R.id.btn_nine , // 数字9R.id.btn_plus , // “加法”按钮R.id.btn_four , // 数字4R.id.btn_five , // 数字5R.id.btn_six , // 数字6R.id.btn_minus , // “减法”按钮R.id.btn_one , // 数字1R.id.btn_two , // 数字2R.id.btn_three , // 数字3R.id.btn_reciprocal , // 求倒数按钮R.id.btn_zero , // 数字0R.id.btn_dot , // “小数点”按钮R.id.btn_equal , // “等号”按钮R.id.ib_sqrt // “开平方”按钮};for(int buttonId:buttonSeq)findViewById(buttonId).setOnClickListener(this);builder.append(0);}//符号分类//数字//四则运算符//小数点//根号,倒数,等号,直接出结果//CE C@Overridepublic 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;}
}

http://chatgpt.dhexx.cn/article/uihaDyYf.shtml

相关文章

Android Studio简易计算器

目录 第一步&#xff0c;创建新项目 第二步&#xff0c;设计UI 第三步&#xff0c;实现计算逻辑 第四步&#xff0c;测试应用程序 随着移动互联网的普及&#xff0c;手机应用程序已经成为人们生活中不可或缺的一部分。计算器是一类被广泛使用的应用程序之一&#xff0c;因此…

十五、吉布斯采样的理解

由于本人喜欢在纸上手推原理&#xff0c;所以附上照片&#xff0c;欢迎提出建议

MCMC、吉布斯采样

学习视频&#xff1a;B站白板推导 学习和代码教程&#xff1a; Li Hang code 知乎&#xff08;和上面内容一模一样&#xff09; &#xff08;权当参考&#xff09; 关于上面代码中&#xff0c;吉布斯采样二维正态分布的理解&#xff1a; Σ的意思是协方差矩阵&#xff0c;在…

LDA----吉布斯采样

w~Mult(w|p) 这里可以引入一个新的概念:概率图模型,来画出这种模型。如图 3-1所示,图中被涂色的 表示可观测变量,方框表示重复抽取的次数, 表示一篇文档中总共 个单词, 表示M篇文档。也就是说,重复抽取 篇文档,每个文档抽取 个单词,这样的生成模型生成了整个语料(corpus)。 总结…

LDA-模型的实现-----吉布斯采样

https://www.cnblogs.com/nlp-yekai/p/3858705.html?utm_sourcetuicool&utm_mediumreferral 算法 LDA Collapsed Gibbs Sampling 输入&#xff1a;文档集(分词后)&#xff0c;K(主题数)&#xff0c;α&#xff0c;β&#xff0c;iter_number(迭代次数) 输出&#xff1a;…

R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样

创建测试数据 第一步&#xff0c;我们创建一些测试数据&#xff0c;用来拟合我们的模型。我们假设预测变量和因变量之间存在线性关系&#xff0c;所以我们用线性模型并添加一些噪音。 trueA <- 5trueB <- 0trueSd <- 10sampleSize <- 31# 创建独立的x值x <- (…

马尔科夫过程与吉布斯采样

随机模拟(或者统计模拟)方法有一个很酷的别名是蒙特卡罗方法(Monte Carlo Simulation)。这个方法的发展始于20世纪40年代&#xff0c;和原子弹制造的曼哈顿计划密切相关&#xff0c;当时的几个大牛&#xff0c;包括乌拉姆、冯.诺依曼、费米、费曼、Nicholas Metropolis&#xf…

吉布斯采样的简单描述

几个可以学习gibbs sampling的方法1&#xff0c;读Bishop的Pattern Recognition and Machine Learning&#xff0c;讲的很清楚&#xff0c;但是我记得好像没有例子。2&#xff0c;读artificial Intelligence&#xff0c;2、3版&#xff0c;都有。但是我没读过。3&#xff0c;最…

【ML】线性回归的吉布斯采样(Gibbs Sampling)实现(python)

导航 Bayesian Linear RegressionGibbs SamplingDerving a Gibbs samplerUpdate for β 0 \beta_0 β0​Update for β 1 \beta_1 β1​Update for τ \tau τSynthetic dataGibbs sampler code downlaodReferences Bayesian Linear Regression 考虑只有一个自变量(indepen…

【机器学习】主题建模+隐狄利克雷分配模型(LDA)+吉布斯采样

【主题建模】 大数据时代&#xff0c;面对海量的数据&#xff0c;如果能知道它的主题是什么&#xff0c;从数据压缩的角度来看&#xff0c;我们可以通过很少量的主题来管理很大亮的文档数据集合&#xff0c;从而实现一个比较简洁的操作和管理文档集合的目的&#xff1b;除此之外…

【人工智能】对贝叶斯网络进行吉布斯采样

问题 现要求通过吉布斯采样方法&#xff0c;利用该网络进行概率推理&#xff08;计算 P(RT|SF, WT)、P2(CF|WT)的概率值&#xff09;。 原理 吉布斯采样的核心思想为一维一维地进行采样&#xff0c;采某一个维度的时候固定其他的维度&#xff0c;在本次实验中&#xff0c;假…

matlab bnt工具箱吉布斯采样,吉布斯采样——原理及matlab实现

原文来自:https://victorfang.wordpress.com/2014/04/29/mcmc-the-gibbs-sampler-simple-example-w-matlab-code/ 【注】评论区有同学指出译文理论编码有误,请参考更官方的文献,个人当时仅验证过红色字体部分理论与维基百科中二位随机变量吉布斯采样的结果是否对应,其余部分…

【LDA】吉布斯采样

吉布斯采样是用条件概率得到联合概率分布。 其实是得到我们想要东西的近似解 目录 1 蒙特卡罗2 马尔科夫链3.MCMC采样4 MH采样5 吉布斯采样 1 蒙特卡罗 蒙特卡洛方法是为了解决一些不太好求解的求和或者积分问题。 其实就是一个近似方法&#xff0c;通过采样的多个样本代替原…

机器学习笔记之马尔可夫链蒙特卡洛方法(四)吉布斯采样

机器学习笔记之马尔可夫链蒙特卡洛方法——吉布斯采样 引言回顾&#xff1a;MH采样算法基于马尔可夫链的采样方式细致平衡原则与接收率 MH采样算法的弊端吉布斯采样方法吉布斯采样的采样过程吉布斯采样的推导过程吉布斯采样的代码实现 引言 上一节介绍了将马尔可夫链与蒙特卡洛…

三步完成吉布斯采样Gibbs sampling

吉布斯采样的具体执行过程只需要三个步骤&#xff0c;非常非常简单好理解&#xff0c;其它相关的背景知识能帮助加深理解。 一、Preliminaries Monte Carlo methods 它是很宽泛的一类计算方法&#xff0c;依赖重复的随机采样去获得数值结果。a broad class of computational a…

MCMC笔记:吉布斯采样(Gibbs)

1 介绍 吉布斯采样是一种特殊的MH采样 MCMC笔记Metropilis-Hastings算法&#xff08;MH算法&#xff09;_UQI-LIUWJ的博客-CSDN博客 此时我们要采样的分布是一个高维的情况 吉布斯采样的思想就是一维一维地进行采样&#xff0c;采某一个维度的时候固定其他的维度 吉布斯采…

吉布斯采样

回顾一下MC 采样&#xff1a; f(x)是已知 的概率分布函数&#xff0c;现在 找到一系列的x服从这个概率分布。也就是在f(x&#xff09;当中抽取一些样本x。后来就提出了&#xff1a; F(x)是f(x)的累积概率分布&#xff0c;只需 在0到1上均匀采样得到i&#xff0c;然后将这个样本…

随机采样和随机模拟:吉布斯采样Gibbs Sampling

http://blog.csdn.net/pipisorry/article/details/51373090 吉布斯采样算法详解 为什么要用吉布斯采样 通俗解释一下什么是sampling。 sampling就是以一定的概率分布&#xff0c;看发生什么事件。举一个例子。甲只能E&#xff1a;吃饭、学习、打球&#xff0c;时间T&#xff1a…

吉布斯抽样

吉布斯采样是生成马尔科夫链的一种方法&#xff0c;生成的马尔科夫链可以用来做蒙特卡洛仿真&#xff0c;从而求得一个较复杂的多元分布。 吉布斯采样的具体做法&#xff1a;假设有一个k维的随机向量&#xff0c;现想要构造一条有n个样本的k维向量&#xff08;n样本马尔科夫序列…

从马尔科夫过程到吉布斯采样(附程序示例)

目标&#xff1a;如何采取满足某个概率分布的一组数据&#xff0c;比如如何给出满足标准正太分布的1000个点&#xff0c;当然该分布比较简单&#xff0c;生成满足此分布的1000个点并不难&#xff0c;对matlab&#xff0c;python 等都是一行语句的事&#xff0c;但是如果是一个不…