`
gao_20022002
  • 浏览: 164827 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

自己处理公式

    博客分类:
  • Java
阅读更多

问题说明:

给定一个字符串,例如:

String gsstring = "3565767 + 276756 * 76764 - 76 / 2 + 1";

 如何将其当作数字运算,即相当于:

int gsint = 3565767 + 276756 * 76764 - 76 / 2 + 1;

 我们如何来解析这样一个简单的公式(当前没有括号参与操作 )。

 

第一步:将此字符串变换为字节数组,将问题转换为针对字节数组的处理。

byte[] b = gsstring.getBytes();

第二步:编写工具方法。

    1、判定一个字节是否为数字。

final public static boolean isdig(byte ch) {
		return ch >= '0' && ch <= '9';
}

    2、将所有的数字字节整理为一个真实的数字。

final public static int dig(byte[] b) {
		int record = 0;
		for (int i = 0; i < b.length; i++) {
			record = record * 10 + (b[i] - '0');
		}
		return record;
}

    3、将字节表示的符号转换为真正的运算操作。

	final public static int calc(int record1, int record2, byte oper) {
		int record = 0;
		switch (oper) {
		case '+':
			record = record1 + record2;
			break;
		case '-':
			record = record1 - record2;
			break;
		case '*':
			record = record1 * record2;
			break;
		case '/':
			record = record1 / record2;
			break;
		default:
			break;
		}
		return record;
}

第三步:解析字节数组,将其记录为一个数字的集合以及一个符号的集合。

final public static Vector parse(byte[] b) {
		Vector v = new Vector();
		Vector dig = new Vector();
		Vector sgn = new Vector();
		byte[] bb = null;
		int size, j, k;
		for (int i = 0; i < b.length; i++) {
			size = 0;
			if (isdig(b[i])) {
				j = i;
				do {
					size++;
					j++;
				} while (j < b.length && isdig(b[j]));
				bb = new byte[size];
				j = i;
				k = 0;
				do {
					bb[k] = b[j];
					k++;
					j++;
				} while (j < b.length && isdig(b[j]));
				i = i + size - 1;
				dig.add(new Integer(dig(bb)));
			} else {
				sgn.add(Byte.valueOf(b[i]));
			}
		}
		v.add(sgn);
		v.add(dig);
		return v;
}

第四步:操作得到的结果。

提供思路:这种公式的特点是数字集合总是比符号集合多1,并且都是按照顺序存储的(现在采取的方案是这样)。所以,根据先乘除后加减原则,检索符号集合中的乘除后再检索加减,数字集合位置索引与符号索引之间存在对应关系,不难发现的。

增加处理:

public static int test(String gs) {
		byte[] b = dealByte(gs.getBytes());
		Vector v = parse(b);
		Vector sgn = (Vector) v.elementAt(0);
		Vector dig = (Vector) v.elementAt(1);
		while (sgn.size() != 0) {
			for (int i = 0; i < sgn.size(); i++) {
				if ('*' == ((Byte) sgn.elementAt(i)).byteValue()
						|| '/' == ((Byte) sgn.elementAt(i)).byteValue()) {
					operate(sgn, dig, i);i--;
				}
			}
			for (int i = 0; i < sgn.size(); i++) {
				if ('+' == ((Byte) sgn.elementAt(i)).byteValue()
						|| '-' == ((Byte) sgn.elementAt(i)).byteValue()) {
					operate(sgn, dig, i);i--;
				}
			}
		}
		return ((Integer) dig.elementAt(0)).intValue();
}


static private void operate(Vector sgn, Vector dig, int index) {
		int value = calc(((Integer) dig.elementAt(index)).intValue(),
				((Integer) dig.elementAt(index + 1)).intValue(), ((Byte) sgn
						.elementAt(index)).byteValue());
		sgn.remove(index);
		dig.setElementAt(new Integer(value), index);
		dig.remove(index + 1);
}

此方式完全应用了算式的特点,加入括号处理相对复杂。

如何扩展加入(){}[],变得更强大一点??思考

OK。

 

3
0
分享到:
评论
1 楼 timelyRain 2008-12-17  
你是为了研究语法分析 词法分析还是为了制作一个工具方法?

仅仅使用的话可以用脚本引擎来处理。beanshell

相关推荐

    通达信缠论分笔k线包含处理新笔公式

    通达信缠论分笔k线包含处理新笔公式是一款专为通达信交易平台设计的技术分析工具,旨在帮助投资者理解和应用缠论理论进行市场分析。缠论,由缠中说禅提出,是一种基于价格和时间的股票、期货市场的分析方法,强调了...

    数学公式图像处理综述

    ### 数学公式图像处理综述 #### 一、引言 数学公式作为科学和技术领域中的重要组成部分,在学术交流和科学研究中扮演着不可或缺的角色。随着数字化时代的到来,如何高效准确地处理数学公式图像成为了一个亟待解决...

    C#字符串计算公式处理

    在C#编程中,字符串计算公式处理是一种常见的需求,特别是在财务、数据分析和其他需要动态计算的领域。例如,我们可能需要根据给定的公式来计算员工的工资,如:"基本工资+奖金-保险-个税"。这个公式表示工资是基础...

    公式数学公式数学公式数学公式数学公式

    倍角公式和半角公式则方便我们处理角的一半或两倍的三角函数值。 在数列部分,我们有等差数列的求和公式1 + 2 + 3 + ... + n = n(n + 1)/2,等比数列的求和公式1 + 3 + 5 + ... + (2n - 1) = n²,以及1² + 2² + ...

    python处理公式.docx

    Python 作为一种功能强大的高级编程语言,对于处理数学公式有着丰富的支持。在Python中,我们可以借助于专门处理数学计算的库来解决复杂的数学问题。这里主要介绍两个常用的库:NumPy和SymPy。 NumPy,全称Numeric ...

    污水厂处理设计计算公式

    在污水处理领域,设计计算公式是至关重要的,它们用于确保污水厂能够有效、经济地处理废水,达到环保标准。"污水厂处理设计计算公式"这个主题涵盖了多种计算方法和理论,这些方法和理论在构筑物设计计算中发挥着关键...

    LaTeX公式转化处理工具.

    LaTeX公式转化处理工具.,可以将LaTeX数学公式转成图片

    原创通达信版 缠论K线包含公式.doc

    缠论K线包含公式是指将K线图表中的包含关系进行标记和处理,以便更好地分析和判断市场的走势。该公式可以将K线图表中的包含关系分为四种类型,即向上左包含、向上右包含、向下左包含和向下右包含。通过使用该公式,...

    word复杂公式公式编辑器

    Word中的公式编辑器是专为处理数学、物理和工程领域中复杂公式的工具,它可以极大地提升用户在Word文档中创建和编辑专业级公式的效率。这个"word复杂公式公式编辑器"显然是一款针对这一需求设计的软件,它包含了丰富...

    PHP word解析数学公式

    // 处理每个公式和图片... ``` 在实际项目中,开发者可能需要根据具体需求对上述代码进行扩展,例如将公式转换为图像,或将图片上传到云存储服务。总之,PHP提供了足够的灵活性和工具来处理Word文档中的各种元素...

    易语言高级表格置累加公式和置计算公式应用

    此外,易语言支持自定义函数和子程序,因此在处理复杂计算时,开发者可以创建自己的函数来实现特定的计算逻辑,然后在计算公式中调用这些函数。这增加了代码的复用性和可读性。 为了实现这些功能,开发者可能使用了...

    CHATGPT无法正确显示数学公式问题解决

    ChatGPT可能依赖于MathJax或其他类似的库来处理LaTeX公式。 二、检查LaTeX语法 确保输入的LaTeX代码符合标准的LaTeX语法。例如,一个简单的数学公式应该用反斜杠`\`包围,并使用特定命令来定义上下标、希腊字母等。...

    股票公式宝盒,股票公式宝盒 下载,C,C++

    用户可以查看和理解这些公式的实现逻辑,甚至根据自己的需求进行修改和定制,创造出更适合自己的分析工具。这不仅增强了用户的自定义能力,也为技术分析提供了无限的可能性。 此外,"比克尔.url"可能是一个链接文件...

    Gouy磁天平法测定物质磁化率实验数据处理公式的讨论.pdf

    《Gouy磁天平法测定物质磁化率实验数据处理公式的讨论》这篇论文主要探讨了使用Gouy磁天平法测定物质磁化率时的数据处理公式,并对其进行了深入的理论分析。磁化率是衡量物质在磁场中磁化程度的一个物理量,对于理解...

    公式计算器(可自定义公式)

    而“公式计算器”则是一种特定类型的计算器,它不仅仅局限于基础运算,更多的是强调对公式的处理能力,对于需要处理复杂数学表达式的用户而言,它无疑是一种重要的工具。 此外,我们还注意到在文件名称列表中提及了...

    java 公式解析源码

    Java公式解析源码是用于处理数学、统计或业务逻辑中的表达式解析的代码库。它允许用户自定义公式,使得程序能够动态计算基于特定输入的数据。在Java开发中,这样的库通常用于财务软件、数据分析应用或者任何需要进行...

    UEditor公式编辑器 UEditor、mathquill集成公式编辑器

    通过研究源码,开发者可以学习到如何将MathQuill与UEditor结合,以及如何处理公式编辑器的事件监听、数据交互和样式渲染等问题。 6. **Integration and Customization**:UEditor公式编辑器的集成与自定义是关键。...

    基于纯js脚本的数学公式计算源码

    【描述】:描述中提到的“基于纯js脚本的数学公式计算工具”是一个能够处理和计算复杂数学公式的客户端解决方案。它适用于生成报表和进行公式运算,尤其是在需要实时计算和展示数据的场景下。在网页报表中,这样的...

    word公式编辑器3.0

    Word公式编辑器3.0是Microsoft Word中一个强大的插件,专为处理数学、物理、化学等领域的专业公式而设计。这款编辑器使得用户能够轻松地在文档中创建、编辑和排版复杂的数学表达式,极大地提升了撰写学术论文、教材...

Global site tag (gtag.js) - Google Analytics