这个计算器并不是基于逆波兰实现的,而是通过简单的递归,一层一层地计算最终求得结果。

具体的图形化界面可以参考我的另外一个篇博客:基于逆波兰表达式实现图形化混合计算器,这里我只是简单的介绍一下怎样求得算术表达式的结果,另外如果有需要可以加入另外那个博客中的Check方法,来检查表达式的合法性。

计算表达式的算式如下所示(GitHub仓库地址):

import java.math.BigDecimal;
import java.util.Scanner; public class Calculator {
private String expression;
public static void main(String[] args) {
System.out.print("输入算式:");
Scanner scanner = new Scanner(System.in);
String express = scanner.nextLine();
Calculator calculator = new Calculator(express);
System.out.println(calculator.Calculated());
}
public Calculator(String expression) {
this.expression = expression;
}
public String Calculated() {
if (expression == null || expression.trim().equals("")) { //如果算式为空,返回"0"
return "0";
}
int a1 = expression.indexOf("+"); //求出第一个"+"的位置
int a2 = expression.indexOf("-"); //求出第一个"-"的位置
int a3 = expression.indexOf("*"); //求出第一个"*"的位置
int a4 = expression.indexOf("/"); //求出第一个"/"的位置
int a5 = expression.indexOf("("); //求出第一个"("的位置
int a6 = expression.lastIndexOf(")"); //求出最后一个")"的位置
//如果都不存在
if (a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1 && a5 == -1 && a6 == -1) {
if (expression.trim() == null || expression.trim().equals("")) { //如果为空,返回Error!
return "Error";
}
return expression.trim(); //直接返回
}
if (a5 != -1 && a6 > a5) { //存在配对的括号
//计算出括号里面的内容
String str = new Calculator(expression.substring(a5 + 1, a6).trim()).Calculated();
if (str.equals("Error!")) {//如果返回"Error!",有可能是()()这种形式
a6 = expression.indexOf(")"); //得到第一个")"位置
if (a6 > a5) {//如果右括号在左括号的右边
//计算出括号里面的内容
str = new Calculator(expression.substring(a5 + 1, a6).trim()).Calculated();
if (str.equals("Error!")) //如果得到"Error!"
return str; //直接返回
}
else return "Error!";
}
expression = expression.replace(expression.substring(a5, a6 + 1), str);
return new Calculator(expression).Calculated();
}
else if (a5 != -1 || a6 != -1) //括号不匹配
return "Error!";
if (a1 != -1) { //有加号
String str1 = new Calculator(expression.substring(0, a1)).Calculated();
String str2 = new Calculator(expression.substring(a1 + 1, expression.length())).Calculated();
//如果其中一个返回"Error!",直接返回"Error!"
if (str1.equals("Error!") || str2.equals("Error!"))
return "Error!";
//计算
return String.valueOf(Double.parseDouble(str1) + Double.parseDouble(str2));
}
if (a2 != -1) { //有减号
String str1 = new Calculator(expression.substring(0, a2)).Calculated();
String str2 = new Calculator(expression.substring(a2 + 1, expression.length())).Calculated();
//如果其中一个返回"Error!",直接返回"Error!"
if (str1.equals("Error!") || str2.equals("Error!"))
return "Error!";
//计算
return String.valueOf(Double.parseDouble(str1) - Double.parseDouble(str2));
}
if (a3 != -1) { //有乘号
String str1 = new Calculator(expression.substring(0, a3)).Calculated();
String str2 = new Calculator(expression.substring(a3 + 1, expression.length())).Calculated();
//如果其中一个返回"Error!",直接返回"Error!"
if (str1.equals("Error!") || str2.equals("Error!"))
return "Error!";
//计算
return String.valueOf(Double.parseDouble(str1) * Double.parseDouble(str2));
}
if(a4 != -1) { //有除号
String str1 = new Calculator(expression.substring(0, a4)).Calculated();
String str2 = new Calculator(expression.substring(a4 + 1, expression.length())).Calculated();
//如果其中一个返回"Error!"或除数为0,直接返回"Error!"
if (str1.equals("Error!") || str2.equals("Error!") || Double.parseDouble(str2) == 0.0)
return "Error!";
//舍入计算
BigDecimal a = new BigDecimal(Double.parseDouble(str1));
BigDecimal b = new BigDecimal(Double.parseDouble(str2));
return a.divide(b, 5, BigDecimal.ROUND_HALF_UP).toString();
}
return expression.trim();
}
}

