- 浏览: 108690 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
zaizi5408:
已经改好了,但是有个问题text3的 更改后无法支持
mac上sublime 支持json, xml 格式化 -
Mybeautiful:
有一个问题,当格式化Json时,里面节点的顺序会变
mac上sublime 支持json, xml 格式化 -
squll369:
zl_dream1106 写道squll369 写道zl_dr ...
日历控件,完全用CSS+JS实现 -
zl_dream1106:
squll369 写道zl_dream1106 写道请问这句话 ...
日历控件,完全用CSS+JS实现 -
zhu547043537:
应该是将解压的三个jar放到插件目录中去
推荐一个eclipse UML 插件
这2天比较空,就实现了一个四则运算表达式求解,记录在此,它可以计算,带刮号,带小数,正负数的求解,比如下面的算式,"5*33-(-2)*((16-(100-5.12111))-12.35)",但是没有对算式的合法性做验证,如果输入了不合法的表达式,应该会抛RuntimeException.
类图:
1.CaculateExpress
package com.design.study.composite; import java.math.BigDecimal; public abstract class CaculateExpress { protected BigDecimal value = new BigDecimal(0); public abstract void add(CaculateExpress s); public abstract void subtract(CaculateExpress s); public abstract void multiply(CaculateExpress s); public abstract void divide(CaculateExpress s); public String toString(){ return value.toString(); } }
2.ActualCaculateExpress
package com.design.study.composite; import java.math.BigDecimal; public class ActualCaculateExpress extends CaculateExpress { public ActualCaculateExpress(String s1,String s2, String calExpress){ if("+".equals(calExpress)){ value = new BigDecimal(s1).add(new BigDecimal(s2)); }else if("-".equals(calExpress)){ value = new BigDecimal(s1).subtract(new BigDecimal(s2)); }else if("*".equalsIgnoreCase(calExpress)){ value = new BigDecimal(s1).multiply(new BigDecimal(s2)); }else if("/".equalsIgnoreCase(calExpress)){ value = new BigDecimal(s1).divide(new BigDecimal(s2),10,BigDecimal.ROUND_HALF_EVEN); } } @Override public void add(CaculateExpress s) { value = this.value.add(s.value); } @Override public void divide(CaculateExpress s) { value = this.value.divide(s.value,10,BigDecimal.ROUND_HALF_EVEN); } @Override public void multiply(CaculateExpress s) { value = this.value.multiply(s.value); } @Override public void subtract(CaculateExpress s) { value = this.value.subtract(s.value); } }
3.ActualCaculaterNumber
package com.design.study.composite; import java.math.BigDecimal; public class ActualCaculaterNumber extends CaculateExpress { @Override public void add(CaculateExpress s) { value = this.value.add(s.value); } @Override public void divide(CaculateExpress s) { value = this.value.divide(s.value,10,BigDecimal.ROUND_HALF_EVEN); } @Override public void multiply(CaculateExpress s) { value = this.value.multiply(s.value); } @Override public void subtract(CaculateExpress s) { value = this.value.subtract(s.value); } }
4.PackageExpress
package com.design.study.composite; import java.util.ArrayList; import java.util.List; public class PackageExpress { private boolean flag = false; public List<String> l = new ArrayList<String>(); public PackageExpress(String express) { packageExpress(express); } public void packageExpress(String s) { int startLoc = 0; if (s.startsWith("+") || s.startsWith("-")) { startLoc = 1; } for (int i = startLoc; i < s.length(); i++) { if (!flag) { if (checkExpressIsNumber(s)) { l.add(s); flag = true; return; } if ('+' == s.charAt(i) || '-' == s.charAt(i) || '*' == s.charAt(i) || '/' == s.charAt(i)) { l.add(s.substring(0, i)); l.add(s.substring(i, i + 1)); s = s.substring(i + 1, s.length()); packageExpress(s); } } } } private boolean checkExpressIsNumber(String express){ boolean flag = true; int startLoc = 0; if (express.startsWith("+") || express.startsWith("-")) { startLoc = 1; } for(int i=startLoc;i<express.length();i++){ if ('+' == express.charAt(i) || '-' == express.charAt(i) || '*' == express.charAt(i) || '/' == express.charAt(i)){ flag = false; } } return flag; } }
5.SubExpress
package com.design.study.composite; public class SubExpress { private int startLoc; private int endLoc; private String subExpress; private boolean hasHuahao; public int getStartLoc() { return startLoc; } public void setStartLoc(int startLoc) { this.startLoc = startLoc; } public int getEndLoc() { return endLoc; } public void setEndLoc(int endLoc) { this.endLoc = endLoc; } public String getSubExpress() { return subExpress; } public void setSubExpress(String subExpress) { this.subExpress = subExpress; } public boolean isHasHuahao() { return hasHuahao; } public void setHasHuahao(boolean hasHuahao) { this.hasHuahao = hasHuahao; } }
6.CaculateExpressResult
package com.design.study.composite; import java.math.BigDecimal; import java.util.List; public class CaculateExpressResult extends ActualCaculaterNumber { public CaculateExpressResult(String v) { this.value = new BigDecimal(calGuaHaoExpress(v)); } private String calGuaHaoExpress(String express){ SubExpress s = checkFirst(express); String v = calWithoutGuaHaoExpress(s.getSubExpress()); if(s.isHasHuahao() == false){ return v; } String prvCal = null; if(s.getStartLoc()-2 >= 0){ prvCal = express.substring(s.getStartLoc()-2,s.getStartLoc()-1); } String nextCal = null; if(s.getEndLoc()+2 <= express.length()){ nextCal = express.substring(s.getEndLoc()+1,s.getEndLoc()+2); } if(prvCal != null){ if (!"+".equals(prvCal) && !"-".equals(prvCal) && !"*".equals(prvCal) && !"/".equals(prvCal) && !"(".equals(prvCal) && !")".equals(prvCal)){ throw new RuntimeException("Format error!"); } } if(nextCal != null){ if (!"+".equals(nextCal) && !"-".equals(nextCal) && !"*".equals(nextCal) && !"/".equals(nextCal) && !"(".equals(nextCal) && !")".equals(nextCal)){ throw new RuntimeException("Format error!"); } } express = express.substring(0, s.getStartLoc()-1) + v.toString() + express.substring(s.getEndLoc()+1, express.length()); return calGuaHaoExpress(express); } private String calWithoutGuaHaoExpress(String express){ List<String> l = new PackageExpress(express).l; l = calMulandDivExpress(l); l = calAddandSubExpress(l); return (String)l.get(0); } private List<String> calMulandDivExpress(List<String> l){ for(int i=0;i<l.size();i++){ if("*".equals(l.get(i)) || "/".equals(l.get(i))){ CaculateExpress s = new ActualCaculateExpress(l.get(i-1),l.get(i+1),l.get(i)); l.remove(i-1); l.remove(i-1); l.remove(i-1); l.add(i-1, s.value.toString()); calMulandDivExpress(l); } } return l; } private List<String> calAddandSubExpress(List<String> l){ for(int i=0;i<l.size();i++){ if("+".equals(l.get(i)) || "-".equals(l.get(i))){ CaculateExpress s = new ActualCaculateExpress(l.get(i-1),l.get(i+1),l.get(i)); l.remove(i-1); l.remove(i-1); l.remove(i-1); l.add(i-1, s.value.toString()); calAddandSubExpress(l); } } return l; } private SubExpress checkFirst(String s){ int last = 0; int huahuaCheck = 0; for(int i=0;i<s.length();i++){ if(')' == s.charAt(i)){ last = i; huahuaCheck++; break; } } int prv = s.length(); for(int j=last-1;j>=0;j--){ if('(' == s.charAt(j)){ prv = j; huahuaCheck++; break; } } SubExpress se = new SubExpress(); if(huahuaCheck == 2){ se.setHasHuahao(true); }else if(huahuaCheck == 0){ se.setHasHuahao(false); se.setEndLoc(s.length()); se.setStartLoc(0); se.setSubExpress(s); return se; }else{ throw new RuntimeException("Format error!"); } String t = s.substring(prv+1, last); se.setEndLoc(last); se.setStartLoc(prv+1); se.setSubExpress(t); return se; } }
测试,
package com.design.study.composite; public class CaculateTest { /** * @param args */ public static void main(String[] args) { String express = "5*33-(-2)*((16-(100-5.12111))-12.35)"; System.out.println(new CaculateExpressResult(express)); } }
发表评论
-
Maven 中的自动测试
2013-12-28 08:54 1217我们用maven来管理一个项目,只要将测试类放在s ... -
mac上sublime 支持json, xml 格式化
2013-12-01 10:57 15181利用Tidy来format, 1. 首先下载插件的 ... -
在JDK中直接获取datasource,不利用其他的东东
2013-11-02 11:42 1086现在都在用spring里, ... -
Web的服务器文件浏览器
2013-04-21 11:39 1619昨天在家,写了一个web的文件浏览器,可以方便的查看和下载 ... -
mac 下使用eclipse (字体模糊,全屏)
2013-03-07 14:13 5438刚买了一台mac pro,安装了eclipse 3.7(4. ... -
eclispe的字体重新设定
2012-11-06 11:03 935eclispe 自从更新到了indigo版本后,那些字体的设定 ... -
推荐一个eclipse UML 插件
2012-09-21 17:31 3926原来一直用EA来画UML, 最近公司遭遇版权问题,EA不能使用 ... -
JSPWiki 支持附件文件内容搜索
2012-09-08 11:18 2414最近项目组要搭一个wiki,经过筛选我们决定使用JSPW ... -
String 超多位数相加
2011-08-23 15:44 1764利用上篇写的StringOrder,再写一个"无聊 ... -
String 顺序倒序迭代实现
2011-08-23 13:54 2479面试老是会遇到一些用String来考算法的题目,要取出Stri ... -
Java回调机制,利用回调写的JDBC 访问例子
2011-08-01 14:14 1750首先说说为什么要用到回调这个方式, 我 ... -
获取classpath里文件的URL
2011-07-19 12:40 1342通常,我们在项目中,要获得一个文件的url,可以通过如下2种方 ... -
利用多例模式编写配置文件读取器
2011-07-13 23:26 1029多例模式是单例模式的一个变种,可以根据一个特征值购建 ... -
代理模式(Proxy)笔记
2011-06-24 14:24 1154我对代理模式的理解就是,对于类中的方法进行拦截的一 ... -
Tomcat发布项目方法的3种方式
2011-06-23 00:24 11401.最简单的方式,将web项目文件件拷贝到webapps 目录 ... -
DAO层和Service层中访问Session
2011-06-19 13:13 10242很多情况下,我们需要在DAO或者Service层拿到S ...
相关推荐
c++程序求解简单的四则运算表达式
按中缀形式输入一个四则运算的表达式,利用算法优选算法把其转换为后缀表达式输出,并求表达式的值。假设输入的表达式中的操作数都是1位整数。
在这个主题的实践中,提供的"栈-算术表达式求解Calc"文件很可能是实现这一算法的代码示例。通过阅读和理解这个代码,你可以进一步掌握栈在解决实际问题中的应用,包括如何处理输入的字符串,如何定义栈的结构,如何...
《C语言课程设计-表达式求解》 在C语言课程设计中,表达式求解是一个常见的实践项目,它涉及到编程基础、数据结构以及算法等多个关键领域。此课程设计的目标是实现一个能够解析并计算任意合法数学表达式的程序。...
这个过程涉及到了数据结构、数组(在实际编程中实现栈时可能会用到数组)、四则运算以及后序表达式等核心概念。理解并掌握这些知识点,不仅有助于解决实际问题,也是深入学习计算机科学,尤其是编译原理和算法设计的...
当我们面对一个复杂的包含括号的四则运算表达式时,如何有效地计算结果成为一个挑战。此时,栈可以帮助我们解决这一问题: 1. **操作数栈**:用来存储数字。 2. **运算符栈**:用来存储运算符。 #### 三、具体实现...
此外,设计要求是实现一个能够处理整数和浮点数的四则运算计算器,包括加法、减法、乘法、除法以及幂运算。 二叉树在此问题中的作用是表示算术表达式。在计算机科学中,二叉树是一种特殊的树形数据结构,其中每个...
数据结构,C++实现基于链栈的简单算术表达式求值,本项目的目标是实现一个简单的算术表达式求解器,它能够处理基本的加、减、乘、除运算,并使用链栈数据结构进行求值。设计内容:对带括号的任意算术表达式求值。设计...
下面是一个简单的C++代码示例,演示了如何使用栈来求解四则运算表达式: ```cpp #include #include #include int precedence(char op) { // 定义运算符的优先级 } int applyOp(int a, int b, char op) { // ...
但限于本人水平有限,仅仅实现了基本的四则运算表达式的求解。 此外,本软件仍有许多错误、不足之处,尤其是输入表达式时,请严格按照规定的格式(详见格式说明)书写。虽然本计算器有基本的格式错误提示功能,但...
栈可以用来实现运算表达式的后缀表示法(也称为逆波兰表示法),从而简化四则运算的求解过程;队列则可能在处理用户输入的运算请求时发挥作用,保证先进先出的顺序。 其次,四则运算的实现涉及到算法的设计。加、减...
在实际应用中,四则运算常用于各种复杂的逻辑计算,比如数学问题的求解、游戏规则的实现、数据处理等。理解并能熟练运用四则运算是编程的基础,也是进一步学习易语言和其他编程语言的关键。 "SanYe"可能是这个资源...
### 二叉树实现简易计算器 #### 概述 本文档介绍了一个利用二叉树来实现简易计算器的程序。...这种实现方式不仅适用于简单的数学表达式处理,也为理解和学习数据结构及算法提供了一个很好的案例。
在编程领域,创建一个四则运算计算器的控制台程序是一项基础任务,它涉及到基本的算术运算符和逻辑处理。这个程序通常会接受用户输入的数学表达式,并根据加法(+)、减法(-)、乘法(*)和除法(/)进行计算。下面...
四则运算表达式在计算机科学和编程领域是基础且重要的概念。它们涉及到加法、减法、乘法和除法这四种基本算术操作。在处理这类表达式时,我们通常需要将其转换成不同的形式以便于计算。在这个场景中,"sizeyunsuan....
它可以支持基本的四则运算(加、减、乘、除),同时涵盖了更高级的数学函数,例如指数、对数、三角函数(正弦、余弦、正切)、反三角函数、平方根、立方根等。此外,它还可能支持复数运算、矩阵计算以及统计和概率...
例如,操作符的输入函数 int In(char c) 用于读取算数表达式,运算符比较优先级函数 char Proceed(char op,char c) 用于比较运算符的优先级,进行四则运算函数 int Operate(int a,char a1,int b) 用于执行四则运算等...
C++作为一种强大的、面向对象的编程语言,提供了丰富的数据结构和算法库,使得实现多项式的四则运算变得可能。本篇文章将深入探讨如何使用C++来计算如"2x^2 + 3x^3"这样的多项式的加法、减法、乘法和除法。 首先,...
除了基本的四则运算,此计算器还实现了开方功能。开方运算通常涉及到浮点数计算和平方根函数,这需要对C++的标准库有深入了解,特别是库中的sqrt函数。开方操作可能需要额外的错误处理,比如检查被开方数是否为负数...
### 数据结构与表达式求值知识点解析 #### 一、问题背景及定义 在计算机科学领域,**表达式求值**是一项基础而重要的任务。它涉及到如何解析并计算由数字和运算符组成的数学表达式的值。例如,对于表达式 `3 * (9 ...