android简易智能容错计算器

简介: 特点是:在按“=”之前智能预算结果显示,点击按钮,按钮颜色变化思路是:将输入的中缀表达式转换成后缀表达式进行计算难点是:带负数的四则混合运算,以及智能预算显示(这一部分容易出问题)当然最后要记得负0的处理还是为0,除以0提示...

看了一些网上的代码,感觉多少有点问题,有的不能计算浮点数,有的不能计算多位数,或者没办法保证乘除法在加减法的前面,或者不能与负数进行混合运算。


我实现的如下:

特点是:在按“=”之前智能预算结果显示,点击按钮,按钮颜色变化

思路是:将输入的中缀表达式转换成后缀表达式进行计算

难点是:带负数的四则混合运算,以及智能预算显示(这一部分容易出问题)

当然最后要记得负0的处理还是为0,除以0提示不能除以0


源码地址:GitHub - liuchenyang0515/Simple_Intelligent_fault---tolerant_calculator: 简易智能容错计算器


如演示图不能正常播放,请刷新网页

简易智能容错计算器示意图(模拟我的华为手机界面和效果):


image.gif



image.gif



image.gif


image.gif


这里将中缀表达式转换为后缀表达式然后计算出结果的java代码贴出来,android代码见上面地址:


importjava.text.DecimalFormat;
importjava.util.LinkedList;
importjava.util.Queue;
importjava.util.Scanner;
importjava.util.Stack;
publicclassTest {
privatestaticStringBuilderstr;
publicstaticvoidmain(String[] args) {
Scannercin=newScanner(System.in);
Strings=cin.next();
cin.close();
str=newStringBuilder(s);
DecimalFormatdf=newDecimalFormat("###.##############");
Stringnum=null;
try {
doubled=calculate();
if (Double.isNaN(d) ||Double.isInfinite(d)) {
System.out.println("不能除以0");
            } else {
num=df.format(d);
            }
        } catch (Exceptione) {
System.out.println("错误!");
        }
System.out.println("-0".equals(num) ?"0" : num);
    }
privatestaticdoublecalculate() {
Queue<String>q=getPostfixExpression(); // 中缀表达式转为后缀表达式returncalculatePostfixExpression(q);
    }
privatestaticdoublecalculatePostfixExpression(Queue<String>queue) {
Stack<Double>stack=newStack<>();
intlen=queue.size();
doublenum1=0.0, num2=0.0, num3=0.0;
for (inti=0; i<len; ++i) {
Strings=queue.poll();
if (!isOperator(s)) {
stack.push(Double.valueOf(s));
            } else {
num2=stack.pop();
num1=stack.pop();
switch (s) {
case"+":
num3=num1+num2;
break;
case"-":
num3=num1-num2;
break;
case"*":
num3=num1*num2;
break;
case"/":
num3=num1/num2;
break;
                }
stack.push(num3);
            }
        }
returnstack.peek();
    }
// 获得后缀表达式publicstaticQueue<String>getPostfixExpression() {
Stack<Character>stack=newStack<>();
intlen=str.length();
StringBuilderstrNum=newStringBuilder();
Queue<String>queue=newLinkedList<>();
chartemp=' ';
for (inti=0; i<len; ++i) {
temp=str.charAt(i);
if (temp>='0'&&temp<='9'||temp=='.') {
strNum.append(temp);
            } else {
if (i==0||isOperator(str.charAt(i-1) +"")) {
// 考虑负数的情况,比如乘以除以负数strNum.append(temp);
continue;
                }
queue.add(strNum.toString()); // 数字进队列strNum.setLength(0);
if (stack.isEmpty()) {
stack.push(temp);
                } else {
while (!stack.isEmpty()) {
chartop=stack.peek();
if (getPriority(top) >=getPriority(temp)) {
queue.add(top+"");
stack.pop();
                        } else {
break;
                        }
                    }
stack.push(temp);
                }
            }
        }
queue.add(strNum.toString()); // 数字进队列if (stack.isEmpty()) {
stack.push(temp);
        } else {
while (!stack.isEmpty()) {
chartop=stack.peek();
queue.add(top+"");
stack.pop();
            }
        }
