- 浏览: 137961 次
文章分类
最新评论
-
qiaolevip:
求源码:qiaole@vip.qq.com
使用JAVA中的动态代理实现数据库连接池 -
qiaolevip:
使用JAVA中的动态代理实现数据库连接池 -
qiaolevip:
:ro ll:
使用JAVA中的动态代理实现数据库连接池 -
qp7711:
那这里是在哪里传参的?
通用分页实现及其OO设计探讨——转载 -
yaoaijia:
源码怎么都没有啊?
使用JAVA中的动态代理实现数据库连接池
前几天要做一个计算数学表达式的题目,本来计划使用解析表达式的方法来解析各种数学表达式,然后再动态计算表达式的值.后来考虑到这样编程的任务很重,时间有限 后来在网上搜搜,看到使用动态编译并使用反射机制 ,这样计算表达式的编程就容易多了.下面是我这次编程的例子, 请大家看看.
java 代码
- /*
- 02 * Created on 2006-3-8
- 03 * @author icerain 我的Blog: http://blog.matrix.org.cn/page/icess
- 04 */
- 05
- 06 public interface IOperator {
- 07 String SIN = "sin";
- 08 String COS = "cos";
- 09 String TAN = "tan";
- 10 String ASIN = "asin";
- 11 String ACOS = "acos";
- 12 String ATAN = "atan";
- 13 String EXP = "exp";
- 14 String LOG = "log";
- 15 String POW = "pow";
- 16 String SQRT = "sqrt";
- 17 String FABS = "fabs";
- 18 String MINUS = "minus";
- 19
- 20 String J_SIN = "Math.sin";
- 21 String J_COS = "Math.cos";
- 22 String J_TAN = "Math.tan";
- 23 String J_ASIN = "Math.asin";
- 24 String J_ACOS = "Math.acos";
- 25 String J_ATAN = "Math.atan";
- 26 String J_EXP = "Math.exp";
- 27 String J_LOG = "Math.log10";
- 28 String J_POW = "Math.pow";
- 29 String J_SQRT = "Math.sqrt";
- 30 String J_FABS = "Math.abs";
- 31
- 32 }
- 定义一个接口, 用来转换各种数学符号为Java类库中的表达式.
- 下面是用来计算的代码.
- 001 /*
- 002 * Created on 2006-3-7
- 003 * @author icerain 我的Blog: http://blog.matrix.org.cn/page/icess
- 004 */
- 005 //package hust.icess.simpson;
- 006
- 007
- 008 import java.util.logging.Level;
- 009
- 010 import java.io.*;
- 011 import java.lang.reflect.Method;
- 012 import java.util.Scanner;
- 013 import java.util.logging.Logger;
- 014
- 015
- 016 import com.sun.tools.javac.*;
- 017 /**
- 018 * 利用Simpson公式计算积分,在输入被积公式时候请注意使用如下格式.
- 019 * 1.只使用圆括号() , 没有别的括号可以使用.如: 1/(1+sin(x))
- 020 * 2.在输入超越函数的时候,变量和数值用括号扩起来 如:sin(x) 而不要写为 sinx
- 021 * 3.在两个数或者变量相乘时候,不要省略乘号* 如:2*a 不要写为 2a
- 022 * 4.在写幂运算的时候,请使用如下格式:
- 023 * 利用动态编译来计算Simpson积分,使用该方法 编程相对简单,运行效率有点慢.
- 024 * @author icerain
- 025 *
- 026 */
- 027 public class Simpson implements IOperator {
- 028 /**
- 029 * Logger for this class
- 030 */
- 031 private static final Logger logger = Logger.getLogger(Simpson.class
- 032 .getName());
- 033
- 034 private String expression = null;
- 035
- 036 private String variable = null;
- 037
- 038 private String[] variableValue = new String[3];
- 039
- 040 // private static Main javac = new Main();
- 041
- 042 /**主函数 */
- 043 public static void main(String[] args) throws Exception {
- 044 Simpson sim = new Simpson();
- 045 System.out.println("结果如下:");
- 046 System.out.print(sim.getSimpsonValue());
- 047 System.exit(0);
- 048
- 049 }
- 050
- 051 public Simpson() {
- 052 logger.setLevel(Level.WARNING);
- 053 init();
- 054 }
- 055
- 056 /** 初始化用户输入,为技术Simpson积分做准备. */
- 057 private void init() {
- 058 Scanner scanner = new Scanner(System.in);
- 059 System.out.println("请输入函数表达式 如 1+sin(a) + cos(a)/a :");
- 060 // String input = scanner.nextLine();
- 061 //读入被积函数的表达式
- 062 expression = scanner.nextLine().trim().toLowerCase();
- 063 System.out.println("请输入变量字符 如 a :");
- 064 //读入变量字符
- 065 variable = scanner.nextLine().trim().toLowerCase();
- 066
- 067 //处理多元函数 目前不实现该功能
- 068 // String[] tempVars = tempVar.split(" ");
- 069 // for(int i = 0; i < tempVars.length; i ++) {
- 070 // variable[i] = tempVars[i];
- 071 // }
- 072
- 073 System.out.println("请输入积分区间和结点数 如 2 5.4 10 :");
- 074 //读取复合Simpson公式的积分参数
- 075 String tempValue = scanner.nextLine().trim();
- 076 String[] tempValues = tempValue.split(" ");
- 077 for (int i = 0; i < tempValues.length; i++) {
- 078 variableValue[i] = tempValues[i];
- 079 }
- 080
- 081 }
- 082
- 083 /** 计算 Simpson积分的值*/
- 084 public double getSimpsonValue() {
- 085 //保存中间结果
- 086 double value1 = 0;
- 087 double value2 = 0;
- 088 double tempValue = 0;
- 089 int i = 0;
- 090 // 解析输入的积分参数值
- 091 int n = Integer.parseInt(variableValue[2]);
- 092 double a = Double.parseDouble(variableValue[0]);
- 093 double b = Double.parseDouble(variableValue[1]);
- 094 double h = (b - a) / n;
- 095 //计算value1
- 096 for (i = 0; i < n; i++) {
- 097 tempValue = a + (i + 0.5) * h;
- 098 String code = getSourceCode(expression, getVariable(), Double
- 099 .toString(tempValue));
- 100 try {
- 101 value1 += run(compile(code));
- 102 } catch (Exception e) {
- 103 // TODO Auto-generated catch block
- 104 e.printStackTrace();
- 105
- 106 if (logger.isLoggable(Level.INFO)) {
- 107 logger.info("something is wrong");
- 108 }
- 109 }
- 110 }
- 111 //计算value2
- 112 for (i = 1; i < n; i++) {
- 113 tempValue = a + i * h;
- 114 String code = getSourceCode(expression, getVariable(), Double
- 115 .toString(tempValue));
- 116 try {
- 117 value2 += run(compile(code));
- 118 } catch (Exception e) {
- 119 // TODO Auto-generated catch block
- 120 e.printStackTrace();
- 121 if (logger.isLoggable(Level.INFO)) {
- 122 logger.info("something is wrong");
- 123 }
- 124 }
- 125 }
- 126
- 127 //计算f(a) f(b) 的函数值
- 128 double valueA = getFunctionValue(a);
- 129 double valueB = getFunctionValue(b);
- 130 //计算Simpson公式的值
- 131 double resultValue = (valueA + valueB + 4 * value1 + 2 * value2) * h / 6;
- 132
- 133 return resultValue;
- 134 }
- 135
- 136 //计算F(a) 的值
- 137 private double getFunctionValue(double varValue) {
- 138 String code = getSourceCode(expression, getVariable(), Double
- 139 .toString(varValue));
- 140 double result = 0;
- 141 try {
- 142 result = run(compile(code));
- 143 } catch (Exception e) {
- 144 // TODO Auto-generated catch block
- 145 e.printStackTrace();
- 146 if (logger.isLoggable(Level.INFO)) {
- 147 logger.info("something is wrong");
- 148 }
- 149 }
- 150 return result;
- 151 }
- 152
- 153 /**
- 154 * 得到用户输入表达式转换为Java中的可计算表达式的函数
- 155 * @param ex 输入的表达式 如: 1/(1 + sin(x))
- 156 * @param var 表达式中的变量 如: x
- 157 * @param value 变量的取值 如: 4.3
- 158 * @return Java中可以直接计算的表达式 如: 1/(1 + Math.sin(x))
- 159 */
- 160 private String getSourceCode(String ex, String var, String value) {
- 161 String expression = ex;
- 162 //计算多个变量的函数的时候使用
- 163
- 164 expression = expression.replaceAll(var, value);
- 165
- 166 //处理数学符号
- 167 if (expression.contains(SIN)) {
- 168 expression = expression.replaceAll(SIN, J_SIN);
- 169 } else if (expression.contains(COS)) {
- 170 expression = expression.replaceAll(COS, J_COS);
- 171 } else if (expression.contains(TAN)) {
- 172 expression = expression.replaceAll(TAN, J_TAN);
- 173 } else if (expression.contains(ASIN)) {
- 174 expression = expression.replaceAll(ASIN, J_ASIN);
- 175 } else if (expression.contains(ACOS)) {
- 176 expression = expression.replaceAll(ACOS, J_ACOS);
- 177 } else if (expression.contains(ATAN)) {
- 178 expression = expression.replaceAll(ATAN, J_ATAN);
- 179 } else if (expression.contains(EXP)) {
- 180 expression = expression.replaceAll(EXP, J_EXP);
- 181 } else if (expression.contains(LOG)) {
- 182 expression = expression.replaceAll(LOG, J_LOG);
- 183 } else if (expression.contains(POW)) {
- 184 expression = expression.replaceAll(POW, J_POW);
- 185 } else if (expression.contains(SQRT)) {
- 186 expression = expression.replaceAll(SQRT, J_SQRT);
- 187 } else if (expression.contains(FABS)) {
- 188 expression = expression.replaceAll(FABS, J_FABS);
- 189 }
- 190
- 191 return expression;
- 192 }
- 193
- 194 /** 编译JavaCode,返回java文件*/
- 195 private synchronized File compile(String code) throws Exception {
- 196 File file;
- 197 // 创建一个临时java源文件
- 198 file = File.createTempFile("JavaRuntime", ".java", new File(System
- 199 .getProperty("user.dir")));
- 200 if (logger.isLoggable(Level.INFO)) {
- 201 logger.info(System.getProperty("user.dir"));
- 202 }
- 203 // 当Jvm 退出时 删除该文件
- 204 file.deleteOnExit();
- 205 // 得到文件名和类名
- 206 String filename = file.getName();
- 207 if (logger.isLoggable(Level.INFO)) {
- 208 logger.info("FileName: " + filename);
- 209 }
- 210 String classname = getClassName(filename);
- 211 // 将代码输出到源代码文件中
- 212 PrintWriter out = new PrintWriter(new FileOutputStream(file));
- 213 // 动态构造一个类,用于计算
- 214 out.write("public class " + classname + "{"
- 215 + "public static double main1(String[] args)" + "{");
- 216 out.write("double result = " + code + ";");
- 217 //用于调试
- 218 //out.write("System.out.println(result);");
- 219 out.write("return new Double(result);");
- 220 out.write("}}");
- 221 //关闭文件流
- 222 out.flush();
- 223 out.close();
- 224 //设置编译参数
- 225 String[] args = new String[] { "-d", System.getProperty("user.dir"),
- 226 filename };
- 227 //调试
- 228 if (logger.isLoggable(Level.INFO)) {
- 229 logger.info("编译参数: " + args[0]);
- 230 }
- 231 //Process process = Runtime.getRuntime().exec("javac " + filename);
- 232 int status = Main.compile(args);
- 233 //输出运行的状态码.
- 234 // 状态参数与对应值
- 235 // EXIT_OK 0
- 236 // EXIT_ERROR 1
- 237 // EXIT_CMDERR 2
- 238 // EXIT_SYSERR 3
- 239 // EXIT_ABNORMAL 4
- 240 if (logger.isLoggable(Level.INFO)) {
- 241 logger.info("Compile Status: " + status);
- 242 }
- 243 //System.out.println(process.getOutputStream().toString());
- 244 return file;
- 245 }
- 246
- 247 /**
- 248 * 运行程序 如果出现Exception 则不做处理 抛出!
- 249 * @param file 运行的文件名
- 250 * @return 得到的Simpson积分公式的结果
- 251 * @throws Exception 抛出Exception 不作处理
- 252 */
- 253 private synchronized double run(File file) throws Exception {
- 254 String filename = file.getName();
- 255 String classname = getClassName(filename);
- 256 Double tempResult = null;
- 257 // System.out.println("class Name: " +classname);
- 258 //当Jvm 退出时候 删除生成的临时文件
- 259 new File(file.getParent(), classname + ".class").deleteOnExit();
- 260 try {
- 261 Class cls = Class.forName(classname);
- 262 //System.out.println("run........");
- 263 // 映射main1方法
- 264 Method calculate = cls
- 265 .getMethod("main1", new Class[] { String[].class });
- 266 //执行计算方法 得到计算的结果
- 267 tempResult = (Double) calculate.invoke(null,
- 268 new Object[] { new String[0] });
- 269 } catch (SecurityException se) {
- 270 System.out.println("something is wrong !!!!");
- 271 System.out.println("请重新运行一遍");
- 272 }
- 273 //返回值
- 274 return tempResult.doubleValue();
- 275 }
- 276
- 277 /** 调试函数*/
- 278 // private void debug(String msg) {
- 279 // System.err.println(msg);
- 280 // }
- 281
- 282 /** 得到类的名字 */
- 283 private String getClassName(String filename) {
- 284 return filename.substring(0, filename.length() - 5);
- 285 }
- 286
- 287
- 288 //getter and setter
- 289 public String getExpression() {
- 290 return expression;
- 291 }
- 292
- 293 public void setExpression(String expression) {
- 294 this.expression = expression;
- 295 }
- 296
- 297 public String getVariable() {
- 298 return variable;
- 299 }
- 300
- 301 public void setVariable(String variable) {
- 302 this.variable = variable;
- 303 }
- 304
- <spa>
发表评论
-
FileUtils_下载小应用
2009-06-15 13:09 1297FileExportUtils import java.io ... -
Javaz统计中英文个数__解决技巧[20070924]
2009-02-22 21:04 1268import java.util.ArrayList; imp ... -
JAVA模式--看守者模式的小应用
2008-12-03 14:50 1151好久没写了,随便写点东西,不然脑袋都得大掉,还希望 ... -
POI操作excel示例工具类
2008-07-04 09:29 2988由于近期项目要用到excel来转存页面中的表单数据,对poi操 ... -
JAXP解析XML+XSL转换过程
2007-11-21 19:36 15741. 在解析的过程中,此版本用dom4j解析 ... -
通用分页实现及其OO设计探讨——转载
2007-11-10 11:34 1533分页是一种常用的页面数据显示技术,分页能够通过减少页面数据处理 ... -
EJB入门
2007-10-29 18:50 1311java 代码 package com.test ... -
String与StringBuffer
2007-10-29 11:11 1506String的创建 String s = "he ... -
linux下安装jdk和eclipse之java环境
2007-10-18 10:34 41581、去http://java.sun.com/j2se/1.4 ... -
使用JAVA中的动态代理实现数据库连接池
2007-08-16 13:40 1406级别: 初级 刘冬 (winter.lau@163.com), ... -
for循环的效率疑问
2007-07-18 13:29 2509编写代码的时候,突然想到 java 代码 java 代码 ...
相关推荐
这篇博客“Java实现计算字符串表达式”可能讲解了如何利用Java来处理这种问题,虽然具体的实现细节没有提供,但我们可以基于一般的方法和常用的库来探讨这个主题。 首先,计算字符串表达式的基本步骤通常包括以下几...
在Android开发中,有时我们需要处理复杂的数学计算,例如解析和计算数学表达式。为了提高性能,我们可以使用Native Development Kit (NDK) 和Java Native Interface (JNI) 来实现。本教程将详细介绍如何通过NDK和JNI...
在这个“java 写的 用优先函数分析 数学表达式的程序”中,我们将深入探讨如何使用Java来解析和计算数学表达式,以及涉及的编译原理知识。 首先,我们需要理解什么是数学表达式分析。在计算机科学中,解析数学...
《QLEXPRESS Java表达式解析与应用》 在Java编程中,表达式扮演着至关重要的角色,它们是程序逻辑的基础。...通过深入理解和熟练运用QLEXPRESS,我们能够更好地利用Java表达式的威力,提升软件的可维护性和可扩展性。
"编译原理表达式计算器"是一个基于C#编程语言实现的计算工具,它能够处理包含加、减、乘、除、括号以及取负等基本数学运算的表达式。这个程序利用了编译原理中的核心概念,如词法分析和算符优先分析,来解析并计算...
3. **配置中心**:在微服务架构中,服务的配置可以通过Aviator表达式动态设定,提高配置的灵活性。 4. **脚本语言替代**:对于一些简单的脚本需求,Aviator可以作为Java的轻量级替代方案。 总的来说,Aviator作为...
本文将深入探讨一个基于Java实现的表达式计算器项目,旨在帮助开发者理解如何在Java环境中设计和实现一个能解析并计算数学表达式的程序。 首先,我们来看“java实现的表达式计算器”这个标题,它揭示了我们的任务是...
ExpGen利用了Java的强大功能,实现了数学表达式的动态生成。在数学表达式生成方面,ExpGen可能包含以下核心特性: 1. **随机数生成**:ExpGen能够生成随机的数值,包括整数和浮点数,这些数值可以作为表达式的一...
PARSII可能提供了诸如表达式树、令牌解析、语法分析等技术,这些都是编译原理中的概念,用于将字符串形式的数学表达式转化为可执行的计算步骤。它可能还包括错误处理机制,当用户输入的表达式有误时,能够提供清晰的...
`Calculate.java`可能实现了一个解析器,这个解析器使用正则表达式将输入的数学表达式转换为可执行的形式。解析过程中,可能包括以下几个步骤: 1. **预处理**:清理输入,去除无关的空格和符号,处理括号以确保...
总之,这个基于Java的计算器表达式分析器项目涵盖了编译原理的核心概念,通过词法分析和语法分析,实现了对数学表达式的有效处理。开发者可以利用这个工具来学习编译器设计,或者将其整合到自己的应用程序中,以处理...
本项目旨在通过实现一个能够处理数学表达式的计算器小程序,深化对编译原理的理解,并熟练掌握相关编程技巧。特别是,该程序强调了优先级算法的实现以及对负数计算的支持,这两大特性不仅体现了程序设计的复杂性,也...
在0.9版本中,它提供了强大的动态计算功能,使得开发者能够在运行时评估复杂的逻辑和数学表达式。这个版本的发布,旨在提升应用程序的灵活性,特别是对于那些需要动态数据处理和决策逻辑的应用场景。 Fel引擎的核心...
中缀表达式是我们日常生活中常见的数学表达式形式,比如2 + 3 * 4,其中运算符位于操作数之间。而后缀表达式,也称为逆波兰表示法,将运算符置于操作数之后,如2 3 4 * +,它在计算时无需括号,通过栈数据结构即可...
在实现这个计算器程序的过程中,你将学习到如何在命令行下与用户交互,如何解析和处理复杂的数学表达式,以及如何在Java中实现错误处理。这是一项有助于提升你编程技能的练习,同时也会让你对Java的面向对象编程有更...
通过这个项目,开发者可以深入理解Java编程、GUI设计、事件处理以及数学表达式的解析与计算。无论是对于初学者还是有经验的程序员,这样的练习都能提供宝贵的学习机会,提升编程技能和问题解决能力。
Java解析公式库`eval.jar`是一个专门为Java开发者设计的开源工具,它允许程序在运行时动态解析和执行数学表达式。这个库的核心功能是提供一个简单、高效的接口,用于处理包含加法(+)、减法(-)、乘法(*)、除法...
无论是编程语言还是文本编辑器,广泛地利用正则表达式来实现高级的功能。 **1.1 正则表达式的起源与发展** 正则表达式的概念起源于20世纪50年代,由美国数学家斯蒂芬·科恩(Stephen Cole Kleene)提出,并在后来的...
后缀表达式实现的计算器是一种基于栈数据结构的计算工具,能够有效地解析和计算数学表达式。下面我们将深入探讨后缀表达式的原理、计算过程以及如何用源代码实现一个计算器。 1. 后缀表达式原理 后缀表达式是将...