yyq

问君...

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  98 随笔 :: 1 文章 :: 42 评论 :: 0 Trackbacks

Calc是一个用Java编写的算术表达式计算工具。它能够直接解析一个字符串形式的算术表达式并计算出结果。

Calc使用下面的语法:

E ->  I | E + I | E - I
I -> U | I * U | I / U
U -> + U | - U | <浮点数> | ( E ) | <函数> | PI | E

其中,<浮点数>是一个符合java规范格式的10进制浮点数,PI是圆周率,E是自然对数的底。

<函数>实现了一些常用函数,函数的一般形式是:

<函数名> ( <参数>... )

参数也是一个表达式(即E),可用的函数列表则请参考图形界面或java.lang.Math的帮助文档。

Calc内部使用双精度浮点型(double)进行运算,一个正确的表达式经Calc计算所得的结果应该等于相应java表达式的结果。

示例代码:
import yyq.prod.calc.Calculator;
...
double result = Calculator.calc("1 + 2 + sin(1)");
System.out.println(result);



下载:
http://www.blogjava.net/Files/20070716/calc.zip


部分source下载:
http://www.blogjava.net/Files/20070716/calc_src.zip

 

posted on 2008-03-12 01:18 yyq 阅读(5882) 评论(28)  编辑  收藏 所属分类: 编程

评论

# re: 做了个Java表达式计算器 2008-03-12 04:25 李敏
能不能够发个低版本的,我的机器上是JRE1.5的,如果没有用到新特性,可以尽量向下兼容否?  回复  更多评论
  

# re: 做了个Java表达式计算器[未登录] 2008-03-12 09:00 xxx
能提供代码吗 想研究下 hcqenjoy@gmail.com  回复  更多评论
  

# re: 做了个Java表达式计算器[未登录] 2008-03-12 09:38 h
其实用Groovy来直接做这个事会更好。  回复  更多评论
  

# re: 做了个Java表达式计算器 2008-03-12 12:28 yyq
@李敏
更新了一下,应该可以兼容1.5了。  回复  更多评论
  

# re: 做了个Java表达式计算器 2008-03-12 12:28 lvq810
import java.util.regex.*;
import java.util.*;
/**
*利用正则式计算表达式的值
*@author: Eastsun
*@version: 0.5 07.2.26
*/
public class Calculate{
public static final String NUM_PATTERN = //数字的匹配模式
"(?:(?<=[\\+\\-\\*\\(/]|^)[+-]|)" //前缀判断,判断前面的+-是否为符号
+"(?:" //数字及小数点部分, 0. 以及 .0 都是合法的数字
+"(?:\\d*\\.)?\\d+|" //.0 的情形
+"\\d+(?:\\.\\d*)?" //0. 的情形
+")"
+"(?!\\d|\\.)"; //边界条件
public static final String BRA_PATTERN =
"\\((NUM)\\)".replace("NUM",NUM_PATTERN);
public static final String ADD_PATTERN =
"(NUM)\\+(NUM)".replace("NUM",NUM_PATTERN);
public static final String SUB_PATTERN =
"(NUM)-(NUM)".replace("NUM",NUM_PATTERN);
public static final String MUL_PATTERN =
"(NUM)\\*(NUM)".replace("NUM",NUM_PATTERN);
public static final String DIV_PATTERN =
"(NUM)/(NUM)".replace("NUM",NUM_PATTERN);
public static final Pattern BRA =Pattern.compile(BRA_PATTERN);
public static final Pattern ADD_OR_SUB =Pattern.compile("(?<=[^\\+\\-\\*/]|^)(?:"+ADD_PATTERN+"|"+SUB_PATTERN+")(?=[^\\*/]|$)");
public static final Pattern MUL_OR_DIV =Pattern.compile("(?<![\\*/])(?:"+MUL_PATTERN+"|"+DIV_PATTERN+")");

private static double operator(Matcher m,int index){
index =index*2;
double a,b;
if(m.group(1)!=null){
a =Double.parseDouble(m.group(1));
b =Double.parseDouble(m.group(2));
}
else{
index ++;
a =Double.parseDouble(m.group(3));
b =Double.parseDouble(m.group(4));
}
double r =0.0;
switch(index){
case 0:
r =a+b;
break;
case 1:
r =a-b;
break;
case 2:
r =a*b;
break;
case 3:
r =a/b;
break;
}
return r;
}
public static double eval(String str){
StringBuilder sb =new StringBuilder(str.replaceAll("\\s+",""));
while(true){
Matcher m =BRA.matcher(sb);
if(m.find()){
sb.replace(m.start(),m.end(),m.group(1));
}
else{
int index =1;
m =MUL_OR_DIV.matcher(sb);
if(!m.find()){
index --;
m =ADD_OR_SUB.matcher(sb);
if(!m.find()) break;
}
sb.replace(m.start(),m.end(),""+operator(m,index));
}
}
return Double.parseDouble(sb.toString());
}
public static void main(String[] args){
Scanner scan =new Scanner(System.in);
while(true){
System.out.print("\nEnter a expression :");
String str =scan.next();
if(str.equals("exit")) break;
System.out.print(str +" = "+eval(str));
}
}
}  回复  更多评论
  