Java实现简单混合计算器的更多相关文章

  1. 01.Java 开发简单的计算器

    难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习一. 实验介绍1.1 实验内容本次实验利用Java开发一个可以进行简单的四则运算的图形化计算器,会使用到 Java Swing ...

  2. Java 最简单的计算器——使用Args参数

    public class Test{ public static void main(String[] args){ if(args.length<3){ System.out.println( ...

  3. Java对象简单实用(计算器案例)

    对 Java中的对象与属性,方法的使用,简单写了个案例 import java.util.Scanner; class Calculste { int a; //定义两个整数 int b; Strin ...

  4. Java简单公式计算器

    最近给公司开发业务代码时,碰到一个场景,简单描述是这样的: 客户要向咱们公司定制一件产品,这个产品呢,有很多属性,那公司得根据这些属性报价呀,怎么报价呢?公司针对某种类型的产品有一个基准价,在同类产品 ...

  5. jsp学习---使用jsp和JavaBean实现超简单网页计算器

    一.需求 如题,用jsp实现一个超简单的网页计算器. 二.实现 1.效果图 1)初始界面: 2)随便输入两个数进行相乘: 3)当除数为零时提示报错: 2.代码 Calculator.java pack ...

  6. android之Java+html+javascript混合开发

    android开发,除了使用原生态的开发方式之外,还可以使用java+html+javascript混合开发的方式来开发,这样可以节省大量的开发时间,同时还可以使不同设备的用户获得相同的用户体验.好了 ...

  7. java课程设计(计算器)

    JAVA课程 设 计 报 告 1206401-18   瞿杰 一.设计时间 2013年6月 24日-----6月28日 二.设计地点 湖南城市学院实验楼计算机506机房 三.设计目的 1.巩固学习VB ...

  8. HDU1237 简单的计算器 【堆】+【逆波兰式】

    简单的计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...

随机推荐

  1. C#LeetCode刷题之#39-组合总和(Combination Sum)

    目录 问题 示例 分析 问题 该文章已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3663 访问. 给定一个无重复元素的数组 candi ...

  2. Vue element-ui el-table阻止行选事件

    我们经常会在某个table末尾加上操作列来放置button来处理跳转和其他的逻辑 那么当点击button的时候同样也会执行在el-table 设置的 @row-click="handleRo ...

  3. jQuery的事件与 动画

    什么是事件: 事件的本质是委托. Jquery的 方法: $().css(); $().click(); 等等. 鼠标的事件: 区别在于:mouseover与mouseout再进入或离开后会执行这两个 ...

  4. 数据库课程设计:SQL Server + Express + node.js + ejs 论坛管理系统

    前言 这是一篇对数据库课程设计的总结,这不是教程也不是指导,只是我的经验之谈,其中可能有许多错误,请小心,不要被误导.祝愿你看了这篇文章后能做出更好的设计. 我对web开发并不熟悉,而我们的课程设计只 ...

  5. springboot + kafka 入门实例 入门demo

    springboot + kafka 入门实例 入门demo 版本说明 springboot版本:2.3.3.RELEASE kakfa服务端版本:kafka_2.12-2.6.0.tgz zooke ...

  6. magento 1.9 with nginx frontend and REST API 404

    location /api { rewrite ^/api/rest /api.php?type=rest last; rewrite ^/api/v2_soap /api.php?type=v2_s ...

  7. 什么是RPC,RPC好处,常用的RPC框架

    RPC简介 RPC(Remote Procedure Call Protocol)远程过程调用协议.一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用 ...

  8. Python九九乘法表(正序和逆序)

    正序: for i in range(1,10): for j in range(1,i+1): print(str(i)+"*"+str(j)+"="+str ...

  9. 区块链入门到实战(34)之Solidity – 变量

    Solidity 支持三种类型的变量: 状态变量 – 变量值永久保存在合约存储空间中的变量. 局部变量 – 变量值仅在函数执行过程中有效的变量,函数退出后,变量无效. 全局变量 – 保存在全局命名空间 ...

  10. Flying Pages:在单击之前预加载页面,打开网页快得飞起

    Flying Pages能够实现:在用户点击网页的链接之前,就预加载这个网页,当再点击这个网页时,页面便能飞速打开,能为网站优化加分.接下来,就由LOYSEO来讲解Flying Pages的使用方法. ...