`

Android画曲线之字符串运算

阅读更多

       最近想做一个画曲线工具,就是根据输入表达式(如:y=3*x ) 画曲线。首先遇到的问题是如何将字符串表达式运算求值,如这样一个表达式:   String    expression="1-(3*(5-3)+4/2)-3*cos(PI-PI/2)";如何运算呢?

       观察发现,每个括号()内都是一个小的表达式,首先要算出最小括号里的表达式值,才能运算较大括号里的表达式值,然后才能运算最大括号的表达式....最后才能运算整个表达式,这不就是递归么,跳出递归的条件是子表达式没有括号。 

直接上代码吧.

 

/**
 * 运算器
 * @author Saber
 *
 */
public class Calculator {

	//运算符
	private static  enum Operator{
		add,sub,mutip,div;		
		 public static Operator getOperator(String operator){
			if(operator.equals("+")){
				return add;
			}else
			if(operator.equals("-")){
				return sub;
			}else
			if(operator.equals("*")){
				return mutip;
			}else
			if(operator.equals("/")){
				return mutip;
			}
			return null;
		}
		
	}
	//函数
	private final String[] functions={"cos","sin"};
	//表达式变量
	private final String[] params={"x"};
	
	
	//递归计算
	public static float calculate(String expression){
		String  noBracketExp="";//无括号的表达式
		String  subExp="";//括号内的子表达式
		for(int i=0;i<expression.length();i++){
			String c=String.valueOf(expression.charAt(i));
			if("(".equals(c)){//遇到括号就递归
				int bracket=0;
				for(int j=i+1;j<expression.length();j++){
					i++;
					c=String.valueOf(expression.charAt(j));
					if(c.equals("("))bracket++;else if(c.equals(")")) bracket--;
					if(bracket==-1)break;
					subExp+=c;
				}
				noBracketExp+=calculate(subExp);
				subExp="";
			}else noBracketExp+=c;
		}
		
		return szys(noBracketExp);
	}
		
	//是否是乘除运算符
	private static boolean isMutipOrDivideOperator(String operator){
		return Operator.getOperator(operator)==Operator.mutip||Operator.getOperator(operator)==Operator.div;
	}
		
	//简单四则运算,输入的表达式没有括号
	private static float szys(String expression){
		expression=expression.replaceAll("\\-", "+-");
		String[] exps=expression.split("\\+");//视表达式为积之和
		float result=0;
		for(String exp:exps){
			result+=multipAndDivide(exp);
		}
		
		return result;
	}
	
	//乘除运算
	private static float multipAndDivide(String exp){
		exp+="*1";//因为遇到运算符才计算,所以多加一个运算符,不影响结果。
		String p1="";
		String p2="";
		String operator="";
		for(int i=0;i<exp.length();i++){
			String s=String.valueOf(exp.charAt(i));
			if(isMutipOrDivideOperator(s)){//乘除运算符
				operator=s;
				if(operator.length()>0&&p1.length()>0&&p2.length()>0){
					p1=szys(Float.valueOf(p1),operator,Float.valueOf(p2))+"";
					p2="";
				}
			}else if(operator.length()==0){
				p1+=s;
			}else{
				p2+=s;
			}
		}
		
		return Float.valueOf(p1);
	}
	
	//两个数进行四则运算
	private static float szys(float p1,String operator,float p2){
		if(operator.equals("+")){
			return p1+p2;
		}else if(operator.equals("-")){
			return p1-p2;
		}else if(operator.equals("*")){
			return p1*p2;
		}else if(operator.equals("/")){
			if(p2==0)return 0;else return p1/p2;
		}else return 0;
	}
	
	
	public static void main(String[] args){
		System.out.println(szys(10,"+",10));
		System.out.println(multipAndDivide("-3*3"));
		System.out.println(szys("10-2*2/2+4*2/2"));
		System.out.println(calculate("10-2*(5*2-2*(4-2)+4)+2"));
	}

	
	
}

 

 

以上没涉及函数计算,处理函数也简单,只需要判断括号前边字符串是否是函数,如果是就套入计算。

分享到:
评论

相关推荐

    Android字符串运算的计算器

    在Android平台上,开发一个能处理字符串运算的计算器是一项挑战性的任务。这个计算器应用程序允许用户输入一个完整的数学表达式,如 "2 + 3 * (4 - 5)",然后通过字符串解析和运算来得出结果。以下是一些关于实现...

    Android存储字符串数据到txt文件

    "Android存储字符串数据到txt文件" Android存储字符串数据到txt文件是Android开发中的一种常见需求,对于大多数开发者来说,存储字符串数据到txt文件是一种非常有用的功能。今天,我们将详细介绍如何在Android中...

    Matlab\字符串运算

    ### Matlab中的字符串运算 在Matlab这一强大的计算环境中,字符串处理是不可或缺的一部分,尤其是在涉及到文本数据的处理、分析以及各种编程需求时。本篇将基于提供的文件内容,深入探讨Matlab中字符串运算的相关...

    支持浮点数运算的字符串运算

    可支持浮点数与负数的字符串运算代码,可做收藏、学习、研究。

    Android relaceALL替换字符串中的反斜杠

    在Android开发中,有时我们需要对字符串进行操作,例如替换特定字符。`replaceAll`函数就是Java(也是Android)中处理字符串替换的一个重要方法。这个方法来自`String`类,允许我们用新的字符串替换掉原字符串中匹配...

    190402113737830_实验三 字符串运算及字符串格式化.pdf

    涉及到的几个关键主题包括转义字符、str对象的方法和属性、字符串编码、字符串的转义字符、字符串的运算和格式化方法、对象转换为字符串以及如何使用format函数来格式化字符串。 首先,文档强调了字符串的基本概念...

    android字符串和16进制转换

    在Android开发中,理解和操作字符串以及16进制数值是至关重要的技能,尤其是在处理数据传输、存储或解析二进制数据时。这篇文章将深入探讨如何在Android平台上进行字符串与16进制之间的转换。 首先,我们要明白...

    Android开发之EditText字符串过滤器InputFilter

    总之,Android的EditText字符串过滤器InputFilter是一个强大的工具,它允许开发者定制输入行为,提高应用的数据验证和用户体验。理解并熟练掌握InputFilter的使用,对于Android开发者来说是非常重要的技能之一。

    java中字符串运算

    g.drawString("字符串s1的长度为:"+n1,5,70); g.drawString("字符串s2的前缀是否为we? "+s2.startsWith("we"),5,90); String s3[]={"door","apple","Applet","girl","boy"}; g.drawString("s3=door,apple,Applet,...

    Android图片Bitmap和字符串String之间的相互转换

    在Android开发中,处理图像数据是一项常见的任务,而Bitmap和String是两个核心的数据类型,分别代表位图图像和文本字符串。Bitmap对象用于存储和显示图像,而String则常用于保存和传输文本信息。本篇文章将深入探讨...

    Delphi7字符串四则运算解析

    《Delphi7字符串四则运算解析》 在编程领域,Delphi7是一款经典的面向对象的集成开发环境(IDE),尤其适合开发Windows桌面应用程序。本文将深入探讨如何在Delphi7中实现字符串四则运算,这对于那些需要处理动态...

    Android常用字符串匹配正则

    isMobileSimple : 验证手机号(简单) isMobileExact : 验证手机号(精确) isTel : 验证电话号码 isIDCard15 : 验证身份证号码15位 isIDCard18 : 验证身份证号码18位 isEmail : 验证邮箱 isURL : 验证URL ...

    十六进制字符串按位异或运算工具和java位异或运算

    本节将详细介绍十六进制字符串的按位异或运算以及如何在Java中实现这一运算。 十六进制字符串是由0到9和A到F(或a到f)组成的字符序列,每个字符代表4位二进制数。例如,十六进制数"AB"在二进制下表示为10101011。...

    截取特定部分字符串

    在编程领域,特别是Android和Java开发中,经常需要处理字符串并从中截取特定部分。"截取特定部分字符串"这个话题涉及到字符串操作的基础知识,它包括查找字符串的开始位置、结束位置,然后提取这两个位置之间的子...

    Android-android执行字符串代码--实现接口可配置跳转任何Activity

    在Android应用开发中,有时我们需要根据特定的业务需求动态地执行字符串表示的代码,例如,通过接口配置来跳转到不同的Activity。这个场景通常出现在插件化开发、动态加载或运行时权限处理等复杂场景中。本文将详细...

    android的可变字符串使用例子

    在Android开发中,为了实现丰富的文本格式化,如加大、加粗、变小、更换颜色、增加超链接等效果,开发者通常会使用可变字符串(SpannableString)类。本篇将详细介绍Android中的可变字符串及其相关应用。 一、...

    Android 对 strings.xml 的字符串进行格式化

    在Android开发过程中,为了实现应用的国际化或多语言支持,开发者通常会使用`strings.xml`文件来存储各种字符串资源。这些字符串资源不仅可以被直接引用显示在界面上,还可以通过格式化的方式动态填充变量值,从而...

    android 判断字符串是否是日期格式

    在Android开发中,判断一个字符串是否符合日期格式是一项常见的任务,尤其在处理用户输入或者解析数据时。这个任务可以通过多种方式来实现,涉及到日期时间处理、正则表达式以及Java或Android提供的日期解析类。以下...

    Android中使用XML文件定义字符串.pdf

    在Android应用开发中,有效地管理和使用字符串资源是至关重要的,特别是在构建用户界面和处理本地化时。Android系统提供了一种规范的方式来定义和管理这些字符串,那就是通过XML文件。本篇文章将详细阐述如何在...

    任意长度字符串整数的加减乘除运算

    为了解决这个问题,我们可以使用字符串来存储任意长度的整数,并实现它们的加减乘除运算。本文将详细探讨如何在VC++环境中,利用C++语言处理大整数的字符串运算。 首先,我们需要理解字符串表示的大整数的基本概念...

Global site tag (gtag.js) - Google Analytics