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

具体的图形化界面可以参考我的另外一个篇博客:基于逆波兰表达式实现图形化混合计算器,这里我只是简单的介绍一下怎样求得算术表达式的结果,另外如果有需要可以加入另外那个博客中的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. springboot多环境部署(profile多环境支持)

    springboot多环境部署(profile多环境支持) 背景   项目开发过程中会有开发环境(dev),测试环境(test)和生产环境(prod),不同的环境需要配置不同的配置,profile提供 ...

  2. python爬虫之Beautiful Soup基础知识+实例

    python爬虫之Beautiful Soup基础知识 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库.它能通过你喜欢的转换器实现惯用的文档导航,查找,修改文档 ...

  3. 记一次生产环境tomcat线程数打满情况分析

    前言 旨在分享工作中遇到的各种问题及解决思路与方案,与大家一起学习. -- 学无止境, 加油 ! Just do it ! 问题描述 运行环境描述 tomcat-8.5 单节点(该应用集群20个节点) ...

  4. unity探索者之socket传输protobuf字节流(一)

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/6974229.html 近期在做一个棋牌项目,需要用到socket传输protobu ...

  5. Federated Optimization: Distributed Machine Learning for On-Device Intelligence

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1610.02527v1 [cs.LG] 8 Oct 2016 坐标下降法:https://blog.csdn.net/qq_ ...

  6. python numpy常用的数学和统计函数

    numpy模块的核心就是基于数组的运算,相比于列表和其他数据结构,数组的运算效率是最高的.在统计分析和挖掘过程中,经常会使用到numpy模块的函数,以下是常用的数学函数和统计函数: 常数p就是圆周率  ...

  7. 【Eclipse+PyDev】使用Python的IDE安装及配置详解

    转的文章 https://blog.csdn.net/jkwwwwwwwwww/article/details/51338230 https://blog.csdn.net/Jkwwwwwwwwww/ ...

  8. docker run 创建容器

    docker run常用命令 docker run :创建一个新的容器并运行一个命令 - 语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 1.OPTI ...

  9. Java多线程_Atomic

    1.什么是Atomic?Atomic,中文意思是“原子的”,在java多线程中,有这样的一个包: java.util.concurrent.atomic——线程安全的原子操作包 这是JDK1.5的版本 ...

  10. Linux教学资源服务器构建

    1. 需求分析 1.1 课题简介 随着计算机互联网的迅速发展,大多数学校已经实现教学的信息化,从传统的黑板教学方式转变为现阶段的多媒体教学,教学的资源,素材课件,甚至学生的作业也都实现数字化,为了实现 ...