-
Android实现小米手机自带的计算器
2020-11-07 00:49:24考虑到界面的美观性,我最终选择了小米手机自带的计算器来模仿。 这个计算器的图大概是这样的 以前学习栈的时候,我们知道,要实现一个能进行简单混合运算的计算器功能,需要通过两个栈将中缀表达式转换为前缀...最近突发兴趣,想自己实现一个提供四则混合运算的计算器,心动不如行动,就开始用Android来具体的实现下。但这种小Demo听着简单,实现起来还是需要一些参考。考虑到界面的美观性,我最终选择了小米手机自带的计算器来模仿。
这个计算器的图大概是这样的
以前学习栈的时候,我们知道,要实现一个能进行简单混合运算的计算器功能,需要通过两个栈将中缀表达式转换为前缀表达式(或后缀表达式),而且逻辑也比较复杂。如果对这个有兴趣的可以看我另一篇博客,里面有详细的程序流程图:https://blog.csdn.net/c_o_d_e_/article/details/108774118
在这里我就不讲上述的方法了。我仔细研究过小米计算器,发现它设计的也比较巧妙,每次输入数字都会进行运算一次,这样就不必将运算表达式转换为前/后缀表达式再去操作,省了不少麻烦。我最开始用过两种办法去模仿,都以失败告终(看来悟性不好、算法熟练度太低,人比较笨呀),后面就把前面乱七八糟写在一块的代码全部删除,然后从新开始设计算法。深思熟虑后,发现其实这个计算器的没有那么难。只是我没有想到点子上去。我的思路是:单独写一个工具类,用于处理并计算字符串,并从左到右依次计算然后返回结果。在Acticity的后台代码中就只需要每次输入数字时,就将当前的整个字符串传递给工具类,然后获取值即可。
思路清晰后,写代码就比较轻松,下面是我的工具类代码和部分核心Activity代码,界面布局由于不精通,这里就不弄上来了,后面可以去我的github仓库下载
计算器类Calculator
import java.util.regex.Pattern; /** * 实现计算功能的封装类 * 这里的计算只需要考虑从左到右依次计算,且不需考虑括号 */ public class Calculator { public static final String PRE = "(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)";//数字及小数校验正则表达式 public static final String PRE_SYMBOL = "[\\+\\-\\×\\÷\\%]";//运算符匹配表达式 /** * 传入表达式,计算并返回结果 * @param expre 传入的表达式 * @return 计算结果 */ public static String calculation(String expre){ //分别获取数字和运算符的数组集合 String[] sSymbol = Pattern.compile(PRE).matcher(expre).replaceAll("").split(""); String[] sNum = expre.split(PRE_SYMBOL); String result = sNum[0]; for (int i = 1; i < sNum.length; i++) { //这里注意在模拟器上,split后的长度不一定就是0,symbols在split后的长度问题,还没搞懂原因 result = calc(result,sNum[i],sSymbol[i-1]); } return result; } //计算两个数的结果 public static String calc(String a,String b,String symbol){ double result = 0; switch (symbol){ case "+": result = Double.parseDouble(a) + Double.parseDouble(b);break; case "-": result = Double.parseDouble(a) - Double.parseDouble(b);break; case "×": result = Double.parseDouble(a) * Double.parseDouble(b);break; case "÷": result = Double.parseDouble(a) / Double.parseDouble(b);break; case "%": if(b.equals("") || b == "")//只有一个数就除以100 result = Double.parseDouble(a) / 100; else//两个数就取模运算 result = Double.parseDouble(a) % Double.parseDouble(b); break; default: throw new RuntimeException("参数不合法:"+"a="+a+",b="+b+",symbol="+symbol); } //如果resutl结果是整数,就去掉.0后缀 return (Math.round(result)-result==0) ? String.valueOf((long)result) : String.valueOf(result); } }
Activity类的部分关键代码,主要是提供一种思路
import androidx.appcompat.app.AppCompatActivity; import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import java.util.regex.Pattern; public class MainActivity extends AppCompatActivity implements View.OnClickListener { //输入的文本内容 private static StringBuilder InputTextContent = new StringBuilder("0"); //显示结果的文本内容 private static StringBuilder resultTextContent = new StringBuilder("="); //输入内容的文本对象,下面统称为【输入文本框】 TextView inputText; //计算结果的文本对象,下面统称为【计算结果文本框】 TextView resultText; public static final String PRE = "(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)";//数字校验正则表达式 public static final String PRE_SYMBOL = "[\\+\\-\\×\\÷\\%]";//运算符匹配表达式 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); inputText = (TextView)findViewById(R.id.input_text); resultText = (TextView)findViewById(R.id.result_text); bingButton();//绑定按钮点击事件 } /** * 按钮及监听事件的绑定 * 共19个按钮 */ private void bingButton(){ Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(this);//绑定事件 ImageButton button2 = (ImageButton)findViewById(R.id.button2); button2.setOnClickListener(this); Button button3 = (Button)findViewById(R.id.button3); button3.setOnClickListener(this); Button button4 = (Button)findViewById(R.id.button4); button4.setOnClickListener(this); Button button5 = (Button)findViewById(R.id.button5); button5.setOnClickListener(this); Button button6 = (Button)findViewById(R.id.button6); button6.setOnClickListener(this); Button button7 = (Button)findViewById(R.id.button7); button7.setOnClickListener(this); Button button8 = (Button)findViewById(R.id.button8); button8.setOnClickListener(this); Button button9 = (Button)findViewById(R.id.button9); button9.setOnClickListener(this); Button button10 = (Button)findViewById(R.id.button10); button10.setOnClickListener(this); Button button11 = (Button)findViewById(R.id.button11); button11.setOnClickListener(this); Button button12 = (Button)findViewById(R.id.button12); button12.setOnClickListener(this); Button button13 = (Button)findViewById(R.id.button13); button13.setOnClickListener(this); Button button14 = (Button)findViewById(R.id.button14); button14.setOnClickListener(this); Button button15 = (Button)findViewById(R.id.button15); button15.setOnClickListener(this); Button button16 = (Button)findViewById(R.id.button16); button16.setOnClickListener(this); Button button17 = (Button)findViewById(R.id.button17); button17.setOnClickListener(this); Button button18 = (Button)findViewById(R.id.button18); button18.setOnClickListener(this); Button button19 = (Button)findViewById(R.id.button19); button19.setOnClickListener(this); } //实现OnClickListener接口的onClick方法,自定义实现其点击事件 @Override public void onClick(View view) { switch (view.getResources().getResourceEntryName(view.getId())){ case "button1" : // C OptionC(); break; case "button2" : // 回退 back(); break; case "button3" : // ÷ addAndCalc("÷"); break; case "button4" : // × addAndCalc("×"); break; case "button5" :// 7 addAndCalc("7"); break; case "button6" :// 8 addAndCalc("8"); break; case "button7" :// 9 addAndCalc("9"); break; case "button8" :// - addAndCalc("-"); break; case "button9" :// 4 addAndCalc("4"); break; case "button10" :// 5 addAndCalc("5"); break; case "button11" :// 6 addAndCalc("6"); break; case "button12" :// + addAndCalc("+"); break; case "button13" :// 1 addAndCalc("1"); break; case "button14" :// 2 addAndCalc("2"); break; case "button15" :// 3 addAndCalc("3"); break; case "button16" :// % addAndCalc("%"); break; case "button17" :// 0 addAndCalc("0"); break; case "button18" :// . addAndCalc("."); break; case "button19" :// = // 传入表达式,计算结果,赋给结果文本框对象显示 clickEqual(); break; default: break; } //添加字符时,要将【输入文本框】字体变大 inputText.setTextSize(60); inputText.setText(InputTextContent); } /** * 各操作方法的具体实现 */ //C 清除 public void OptionC(){ InputTextContent = new StringBuilder("0");//清空结果,恢复为初始的0 resultText.setVisibility(View.INVISIBLE);//隐藏计算结果文本框 } //回退 清除一个数 public void back(){ if(InputTextContent.length()>1){//不止一个字符 InputTextContent.delete(InputTextContent.length()-1,InputTextContent.length()); //获取当前输入的字符前面一个字符 String lastElement = InputTextContent.substring(InputTextContent.length()-1,InputTextContent.length()); //暂未完成 } else{ InputTextContent = new StringBuilder("0");//删除完后归零 resultText.setVisibility(View.INVISIBLE);//隐藏计算结果文本框 } } //点击等号 public void clickEqual(){ if(isCorrect(InputTextContent.toString())){//表达式能够计算就进行计算并显示结果 resultText.setText("="+Calculator.calculation(InputTextContent.toString()));//设置内容 resultText.setVisibility(View.VISIBLE);//设为可见 resultText.setTextSize(60);//设置大小 } } //每次添加一个元素到字符串,就对该字符串进行计算 public void addAndCalc(String newNext){ //获取当前输入的字符前面一个字符 String lastElement = InputTextContent.substring(InputTextContent.length()-1,InputTextContent.length()); if( Pattern.compile(PRE_SYMBOL).matcher(newNext).find()//输入的是符号 && ( InputTextContent.length() == 1 && InputTextContent.toString().equals("0")//是第一次输入 || Pattern.compile(PRE_SYMBOL).matcher(lastElement).find()//输入前的最后一个元素也是符号 ) ){ //Nothing... }else{ if(InputTextContent.length() == 1 && InputTextContent.toString().equals("0")){ //当只有一个数字且为0时,这个0就要被清除掉,从而解决刚开始输入去除0的问题 InputTextContent = new StringBuilder(""); } //将新的数字添加到尾部 InputTextContent.append(newNext); //将输入的数据显示到【输入文本框】 inputText.setText(InputTextContent); //字符串符合计算表达式规则就进行运算 if(isCorrect(InputTextContent.toString())){ //将该字符串计算出来,并显示到【计算结果文本框】 resultText.setText("="+Calculator.calculation(InputTextContent.toString())); resultText.setVisibility(View.VISIBLE); } } } //验证表达式是否能够进行计算 public boolean isCorrect(String expre){ String[] symbols = {}; String[] nums = expre.split(PRE_SYMBOL); if(Pattern.compile(PRE_SYMBOL).matcher(expre).find())//字符串中有符号就进行拆分{ { symbols = Pattern.compile(PRE).matcher(expre).replaceAll("").split(""); } //判断规则就是“符号数组比数字数字少1” if(symbols.length < nums.length)//模拟器上symbols在split后的长度问题,还没搞懂原因 return true; return false; } }
晚上很晚才弄完,代码没时间优化(主要是懒,不想弄了,哈哈),不过思路还是比较简单的。
-
科学计算器 开源_N +计算器是一款适用于您的智能手机的开源科学计算器
2020-07-15 03:15:19科学计算器 开源 移动... 以前,我写过关于Linux桌面的科学计算器的信息 ,下面是有关Calculator N +的信息, Calculator N +是一款适用于Android设备的GPL v3.0许可的超棒计算机代数系统(CAS)应用。 N +计算...科学计算器 开源
移动电话每天都在变得越来越强大,因此毫不奇怪,它们可以在不那么遥远的过去击败大多数计算机。 这也意味着它们上可用的工具每天都在变得越来越强大。
以前,我写过关于Linux桌面的科学计算器的信息 ,下面是有关Calculator N +的信息, Calculator N +是一款适用于Android设备的GPL v3.0许可的超棒计算机代数系统(CAS)应用。
N +计算器被认为是“ Android强大的计算器”,但这是一个卑鄙的说法。 该应用程序不仅可以以任意的精度运行,而且还可以显示具有全部根数和分数的结果,而且功能还很多 。
寻找多项式根? 检查一下 分解? 检查一下 符号导数,积分和极限? 检查一下 数论(模算术,组合学,素因数分解)? 检查一下
您还可以求解方程式系统,简化表达式(包括三角函数),转换单位……为您命名!
结果以LaTeX输出。 左上角的菜单提供了许多强大的功能,只需触摸一下即可使用。 同样在该菜单中,您将找到该应用程序所有功能的帮助文件。 在屏幕的右上角,您可以在精确和十进制表示之间切换。 最后,点击屏幕底部的蓝色条,即可访问应用程序中可用的整个功能库。 但小心点! 如果您不是数学家,物理学家或工程师,那么冗长的清单似乎势不可挡。
所有这些功能都来自另一个伟大的GPL 3项目Symja库 。
如果您是老师,学生或在STEM领域工作,请查看Calculator N +。 它是免费的,没有广告,是开源的,可以满足您所有的数学需求。 (当然,除了数学考试期间,绝对不允许使用智能手机来防止作弊。)
可以在Google Play商店中使用Calculator N +,也可以按照GitHub页面上的说明从源代码中构建它 。
如果您知道其他用于科学或工程的有用开源应用程序,请在评论中告诉我们。
翻译自: https://opensource.com/article/19/11/calculator-n-mobile
科学计算器 开源
-
电脑计算器的快捷键_CPA考试计算器购买指南,你选对吗?
2020-11-09 00:38:29关于计算器的携带,中注协是这样要求的应考人员可以携带蓝色或黑色钢笔、圆珠笔、铅笔、直尺、不具有文字储存及显示、录放功能的计算器等,不得携带手机等通讯设备和电子设备、书籍、纸张、饮品以及其他与注册会计师...#注册会计师#考试庞大的计算量,如果没有计算器的帮助,考生简直崩溃。以前就有地区,监考老师严禁考生携带计算器进入考场,不过现在这种情况应该不会发生,考生也不必过于担心。
关于计算器的携带,中注协是这样要求的
应考人员可以携带蓝色或黑色钢笔、圆珠笔、铅笔、直尺、不具有文字储存及显示、录放功能的计算器等,不得携带手机等通讯设备和电子设备、书籍、纸张、饮品以及其他与注册会计师考试无关的物品进入考场座位。
那么问题来了,什么是不具有文字储存及显示、录放功能的计算器?
以上左图中的计算器只是单独带M+是可以带进考场的。
右图中CTLG+M+代表存储功能,是不可以带进考场的。
考生如何选择购买计算器?
市场上的计算器种类很多,功能也有很大差别。有的计算器属于非存储类计算器,但是其功能达不到我们考试的要求,只能进行简单的加减乘除计算,甚至都不具备开根号的功能,考生带进考场并不能满足我们的使用要求。
下面为大家罗列几款不同种类的计算器:
1.商用计算器
生意人常用的计算器,按键非常大,但只是具备基本的加减乘除计算功能,不能满足注会考生考试需求。
2.金融计算器
金融领域使用的计算器,例如CFA考生考试要求必须携带金融计算器,适合计算内含报酬率、到期收益率、净现值、债券价值。操作起来比较复杂。而CPA考试并没有如此复杂的运算,有的地区不一定能带进考场,不建议大家购买。
3.科学计算器
科学计算器是非常推荐考生使用的一款计算器,其功能强大、操作灵活、价格也很实惠,是财管考试的首选。
考试过程中不能使用计算器了怎么办?
考试过程中有时候会遇到一些意外情况,例如计算器出现故障无法使用了,监考老师不让带计算器进入考场等等。高顿CPA小编提醒大家,千万不要慌,两种解决办法:
1.使用机考系统中的计算器
其中公式输入有固定的符号大家要提前熟悉一下。
考生在进入答题界面后,点击”计算器”按键,就可以打开电脑自带的计算器。特别要提广大考生的是,机考系统内置计算器虽然默认为标准型,但可通过快捷键"Alt+2"切换为科学型。可以满足考试中的需要,并且该计算器支持算式和计算结果复制粘贴,能够有效节省时间,提高答题效率。
2.使用搜狗V模式
关于搜狗V模式的操作方法,前面高顿CPA小编已为大家分享,可点击下方查看↓↓↓
CPA机考:考试如何使用搜狗V模式?
以上是为大家分享的关于注册会计师考试计算器的购买及相关操作,为了避免考试意外情况发生,高顿CPA小编建议大家熟悉各种计算器的操作使用技巧。
-
就是很以前那种普通的老人手机,那些功能是怎么实现的呢,老人手机不能装操作系统,比如计算器那都是运行在...
2016-05-13 01:51:32大家好,我一直有一个疑问,就是很以前那种普通的老人手机,那些功能是怎么实现的呢,老人手机不能装操作系统,比如计算器那都是运行在什么基础之上的呢?求大神指教! -
用js实现简单的加减乘除计算器功能_手机计算机自带的隐藏功能,我也是现在才知道,功能比你想得多...
2020-12-14 09:00:36手机里的功能也越来越多,从以前的只能打电话到现在的手电筒、计算机、看电视、听音乐等等。尤其是手机里的计算机服务功能,大大方便了我们的生活,出门再也不用担心没有计算机。很多人对于手机计算机的了解,还只...手机从1940年被美国贝尔实验室从战地移动电话机发展而来,已经经历了79年的发展历史。手机里的功能也越来越多,从以前的只能打电话到现在的手电筒、计算机、看电视、听音乐等等。尤其是手机里的计算机服务功能,大大方便了我们的生活,出门再也不用担心没有计算机。很多人对于手机计算机的了解,还只存在于简单的加减乘除,其实手机自带的计算机还有很多隐藏的用法,这些隐藏的用法很多人都不知道,甚至是用错了,今天呢就跟大家分享一下手机自带的计算机到底隐藏哪些比较实用的功能吧?
一,删除单个数字。平时在使用计算机输入数字的时候,一不小心就容易输错,如果只是单个数字输错,点c清除键的话,就会把自己所输入的数字全部清除,这样之前计算的所有成果都会付诸东流,而且还需要重新计算一遍,不仅麻烦还费事。
其实遇到这种问题,只需要使用手机里的一个隐藏功能就可以轻松解决,当我们输错数字之后,如果只需要清除输错的那个数字,就可以用手指把手机屏幕向右划一下,就可以只清除这一个数字了。然后再重新输入正确的数字,这样就很方便了。
二,科学计算器。我们平时打开的计算器出现的都是一般形式的计算器,这种计算器只能用于加减乘除这种简单的算法。几千块钱的手机还没有几十块钱的计算器功能强大时,心里难免会有一些失望。其实这是冤枉手机计算器了。我们只需要用手把手机屏幕往上滑,把屏幕锁定解开,
然后点开手机计算器,把它横着放,这样普通计算器就秒变科学计算器了。这样就可以计算一些比较复杂的三角函数值等,方便了我们的工作效率。
三,复制和粘贴功能。一般计算出来的数字都比较长,当我们想把这些数字发给别人的时候,就需要一个个的对着数字输入,这样不仅容易出错,而且耗损时间。其实我们只需要用手指按住需要发送的数字,数字上方就会出现一些基础的编辑功能,比如拷贝,有的手机上显示的是复制和粘贴,我们只需要点击复制,然后就可以发送给别人了。
四,Iphone手机可以快速启动计算机。随着手机功能越来越强大和越来越多的软件的开发,我们手机所下载的软件越来越多,当我们需要使用计算器的时候,就需要在这么多软件里慢慢的找,比较麻烦。其实只需要把手机屏幕底部向上滑,就可以调出控制中心,控制中心有一个计算器的标志,点击就可以立即开启计算器了。
几千块钱的手机买回来之后一定要多多了解它的隐藏功能,这样才能充分的利用手机,解决我们生活中很多的麻烦。当然手机的隐藏功能不止这些,如果你发现了手机的其他隐藏功能,可以在下方评论区留言,让更多的人知道。
-
Android开发:标准体重计算器应用的…
2014-05-30 10:53:20此功能在以前的手机中我们也经常看到。 AD:51CTO学院:IT精品课程在线看! 应用的操作和原理 目标Android应用的操作过程是这样的:选择你的性别,然后输入你的身高,点查看计算结果的按钮就在Toast中显示... -
nmap学习和bugku上web中web2和计算器
2019-06-01 14:56:57这次博客让交的很突然,没有一点准备,我本打算星期天写的,所以这次只能交个以前多写的但没有提交的博客,很抱歉了。从电脑再次打开博客我发现一些图片不见了,这是因为我是从百度上找的,好像是有版权的,所以我... -
Android开发:标准体重计算器应用的… 分类: Android开发...
2014-05-30 10:53:00此功能在以前的手机中我们也经常看到。 AD:51CTO学院:IT精品课程在线看! 应用的操作和原理 目标Android应用的操作过程是这样的:选择你的性别,然后输入你的身高,点查看计算结果的按钮就在Toast中显示... -
手把手教大家完成一个Calculator的设计
2016-11-09 13:28:27随着技术的更新,现在手机上的计算器不在满足于以前简单的加、减、乘、除运算功能。本应用基于 Android5.0 原生 Calculator,增加了复制、粘贴,保存历史功能。在本文中,我们将从应用的总体设计、UI 介绍、类结构,... -
职业规划§面试篇(二)【转载总结】
2016-12-24 11:16:001. 场景一: 假设你所在的团队负责研发一款手机计算器程序,你是这款产品的测试负责人,你准备如何开展工作? 【Key. 测试设计类】我问他这次测试任务的范围是什么?开发为什么要做这些改动?这些改动是开发自己提... -
嵌入式系统的定义及特点
2019-03-17 23:15:59作为20世纪人类社会最伟大的发明之一,计算机在期待...其实,嵌入式系统(Embed-dedSystem)很早以前就出现并得到了广泛的应用,如微型计算器、PC中的键盘,都是最典型的、简单的嵌入式系统。 如果说PC机的出现构建了信... -
GradeCalc::hundred_points:计算通过科目的必要分数。 将成绩存储在您的帐户中,以从PC和移动设备访问它们...
2021-02-05 15:56:43成绩计算器 是一款面向学生的渐进式Web应用程序,它的主要用途是在剩余的考试中计算出通过该科目的必要分数。 您可以创建自己的主题并共享它,或者如果有人以前创建过,则可以使用他们的主题。 此外,它还允许您... -
QQ对Pica,相煎何急?
2006-10-11 22:36:00虽然我的手机支持GPRS和Java,但对于我来讲只是用了打电话、短信、闹钟、计算器等基本功能。最近,因为腾讯QQ状告Pica(皮咔)侵权,指控其 “侵犯计算机软件著作权”,涉嫌“不正当竞争”,反而使Pica名声大噪。估计... -
计算机监控技术与系统开 配套源代码下载
2011-07-16 23:40:49重点:本系统综合应用了RS-232与RJ-45的数据传输技术,通过来电显示捕获客户来电号码,生成订单,再将订单发送到手机邮箱中。通过本章的学习,使学生进一步提高RS-232与RJ-45的编程熟练程度和灵活性,并获得一定的... -
博执药店GSP终端进销存管理软件(免费版)
2009-07-06 00:23:57博执药店GSP终端进销存管理软件(批发、销售、连锁、超市版)(含GSP管理)是杭州博执计算机技术有限公司自主研发、以大型数据库技术作为其程序开发的底层数据库,是专门针对...4、24小时的客服手机:(0)13705814696 -
adb1.0.26包含fastboot.exe
2019-03-05 15:11:03INSTALL_FAILED_UID_CHANGED 以前安装过该应用,与本次分配的 UID 不一致 清除以前安装过的残留文件 INSTALL_FAILED_VERSION_DOWNGRADE 已经安装了该应用更高版本 使用 -d 参数 INSTALL_FAILED_PERMISSION_MODEL_... -
025《Console》Chrome自带好用的计算器 024《Dark Reader》为任意网站启用夜间模式 023《FireShot》一键滚动截屏整个网页 022《扩展管理器》管理你的Chrome扩展 021《哔哩哔哩助手》助你快速成为B站老司机...
-
有些手机 root 后也无法通过 adb root 命令让 adbd 以 root 权限执行,比如三星的部分机型,会提示 adbd cannot run as root in production builds,此时可以先安装 adbd Insecure,然后 adb root 试试。 相应地,...
收藏数
20
精华内容
8