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

真机调试结果如下图:

布局文件: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;}
}

Android开发——简单计算器实现相关推荐

  1. java中计算器算cos值,Android开发中计算器的sin、cos及tan值计算问题分析

    本文实例讲述了Android开发中计算器的sin.cos及tan值计算问题.分享给大家供大家参考,具体如下: 接到一个需求 :要求计算器sin90=1,拿到知道很疑问 难道不等于一么?测试了四五个手机 ...

  2. android动画sin cos,Android开发中计算器的sin、cos及tan值计算问题分析

    本文实例讲述了Android开发中计算器的sin.cos及tan值计算问题.分享给大家供大家参考,具体如下: 接到一个需求 :要求计算器sin90=1,拿到知道很疑问 难道不等于一么?测试了四五个手机 ...

  3. java安卓编程计算器_菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  4. Android开发简单的ViewGroup——FrameLayout

    开门见山的说,一般android开发中,FrameLayout更多的是作为图层功能,或者碎片占位符:如时下的身份证扫描界面,可以利用FrameLayout实现两级图层:再有就是一些自定义的控件,往往是 ...

  5. Android Studio简单计算器App实现

    一.内容: 基于AndroidStudio,实现一个简易的计算器(界面+简单的计算). 二.思路 1.首先设计界面,activity_main.xml 计算器界面,使用了网格布局GridLayout, ...

  6. Android开发—简单的图片浏览器

    开发工具:ecplise 图片浏览器:实现简单的图片浏览功能,点击当前图片会自动切换到下一张图片 1.先在布局文件中定义一个简单的线性布局容器 <?xml version="1.0&q ...

  7. Android 开发简单记事本程序(附源码)

    简单介绍一下功能:简单记事本只能添加文字内容,首页用ListView显示所有保存的事项和保存的时间,添加页面添加内容,点击首页的ListView可以查看内容,删除内容. 先看一下运行效果: 先建立数据 ...

  8. Android开发简单人脸签到系统开发

    需求分析 第一步我对该实验做了一个完整性的需求分析: 我们需要做到以下几点: (1)学生信息的管理,对学生的信息的添加,删除,编译修改: (2)基于每个学生的人脸上传,并识别该图片是否是一个人脸图片: ...

  9. Android开发--简单实现Android应用的启动页

    Android启动页效果展示 平时打开手机的应用时,会跳出来3秒钟的广告后,再进入应用.今天我们就来简单实现一下引导页的功能. 1.首先,新建一个activity页面,命名:SplashActivit ...

最新文章

  1. php提交表单关闭弹出层,使用js实现关闭js弹出层的窗口
  2. 不是现在新型的计算机技术,浅谈计算机技术的发展趋势
  3. PHP随机字符串生成器
  4. 设计模式复习-中介者模式
  5. python五子棋双人对弈_PyQt5实现五子棋游戏(人机对弈)
  6. 作文 —— 诙谐、幽默、调侃、批判
  7. 监控url_熬夜之作:一文带你了解Cat分布式监控
  8. nvidia控制面板点了没反应win7_为什么没有nvidia控制面板_win7没有nvidia控制面板怎么找回-系统城...
  9. java 注解scheduler_JAVA注解@Scheduled 不执行
  10. 【干货】22道机器学习常见面试题目
  11. 如何将屏幕截图保存到桌面以外的自定义文件夹?
  12. DroidCamX:合体手机与电脑
  13. Android单元测试 - 如何开始?
  14. 存储容量扩展的设计仿真实验
  15. 计算机课程培养关键能力,大学生计算机应加强自学能力培养
  16. php满一百人随机发放奖品,php按照奖品百分比随机抽奖 阿星小栈
  17. 撰写全英文EI会议论文值得注意的要点!
  18. mysql 高并发的解决方案
  19. LQ0139 油漆面积【枚举】
  20. Android用PdfRenderer类开发打开pdf文件的功能

热门文章

  1. Play框架最快上手!
  2. 【MATLAB】 01 基本操作与数组输入
  3. 什么是合成孔径雷达(SAR)
  4. 九、路由原理与路由协议
  5. qt之QLabel图片自适应
  6. img 图片自适应大小
  7. Java Class类文件的结构
  8. 星际无限 | 2021年IPFS应该关注的重点是什么?
  9. dubbo核心源码流程分析
  10. Android软键盘使用