`

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`类,允许我们用新的字符串替换掉原字符串中匹配...

    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中实现字符串四则运算,这对于那些需要处理动态...

    计算器(字符串运算)

    【标题】:“计算器(字符串运算)” 在编程领域,实现一个计算器来处理字符串形式的运算表达式是一项常见的任务。这个“计算器(字符串运算)”项目旨在处理用户输入的复杂数学表达式,例如“-(1+(2-3)*4-(3+...

    Android常用字符串匹配正则

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

    截取特定部分字符串

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

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

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

    四则运算解析器(字符串)

    四则运算解析器是一种计算机程序,它能够接收包含加、减、乘、除等四则运算符的字符串表达式,并将其转化为可执行的计算过程。这个解析器通常用于解决基础的数学问题,对于编程初学者来说,理解并实现这样一个解析器...

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

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

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

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

    Android字符串国际化

    在Android开发中,为了使应用能够适应不同语言和地区的用户,字符串国际化的概念至关重要。它允许开发者将应用的文本资源分离出来,以便于根据不同国家和地区的需求进行翻译和定制。下面我们将详细探讨Android字符串...

    Android-一款自动对dex文件中的字符串进行加密Android插件工具

    标题提到的"Android-一款自动对dex文件中的字符串进行加密Android插件工具"是指用于增强应用安全性的技术实践,特别是针对 Dex 文件(Dalvik 可执行文件)中的字符串进行加密。在Android系统中,Dex文件包含了应用...

    android发送post请求获取json字符串

    本篇文章将深入探讨如何在Android应用中发送POST请求,并解析返回的JSON字符串。 首先,我们要理解POST请求的基本原理。POST请求是HTTP协议中的一个方法,用于向服务器提交数据,这些数据会附在请求体中。在Android...

Global site tag (gtag.js) - Google Analytics