returnqueue;
    }
privatestaticbooleanisOperator(Strings) {
returns.equals("+") ||s.equals("-") ||s.equals("*") ||s.equals("/");
    }
privatestaticintgetPriority(chartop) {
if (top=='+'||top=='-')
return1;
return2; // 只有加减乘除    }
}

image.gif

运行结果示例:

image.gif


image.gif


image.gif


image.gif


image.gif


image.gif


image.gif


image.gif


image.gif



image.gif


========================Talk is cheap, show me the code========================

目录
相关文章
|
Linux
LINUX出错解决办法:无法定位软件包 libX11-dev
LINUX出错解决办法:无法定位软件包 libX11-dev
1448 0
|
机器学习/深度学习 计算机视觉 异构计算
Darknet53详细原理(含torch版源码)
Darknet53详细原理(含torch版源码)—— cifar10
1314 0
Darknet53详细原理(含torch版源码)
|
数据可视化 数据挖掘
PCA 解释方差骤降图(ElbowPlot)拐点的量化识别
本文分享了一种在R语言里面实现量化识别 PCA方差贡献肘部图(ElbowPlot)中拐点 的简单方法,以供学习参考 定
2929 0
|
Java 数据库连接 应用服务中间件
【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承
在Maven中,依赖范围(Dependency Scope)用于控制依赖项在编译、测试和运行时的可见性和可用性。通过指定适当的依赖范围,可以在不同的构建和执行环境中控制依赖项的加载和使用。
1946 1
|
Unix Linux 编译器
C语言中EOF的用法
C语言中EOF的用法
1452 0
|
人工智能 自然语言处理 运维
Bolt.diy 一键部署,“一句话”实现全栈开发
Bolt.diy 是 Bolt.new 的开源版本,提供更高灵活性与可定制性。通过自然语言交互简化开发流程,支持全栈开发及二次开发,使零基础开发者也能实现从创意到云端部署的完整链路。本方案基于阿里云函数计算 FC 搭建,集成百炼模型服务,快速完成云端部署。用户可通过对话开启首个项目,两步完成部署并获300社区积分。方案优势包括多模型适配、高度定制化、全栈开发支持及智能化辅助工具,助力高效开发与创新。
1158 104
|
JSON 前端开发 API
Django进阶:DRF(Django REST framework)
Django进阶:DRF(Django REST framework)
610 1
|
前端开发 Java 网络安全
10分钟看懂SpringCloud微服务
传统的单体式架构系统,SSH、SSM等MVC模式架构;大家都很熟悉了。也是逐渐被淘汰的一些陈旧的技术了,这类系统的共通点是:整个系统打包成一个应用程序,测试部署上线。一旦业务量扩大到,整个系统没法容纳和承受它的压力时;就会出现各种各样的问题,如:高并发带来的服务器崩溃,线程堵塞,响应缓慢等。严重影响了公司的业务和发展;为了在技术上解决此类问题,以至于,出现了目前流行的分布式微服务技术。
495 0
10分钟看懂SpringCloud微服务
|
网络协议 中间件 编译器
C语言的应用场景
C语言的应用场景
|
4月前
|
人工智能 机器人 关系型数据库
阿里云RDSClaw介绍:核心优势、使用场景与免费试用开通步骤
RDSClaw是基于阿里云推出的开源OpenClaw构建的数据库原生AI Agent服务,通过RDS多引擎数据库生态,为企业提供数据持久记忆、专业技能矩阵、全面的可观测指标及安全的管控审计能力。RDSClaw支持自然语言交互,实现数据查询、性能诊断、安全事件响应等全场景智能运维,且支持个人微信、钉钉等五类IM通道一键接入。现提供15天免费试用,到期可享包年6折优惠,助力企业低成本快速落地AI能力。
478 21