android简易智能容错计算器
发布日期:2021-06-30 19:56:15
浏览次数:2
分类:技术文章
本文共 3545 字,大约阅读时间需要 11 分钟。
看了一些网上的代码,感觉多少有点问题,有的不能计算浮点数,有的不能计算多位数,或者没办法保证乘除法在加减法的前面,或者不能与负数进行混合运算。
我实现的如下:
特点是:在按“=”之前智能预算结果显示,点击按钮,按钮颜色变化
思路是:将输入的中缀表达式转换成后缀表达式进行计算
难点是:带负数的四则混合运算,以及智能预算显示(这一部分容易出问题)
当然最后要记得负0的处理还是为0,除以0提示不能除以0
源码地址:
如演示图不能正常播放,请刷新网页
简易智能容错计算器示意图(模拟我的华为手机界面和效果):
这里将中缀表达式转换为后缀表达式然后计算出结果的java代码贴出来,android代码见上面地址:
import java.text.DecimalFormat;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Stack;public class Test { private static StringBuilder str; public static void main(String[] args) { Scanner cin = new Scanner(System.in); String s = cin.next(); cin.close(); str = new StringBuilder(s); DecimalFormat df = new DecimalFormat("###.##############"); String num = null; try { double d = calculate(); if (Double.isNaN(d) || Double.isInfinite(d)) { System.out.println("不能除以0"); } else { num = df.format(d); } } catch (Exception e) { System.out.println("错误!"); } System.out.println("-0".equals(num) ? "0" : num); } private static double calculate() { Queueq = getPostfixExpression(); // 中缀表达式转为后缀表达式 return calculatePostfixExpression(q); } private static double calculatePostfixExpression(Queue queue) { Stack stack = new Stack<>(); int len = queue.size(); double num1 = 0.0, num2 = 0.0, num3 = 0.0; for (int i = 0; i < len; ++i) { String s = 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); } } return stack.peek(); } // 获得后缀表达式 public static Queue getPostfixExpression() { Stack stack = new Stack<>(); int len = str.length(); StringBuilder strNum = new StringBuilder(); Queue queue = new LinkedList<>(); char temp = ' '; for (int i = 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()) { char top = 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()) { char top = stack.peek(); queue.add(top + ""); stack.pop(); } } return queue; } private static boolean isOperator(String s) { return s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"); } private static int getPriority(char top) { if (top == '+' || top == '-') return 1; return 2; // 只有加减乘除 }}
运行结果示例:
========================Talk is cheap, show me the code========================
转载地址:https://liuchenyang0515.blog.csdn.net/article/details/83718437 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月11日 10时08分03秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
COMP7404 Machine Learing——ROC
2019-04-30
Python量子计算qiskit
2019-04-30
Python的多线程不是真的多线程(GIL全局解释器锁)
2019-04-30
Python手动读取MNIST数据集
2019-04-30
Python手动读取CIFAR-10数据集
2019-04-30
Pytorch(十一) —— 分布式(多GPU)训练
2019-04-30
Deeplab v3
2019-04-30
tensor/矩阵/图片等更换通道,调整size
2019-04-30
本地和colab 中 改变tensorflow的版本
2019-04-30
CUB-200鸟类数据集
2019-04-30
Python反射机制
2019-04-30
YAPF —— Python代码格式化工具
2019-04-30
ranger
2019-04-30
slurm
2019-04-30
Python计算文本BLEU分数
2019-04-30
torch.distributed 分布式
2019-04-30
MATLAB与CUDA
2019-04-30