# re: 做了个Java表达式计算器[未登录] 2008-03-14 01:26 李敏
感谢兄弟照顾,提供了1.5版本的,不过有个不情之请,能不能发份源代码过来,我对这个很有兴趣,不过没有达到你的那种程序,你上面写的那个语法都看不懂- -!,所以想先看看代码怎么实现的。

email: onewalkingman@163.com  回复  更多评论
  

# re: 做了个Java表达式计算器 2008-03-14 19:43 木风口子
相当好,我会好好向你学习的,做了如此复杂的!厉害!  回复  更多评论
  

# re: 做了个Java表达式计算器 2008-05-13 10:17 游客
楼主你好,我想请你把你的源代码发给我一份可以吗?我正在学这个,觉得你写的很好,非常非常的感谢你。。
zhouchen12345678910@yahoo.cn  回复  更多评论
  

# re: 做了个Java表达式计算器 2008-05-26 11:52 gjz
你好,能不能研究一下源码,guanjinzhu92@163.com  回复  更多评论
  

# re: 做了个Java表达式计算器 2008-07-28 00:42 yyq
代码大部分是用工具生成的,而且有二进制文件,感觉光有代码没什么研究价值,不过整理后会提供下载的(最近一直无心弄这个了,sorry)。  回复  更多评论
  

# re: 做了个Java表达式计算器 2008-07-29 00:06 yyq
source(部分)可以下载了。  回复  更多评论
  

# re: 做了个Java表达式计算器 2008-12-07 10:31 sqkobe108
感谢,非常感谢,花了好长时间终于找到怎样解决表达式计算器的问题了。你这个做的很好!!!  回复  更多评论
  

# re: 做了个Java表达式计算器 2009-05-21 15:31 xiaohutu611
可以提供完整的源代码学习一下吗?
731001587@qq.com  回复  更多评论
  

# re: 做了个Java表达式计算器 2009-05-28 00:50 黑妹
我也很感兴趣,可是没有达到作者这个水平,想研究源代码,可以也发给我吗?非常感谢,我很渴望得到源代码,呵呵
501769230@QQ.com  回复  更多评论
  

# re: 做了个Java表达式计算器 2009-11-12 09:53 benq
请问ExpressionData.pd文件是做什么用的,是表达式经过与处理后的一个中间状态吗?  回复  更多评论
  

# re: 做了个Java表达式计算器 2009-12-27 21:18 yyq
@benq
ExpressionData.pd 是我自己写的语法分析器用到的文件。。。。。  回复  更多评论
  

# 发现一个严重问题 2010-07-05 19:31 changeYi
很明显,这个程序虽然看起来不错,但是一个很关键的问题:在表达式输入框中无法输入等号,这使表达式编辑框与按钮框不能独立出来!等于说表达式输入框属于额外付出!!  回复  更多评论
  

# re: 做了个Java表达式计算器 2010-07-11 22:47 yyq
两个黄鹂鸣翠柳
  回复  更多评论
  

# re: 做了个Java表达式计算器 2010-08-19 10:51 刘德
请问 这两个文件是怎么生成的
ExpressionScanner.sd
ExpressionData.pd
你有ExpressionScanner.class的源代码吗?
可以发给我吗909030452@qq.com
谢谢!  回复  更多评论
  

# re: 做了个Java表达式计算器[未登录] 2010-09-05 00:12 yyq
@刘德
ExpressionScanner.sd
ExpressionData.pd 是我自己写的分析器生成器自动生成的,光有源代码没意义的,因为那个源代码根本不能手动修改,如果你想修改语法我倒是可以重新生成一个给你。。。。  回复  更多评论
  

# re: 做了个Java表达式计算器 2011-02-12 17:15 胡迪新
能不能提供一个完整的源代码 谢谢了
现在急需
cashhu@126.com  回复  更多评论
  

# re: 做了个Java表达式计算器[未登录] 2011-06-23 21:35 luhang
楼主能把源代码给我吗 我正在写计算表达程序 遇到很多问题
1021044@qq.com  回复  更多评论
  

# re: 做了个Java表达式计算器[未登录] 2011-06-23 21:38 luhang
楼主能把源代码发给我吗 我正在写关于表达式的作业 遇到很多问题
1021044@qq,com  回复  更多评论
  

# re: 做了个Java表达式计算器 2011-07-02 11:46 大起大落
代码好乱呀菜鸟不明白  回复  更多评论
  

# re: 做了个Java表达式计算器 2012-09-03 15:18 zhozicho
@yyq你好,
ExpressionScanner.sd
ExpressionData.pd 这俩个文件是怎么生成的,我急需原理  回复  更多评论
  

# re: 做了个Java表达式计算器 2012-11-14 20:44 yyq
@zhozicho
写的工具生成的,基本原因是正规式和有限状态机,细节就非一两句能说清了  回复  更多评论
  

# re: 做了个Java表达式计算器 2013-04-03 11:18 啊啊啊啊啊
(1+(2*2)+2+5.3)*8.5结果都会是104.55000000000001  回复  更多评论
  

# re: 做了个Java表达式计算器[未登录] 2013-05-10 21:31
你好,可以给发这个项目吗?381803426@qq.com
谢谢了,急  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: