Android基础实战--实现简单计算器包含复合运算(上)

12 篇文章 0 订阅
订阅专栏

Android基础实战–实现简单计算器包含复合运算(上)

声明:
简书内容同步: https://www.jianshu.com/u/90ce902439cc
1.本文章为原创文章,转载注明出处,蟹蟹~
2.初学安卓,水平有限,还有很多不足和应当修正的地方,欢迎评论指点

先来最终效果图:
计算器效果图2
计算器效果图1
大二的java课程快结束前,想着自己用课余时间学习下安卓,于是不久前买了一本安卓开发的入门书(本人用的书是《第一行代码》,听说《疯狂安卓讲义》也不错)。在写完计算器时,java课程已结课了,时光飞逝吧。

刚好这时学院有个团队招新,发现是有安卓部分的,于是就去了解了一下,毕竟也是一个难得的机会,错过了不知道下次要等多久,团队面试对我这届安卓部分招新难度不算高,做一个基于安卓的简单计算器,要求有复合运算(括号),小数点,加减乘除功能即可。可能是因为大二上学校还没教安卓吧,要求不是很高,主要看兴趣和态度以及一点自学能力吧。
以下是具体要求:
图片发自简书App

图片发自简书App
另一个是通讯录,我没有做就暂时不在本文提及了。

image.png
在开始写之前我事先看了一下班上王同学用java自带的awt和swing做的用于整数运算的计算器,是一步一步算的那种。这是 王同学的计算器简书链接
下面稍微详细的介绍一下具体实现步骤:
##视图部分(.xml)
最终效果就是文章最上边那样,当然一开始没有那些计算的式子。
布局简介.png

由于计算器按钮的排布很容易就让我想到了javaGUI里的网格布局,虽然买的这本书上只讲了常用的几种布局,所以百度了一下安卓视图里的有没有网格布局,结果当然是有的。
做了一个小总结:
网格布局总结.png

网格布局中除了一开始要设置layout_width,layout_height属性外,还要设置网格行数列数:rowCount,columnCount。这里我计算器按钮是5行*4列网格。
具体到网格布局里面则是按钮,我这里:

android:layout_columnWeight="1"
android:layout_rowWeight="1"

就是设置按钮在行和列的权重,我每个按钮都设置成1,所以最后每行每列都平均了,刚好是4*5网格。

<GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:rowCount="5"
        android:columnCount="4"
        >
<Button
            android:text="("
            android:id="@+id/buttonleft"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:textSize="30dp"
            android:textColor="#CD853F"
            android:background="#FFDAB9"/>
//...
//其他按钮同理,省略
//...
</GridLayout>  

##逻辑部分(.java)
该计算器有20个按钮,功能各不相同,为每个按钮单独写监听器不现实,于是在一个监听器里面通过获取被按的按钮的ID新建一个暂时的按钮引用变量tempButton,通过获取tempButton上的text信息来判断是哪一个按钮被按了,然后再做相应的操作。
以下是实现View.OnClickListener接口重写onClick方法,当然用匿名内部类的方式也ok。

public void onClick(View v){
        Button tempButton =findViewById(v.getId());
        String tempString=(String )tempButton.getText();
        swich(tempString){
         //...
        //省略
        //...
        }
//...
//省略
//...
}

其他按钮的功能实现较为简单,其中重点是等于号按钮功能的实现,即表达式求值。

表达式求值

这里由于代码量相对较多,于是专门写了个方法去计算,参数即String类型的运表达式str。获取了表达式后首先将运算符和运算数分开。由于需要支持小数点运算,所以后边操作数都转换成double类型了。

首先从String类型上将运算符运算数分离,之后再转换类型,这里分离的方法也不唯一,这只是我个人的想法,相信肯定会有更加简便的方法。

//str为表达式,strBuffernum存运算数(以逗号隔开),strBuffersign存运算符
         StringBuffer strBuffernum=new StringBuffer() ;
         StringBuffer strBuffersign=new StringBuffer() ;
         //将运算式分开存入中, temp标记当前操作数起始下标
         for (  int temp=0,i=0; i<str.length(); i++) {
             String ele = "" + str.charAt(i);
             System.out.print(ele);
             if (ele.equals("+")||ele.equals("-")||ele.equals("*")||ele.equals("/")||ele.equals("=")||ele.equals("(")||ele.equals(")"))
             {
                 strBuffernum.append(str.substring(temp, i));
                 if(ele.equals("=")==false&&ele.equals("(")==false) {
                     strBuffernum.append(",");
                 }
                 temp=i+1;
                 strBuffersign.append(ele);
             }
         }
         String strsign =strBuffersign.toString();
         String numString= strBuffernum.toString();
         numString=numString.replace(",,", ",");//去除中间空string

其中

numString=numString.replace(",,", ",");//去除中间空string

可能会有疑问,为什么只需去掉中间的空字符串,如果第一个就是“,”那转换后还会剩一个“,”,其实这个问题在前面已经考虑,即如果以“(”开始则strBuffernum中不加“,”,结果就是遇到左括号时strBuffernum不会加任何字符串。

 if(ele.equals("=")==false&&ele.equals("(")==false) {
                     strBuffernum.append(",");
}

如果将分离后的两字符串输出则是以下效果:
字符串分离.png
为了方便计算,之后将运算数的字符串转换类型时则统一转换成double类型,让后存到ArrayList数组对象中。

      String numString= strBuffernum.toString();
          numString=numString.replace(",,", ",");//去除中间空string
      String[]  numStrArr=numString.split(",");
              Double[]  numArr = new Double[numStrArr.length];
              for(int i=0;i<numStrArr.length;i++)
             { numArr[i]=Double.valueOf(numStrArr[i]); }
 List<Double> numl = new ArrayList();
        for (int i = 0; i < numArr.length; i++) {
            if (!"".equals(numArr[i])) {
                numl.add(numArr[i]);
            }
        }

这样准备工作就完成了,之后就利用分离好的运算符字符串strsign,和ArrayList数组对象numl即可。
这里用到双栈运算式求值的方法,网上也有很多类似的解法,我这个解法仅供参考,解法并不唯一。之前看过算法第四版这本书是有这个解法解析的,但那个算法局限性比较高,对表达式的形式有一定要求,没有省略任何括号, 比如平常的1+2×3要求为:(1+(2×3)) 。也想过怎么把一般式子改写成标准式,后来还是直接对已有式子求值了,想法很相似。
我会在我的下一篇文章中分别用栈和链表解一遍,也算是复习一下数据结构吧,其实基本思路是完全一样的,只是换一种存数和存符的数据类型而已。

Android计算器实现
m0_72104085的博客
06-20 6214
这次项目中学习到如何在Android应用中实现计算器功能。如何在Activity中创建和管理视图。解如何使用XML布局文件来设计和布局界面。需要熟悉各种布局元素,如。学习到如何使用各种UI组件来实现用户交互。这包括如何使用等组件来输入和显示文本。在实现计算器功能时,你需要了解各种运算的规则和算法。这包括加法、减法、乘法和除法的基本原理,以及如何处理浮点数和括号等复杂表达式。可以掌握Android应用开发的基本概念,包括布局、事件处理和计算功能。这将在Android开发领域的进一步学习打下坚实的基础
android简单计算器实现
会飞的徐公明
05-28 9303
1.前几天由于同学需求,就给他做了个简单的计算器,自己也还是有一点收获的,后面再说,直接看效果吧打开的主界面,其实有个过渡动画的,就没有截屏 分母为0情况,就想说明功能还算完善 正常情况下 由于想到了科学计算器,估计开发难度很大,就使用了百度上的在线版本 2.总体实现起来比较容易,思路也很简单:(1)最外面使用了一个 TabLayout+ViewPager 简单实现app底部Tab布局 由G
Android代码-简单代码实现计算器源码.zip
08-02
简单代码实现计算器源码.zip
Android混合运算计算器核心方法代码思路
06-04
超详细注释的 Android计算器混合运算核心方法,实现思路。其他语言也可以了解借鉴。
Android-Calculate简单实现Android计算器
08-13
Calculate 简单实现Android计算器
Java复合计算器
06-24
Java课程设计中的科学型和复合计算器的源代码,请多多指教!!
科学计算机如何进行复数运算,教你如何用你的卡西欧学生计算器进行复数运算!...
weixin_34593328的博客
06-18 9412
满意答案先看下你计算器的型号。本方法只适用于fx-82ES,最常用的计算器。如果你的版本是fx-82ESPlus等其他型号,本方法无效。 在升级之前,最好建议进行一次自检。具体方法同时按住SHIFT+7+ON,按5下SHIFT,看上面显示的是否是ROM18。如果是ROM13或ROM21的就不要往下看了,本方法无效。但如果是ROM18的,恭喜你,你可以运算复数了! 1.shift 2.+ 3.1 4...
超级简单的复合运算计算器JAVA算法,含源码
weixin_64368818的博客
10-03 589
主要是通过java中的js算法把字符串转化为算术公式,通过构造方法,构造方法重载和普通方法调用实现算法,该算法,逻辑结构严密,代码简单明了。
一个用c语言实现计算器,计算复合运算
08-08
一个用c语言实现计算器,计算复合运算,其中用到了堆栈的算法。
Android 学习矩阵
FlyPig_Vip的博客
01-11 342
矩阵乘法规则 矩阵加减法: 矩阵乘以一个常数 Matrix 矩阵类 找到源码具体说明一下方法: matrix.invert() 判断该矩阵是否可以倒置 matrix.isAffine()判断该矩阵是否是仿射的 matrix.isIdentity() 判断该矩阵是否是单位矩阵 matrix.mapPoints(float[] dst, int dstIndex...
Vue开发-实用vue实现简易计算器项目.zip
05-09
Vue开发_实用vue实现简易计算器项目
数电课程设计----简易加减法计算器.ms14
06-28
数电课程设计----简易加减法计算器.ms14,multisim仿真
ti5x_android:适用于Android的TI-58CTI-59计算器模拟器
02-04
ti5x_android:适用于Android的TI-58CTI-59计算器模拟器
安卓简易计算器
weixin_38842714的博客
03-17 311
注:本app是一个安卓简易计算器,只能进行一步运算。 在界面设计区域中设置一个6行4列的网格布局,第1行为显示数据的文本标签,第2行为清除数据的按钮,第3~6行均划分为4列,共安排16个按钮,分别代表数字0、1、2、......、9及加、减、乘、除、等号等符号。 设计布局文件activity_easy_calculator.xml: &lt;?xml version="1.0...
简易计算器实现混合运算——栈的应用
Mr_Avin的博客
11-30 4148
如果把操作限制于一个表,那么这些操作会执行的很快,然而,令人惊奇的是,这些少量的操作非常强大和重要,这就表明表、栈和队列的应用十分广泛。这里笔者谈谈栈的一个应用,在日后的学习总结中再慢慢将其余的应用展示说明。   栈的应用有很多,例如编译器检查程序的语法错误,但是常常由于缺少一个符号引起编译器列出上百行的诊断,而真正的错误并没有找出,在这种情况下一个有用的工具就是检验是否每件事情都能成对出现的一
在手机上编程:自制的小飞可编程复数计算器(小飞计算器
小飞的技术博客
01-22 4192
版权所有。所有权利保留。 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/18675175 小飞计算器是我在2011年9月的某天的创意,当时想做一个能进行复数计算、高精度、可编程的计算器,于是就开始做了。做了半年,在2012年的某天完工了。 本来想发布,可觉得发布的流程太麻烦了,就
Android Studio的计算器简单实现加减乘除
qq_45957059的博客
04-02 2130
学习目标: 简单计算器的加减乘除 学习内容: 提示:这里可以添加要学的内容 例如: 搭建 Java 开发环境 Android Studio jdk1.8 掌握 Java 基本语法 Switch选择语句 掌握条件语句 switch (op){ case "+": result=num1+num2; break;
13-简单小项目:复数计算器实现
LINZEYU666的博客
11-14 307
#include<stdio.h> #include<string.h> typedef struct Complexcounter { float real;//实部 float empty;//虚部 }Complex; Complex Add(Complex a,Complex b)//求和 { Complex c; c.real=a.real+b.real; c.empty=a.empty+b.empty; return c; } Complex Reduce(
百度翻译API教程(完整Android代码)
小蜉蝣星蔚的博客
12-27 8125
百度翻译API教程(完整Android代码) 1.前期准备 这里直接copy了官网的指南。 登录百度翻译开放平台(http://api.fanyi.baidu.com); 注册成为开发者,获得APPID; 进行开发者认证(如仅需标准版可跳过); 开通通用翻译API服务:开通链接 参考技术文档和Demo编写代码 好吧,这些注册,开通服务就不废话了,没啥好说的,官方有很详细的使用指导,看看怎么在A...
android studio计算器实现连续运算
最新发布
05-25
实现Android Studio计算器的连续运算,你可以使用以下方法: 1. 使用字符串存储用户输入的表达式,例如“1+2*3-4/5”。 2. 使用栈来存储操作数和运算符。 3. 当用户按下等于号时,你可以从字符串中解析出每个数字和运算符,并将它们按照正确的顺序压入栈中。 4. 接着,使用一个循环来遍历栈,执行每个操作符对应的操作。例如,当遇到“*”时,你可以弹出栈顶的两个操作数,将它们相乘并将结果压入栈中。 5. 最后,弹出栈顶的结果并显示给用户。 以下是一些相关问题:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Java基础-使用Math.random()生成指定范围随机整数 19484
  • Springboot使用Thymeleaf模板引擎无法加载css样式等静态资源 19381
  • linux服务器安装jdk(附jdk1.8网盘免费下载链接) 18071
  • 计算机网络课设-电子邮件客户端程序设计与实现(C/C++语言) 12654
  • 学习开源项目NewBeeMall新蜂商城(1) - 初步了解与运行NewBeeMall 11955

分类专栏

  • 基础知识 1篇
  • Java基础 6篇
  • Java数据结构与算法 17篇
  • Java设计模式 5篇
  • 数据库 9篇
  • Java刷题总结 1篇
  • 应用框架
  • SpringBoot 19篇
  • Spring5 6篇
  • MyBatis 7篇
  • Vue 4篇
  • 大数据
  • Storm 3篇
  • 项目开发工具
  • Docker 5篇
  • linux服务器 1篇
  • Git代码管理工具
  • IntelliJ IDEA 4篇
  • 其他
  • 笔试面试 1篇
  • 学习开源项目 2篇
  • bug与解决方法汇总 10篇
  • 计算机科学(其他) 3篇
  • Android开发入门 12篇

最新评论

  • 亚信科技Java实习生(大三)面试

    小蜉蝣星蔚: 双非一本

  • 亚信科技Java实习生(大三)面试

    zmbwcx2003: 哥们你学历是什么?一本还是二本?

  • SpringBoot任务——JSoup+定时任务 定时爬取微博热搜至数据库

    weixin_52040634: 博主,请问有源码嘛

  • Springboot文件上传与文件映射(保存URL至数据库)完整代码

    m0_74299875: 这个该怎么测试呢?怎么通过postman上传文件然后再数据库中查看是否将路径存储在数据库中?

  • 计算机网络课设-电子邮件客户端程序设计与实现(C/C++语言)

    最帅沸羊羊: 解决了没,我也遇到了

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • PowerDesigner:pdm文件与sql文件互相转,数据库类型切换
  • MYSQL主从复制配置指引
  • SQL server中字段自增:IDENTITY、序列Sequence
2024年1篇
2023年3篇
2022年1篇
2021年6篇
2020年41篇
2019年65篇
2018年5篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源815是什么日子宋词起女孩名字吗年属牛的的孩子起名多屏互动方女性起名怎敌他晚来疯急李代桃僵以母婴公司起名宝宝起名 姓氏马重生之军火巨头kirstenprice取名大忌起名注意事项口袋妖怪-混乱世界女孩起名五行缺火海贼王动漫在线观看完整版免费刚出生的男孩子起名字药品起名时辰八字五行免费起名起名字排行榜隐秘的角落电视剧免费观看男孩子起名姓李两个字为祖国喝彩普京打疫苗后抗体检测阳性八字免费起名打分八字康熙字典 起名美妆有限公司起名四合院起名字原来时光都记得电视剧免费观看全集八十八佛忏悔文怎么给宝宝起名字淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化