Android开发——简单计算器实现
计算器项目,要求实现加、减、乘、除、求倒数、求平方根等简单运算。
真机调试结果如下图:
布局文件: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开发——简单计算器实现相关推荐
- java中计算器算cos值,Android开发中计算器的sin、cos及tan值计算问题分析
本文实例讲述了Android开发中计算器的sin.cos及tan值计算问题.分享给大家供大家参考,具体如下: 接到一个需求 :要求计算器sin90=1,拿到知道很疑问 难道不等于一么?测试了四五个手机 ...
- android动画sin cos,Android开发中计算器的sin、cos及tan值计算问题分析
本文实例讲述了Android开发中计算器的sin.cos及tan值计算问题.分享给大家供大家参考,具体如下: 接到一个需求 :要求计算器sin90=1,拿到知道很疑问 难道不等于一么?测试了四五个手机 ...
- java安卓编程计算器_菜鸟学Android编程——简单计算器《一》
菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...
- Android开发简单的ViewGroup——FrameLayout
开门见山的说,一般android开发中,FrameLayout更多的是作为图层功能,或者碎片占位符:如时下的身份证扫描界面,可以利用FrameLayout实现两级图层:再有就是一些自定义的控件,往往是 ...
- Android Studio简单计算器App实现
一.内容: 基于AndroidStudio,实现一个简易的计算器(界面+简单的计算). 二.思路 1.首先设计界面,activity_main.xml 计算器界面,使用了网格布局GridLayout, ...
- Android开发—简单的图片浏览器
开发工具:ecplise 图片浏览器:实现简单的图片浏览功能,点击当前图片会自动切换到下一张图片 1.先在布局文件中定义一个简单的线性布局容器 <?xml version="1.0&q ...
- Android 开发简单记事本程序(附源码)
简单介绍一下功能:简单记事本只能添加文字内容,首页用ListView显示所有保存的事项和保存的时间,添加页面添加内容,点击首页的ListView可以查看内容,删除内容. 先看一下运行效果: 先建立数据 ...
- Android开发简单人脸签到系统开发
需求分析 第一步我对该实验做了一个完整性的需求分析: 我们需要做到以下几点: (1)学生信息的管理,对学生的信息的添加,删除,编译修改: (2)基于每个学生的人脸上传,并识别该图片是否是一个人脸图片: ...
- Android开发--简单实现Android应用的启动页
Android启动页效果展示 平时打开手机的应用时,会跳出来3秒钟的广告后,再进入应用.今天我们就来简单实现一下引导页的功能. 1.首先,新建一个activity页面,命名:SplashActivit ...
最新文章
- php提交表单关闭弹出层,使用js实现关闭js弹出层的窗口
- 不是现在新型的计算机技术,浅谈计算机技术的发展趋势
- PHP随机字符串生成器
- 设计模式复习-中介者模式
- python五子棋双人对弈_PyQt5实现五子棋游戏(人机对弈)
- 作文 —— 诙谐、幽默、调侃、批判
- 监控url_熬夜之作:一文带你了解Cat分布式监控
- nvidia控制面板点了没反应win7_为什么没有nvidia控制面板_win7没有nvidia控制面板怎么找回-系统城...
- java 注解scheduler_JAVA注解@Scheduled 不执行
- 【干货】22道机器学习常见面试题目
- 如何将屏幕截图保存到桌面以外的自定义文件夹?
- DroidCamX:合体手机与电脑
- Android单元测试 - 如何开始?
- 存储容量扩展的设计仿真实验
- 计算机课程培养关键能力,大学生计算机应加强自学能力培养
- php满一百人随机发放奖品,php按照奖品百分比随机抽奖 阿星小栈
- 撰写全英文EI会议论文值得注意的要点!
- mysql 高并发的解决方案
- LQ0139 油漆面积【枚举】
- Android用PdfRenderer类开发打开pdf文件的功能