`

我的第一个Android应用:计算器 括号 符号优先级 从左往右运算

阅读更多
我是刚学习入门的小苗子。这是我的第一个android应用程序。
虽然这个例子网络上已经很多了,自己能独立想出来还是很兴奋。
记录自己的成长。慢慢的赶上大家。





思路:假设有一个存在一个f方法能解四则运算(运算优先级如)以下问题
f("1+2+3")=6
f("1+2")=3
f("1")=1
规律f("1+2+3")=f(1)+f(2)+f(3)

假设f("1+2*3")
可以看成f("1")+f("2*3")
f("2*3")看成f("2")*f("3")

用递归可以解这个问题。递归的最终的返回条件是字符串里没有符号是数字
先按最后一个加号拆,再按最后一个乘除拆可以实现从左往右运算,加减乘除优先级。

如f("1+2-3*4")=f("1+2")-f("3*4");

如果存在()的话如何解呢?
如f("1+2+(3+4)")

我把"3+4"看成是一个字符串$0;
那么f("1+2+(3+4)")=f(1+2+$0)=f(1)+f(2)+f($0);
f($0)=f(3+4)=f(3)+f(4)







以下是代码的实现

后台打印如




import java.util.ArrayList;
public class DoCounter {
	
	static ArrayList<String> list;
	
	public static void main (String[] args)
	 {
		 System.out.println(result("((√4+(sin30)/2)*2)-1"));		 
	 }

	    
		public static String result(String s)
		{
			list=new ArrayList<String>();
			try{
				System.out.println("-------------------------");
				System.out.println("-------------------------");
				System.out.println("------解析过程--------");
				System.out.println(s);
				String parse_string=(parse(s.trim()));
				System.out.println("------$引用索引--------");
				System.out.print("[\n");
				for(int i=0;i<list.size();i++)
				{
					System.out.print(" "+"$"+i+"="+list.get(i)+"\n");
				}
				System.out.print("]");
				System.out.println("------*******--------");
				System.out.println("------运算过程--------");
				String result_string=""+f(parse_string);
				System.out.println("------运算结果--------");
				System.out.println("结果输出:"+result_string);
				System.out.println();
				
				
				
				
				return result_string;
				
			}
		    catch(Exception e)
		    {
		    	System.out.println("null");
		    	return "null";
		    }
		}
		
		
		//该方法()的内容由$在list中进行索引
		public static String parse(String s) throws ArithmeticException {
			if(s.matches("[+-//*/]{2,}"))
	    	{
	    		throw new ArithmeticException(); 
	    	}
			int fri;
			int end;
			if((fri=s.lastIndexOf("("))!=-1)
			{
			  for(int i=fri;i<s.length();i++)
			  {

				  if(s.charAt(i)==')')
				  {
					 end=i;
					 String str=s.substring(fri+1,end);
					String turnstr=s.substring(0, fri)+"$"+list.size()+s.substring(end+1, s.length());
					  System.out.println(turnstr);
					  list.add(str);
					  return parse(turnstr);
				  }
			  }
			}
			return s;
		}
		
		
		//f方法递归运算法则求解
		public static double f(String s) throws ArithmeticException {
			
	        try{
	        //递归求解符号优先级自上往下----优先级	
	        
	           	
	        	
	        	
	        	if(s.lastIndexOf("+")!=-1||s.lastIndexOf("-")!=-1)
	        	{
	        		return jia_jian(s);
	        	}
	        	
	        	
	            if(s.lastIndexOf("*")!=-1||s.lastIndexOf("/")!=-1
	            		||s.lastIndexOf("%")!=-1)
	        	{
	            	return cheng_chu_rest(s);
	        	}
	        	
	        //符号运算
			if (s.indexOf("√") == 0)
			{
				return sqrt(s);	
			}
			
			if (s.indexOf("sin")==0)
			{
				return sin(s);
			}
			if (s.indexOf("cos")==0)
			{
				return cos(s);
			}
			if (s.indexOf("tan")==0)
			{
				return tan(s);
			}
		
			//最高优先级,将()看做一个字符串处理,由$索引在List中引用
			if (s.indexOf("$") == 0)
			{
				System.out.println();
				return $(s);
			}
			
			//运算将表达式拆解到无任何符号则直接返回该值
			
			System.out.println("数字"+s);
			return Double.parseDouble(s);
			
		}catch(Exception e)
		{
			throw new ArithmeticException(); 
		}

	}
	
		
		public static double jia_jian(String s)
		{
			if(s.lastIndexOf("+")-s.lastIndexOf("-")>0)
			{	
				
	            int i=s.lastIndexOf("+");

		        return	(s.substring(0,i).equals("")? 0:f(s.substring(0, i)))
		        		+f(s.substring(i+1, s.length()));
		        
			}
			else
			{

				int i=s.lastIndexOf("-");
				return	(s.substring(0,i).equals("")? 0:f(s.substring(0, i)))
			    		-f(s.substring(i+1, s.length()));
			}
		}
		
		
		public static double jia(String s)
		{
			String[] str = s.split("\\+");
			double d = str[0].equals("")?0:f(str[0]);
			for (int i = 1; i < str.length; i++) {

				d += f(str[i]);
			}

			return d;
		}
		public static double jian(String s)
		{
			String[] str = s.split("-");
			double d = str[0].equals("")?0:f(str[0]);
			for (int i = 1; i < str.length; i++) {

				d -= f(str[i]);
			}

			return d;
		}

		
		public static double cheng_chu_rest(String s)
		{
			int i1=s.lastIndexOf("*");
			int i2=s.lastIndexOf("/");
			int i3=s.lastIndexOf("%");
			if( i1>i2 && i1 >i3 )
			{

				return	f(s.substring(0, s.lastIndexOf("*")))
	    		*f(s.substring(s.lastIndexOf("*")+1, s.length()));
			}
			else if( i2>i1 && i2 >i3 )
			{
				System.out.println("/");
				return	f(s.substring(0, s.lastIndexOf("/")))
	    		/f(s.substring(s.lastIndexOf("/")+1, s.length()));

			}
			else
			{
				System.out.println("%");
				return	f(s.substring(0, s.lastIndexOf("%")))
	    		%f(s.substring(s.lastIndexOf("%")+1, s.length()));

			}
		}

		public static double cheng(String s)
		{
			String[] str = s.split("\\*");
			double d =f(str[0]);
			for (int i = 1; i < str.length; i++) {

				d*=f(str[i]);
			}

			return d;
		}
		public static double chu(String s)
		{
			String[] str = s.split("\\/");
			double d =f(str[0]);
			for (int i = 1; i < str.length; i++) {

				d/=f(str[i]);
			}
			return d;
		}
		
		public static double sqrt(String s)
		{

			String[] str=s.split("√");
			return f(""+Math.sqrt(f(str[1])));
		}
		
		public static double $(String s)
		{
			//将$解析,在ArrayList的索引中取出字符加入到f方法中递归
			String[] str=s.split("\\$");
			return f(list.get(Integer.parseInt(str[1])));	
		}
		
		private static double sin(String s) {
			String[] str=s.split("sin");
			return Math.sin(Math.PI/180*f(str[1]));	
		}
		private static double cos(String s) {
			String[] str=s.split("cos");
			return Math.cos(Math.PI/180*f(str[1]));
		}
		private static double tan(String s) {
			String[] str=s.split("tan");
			return Math.tan(Math.PI/180*f(str[1]));
		}
}
分享到:
评论
1 楼 zcmain 2015-03-20  
很不错基本上逻辑都实现了 赞一个

相关推荐

    VC++实现计算器 ,可实现符号优先级及括号运算

    在本项目中,我们主要探讨的是如何使用Visual C++ 6.0(简称VC6.0)这个经典的集成开发环境来实现一个功能完善的计算器程序,它不仅能够处理基本的四则运算,还支持符号优先级以及括号运算,提供良好的用户界面交互...

    java计算器含括号可进行优先级运算

    Java计算器实现含括号的优先级运算是一种常见的编程练习,主要涉及到的是计算机科学中的解析算法和数据结构。在这个场景中,我们通常会使用栈(Stack)数据结构来处理表达式的计算,因为栈具有后进先出(LIFO,Last ...

    C# WPF 计算器 有运算优先级

    【C# WPF 计算器 有运算优先级】是一个使用C#编程语言和Windows Presentation Foundation(WPF)框架构建的计算器应用。这个项目旨在教授如何在C#环境中实现一个具备运算优先级功能的计算器,它能正确处理加、减、乘...

    一个可以实现括号、加减乘除优先级运算的计算器

    在编程领域,构建一个可以处理括号和加减乘除优先级运算的计算器是一项常见的练习。这个"一个可以实现括号、加减乘除优先级运算的计算器"项目旨在为安卓新手提供一个学习平台,让他们了解如何处理复杂的数学表达式。...

    ios带括号优先级计算器实现

    在iOS开发中,实现一个带有括号的优先级计算器是一项挑战性的任务,它涉及到解析表达式、处理运算符优先级以及正确计算结果等多个关键知识点。本文将深入探讨这些要点,并结合"iCalculator"这个示例项目,来详细介绍...

    计算器 MFC 包含优先级

    本项目“计算器 MFC 包含优先级”显然使用了MFC框架来实现一个具有基本数学运算功能的计算器,特别强调了运算的优先级处理,包括括号的使用。下面将详细讨论相关知识点: 1. **MFC框架**:MFC是基于Windows API的,...

    实现大数六则运算的C++小计算器(带包含括号的优先级运算)

    实现大数六则运算的C++小计算器(带包含括号的优先级运算) 六则:加减乘除 乘方 求余 编程的思路发在了这篇文章里 : https://blog.csdn.net/X_P_X_P/article/details/122646365?spm=1001.2014.3001.5501 本人大一 学艺...

    计算器代码(有运算优先级)

    在编程领域,创建一个能处理运算优先级的计算器是一个经典的挑战,它可以帮助我们理解如何解析复杂的数学表达式并正确执行计算。 首先,我们要知道运算符的优先级规则。在数学中,括号内的表达式优先计算,其次是...

    final3.rar_FPGA 加减乘除_fpga计算器_优先级计算器_计算器FPGA_逻辑计算器

    本项目"final3.rar"是一个基于FPGA实现的计算器设计,专注于实现四位以内的基本算术运算以及逻辑运算,并且具备处理运算优先级的能力。以下将详细介绍该设计的关键知识点: 1. **FPGA基本原理**:FPGA由可配置的...

    Java综合程序设计——计算器(实现运算符优先级的四则混合运算)

    在本项目中,"Java综合程序设计——计算器(实现运算符优先级的四则混合运算)"是一个典型的软件开发任务,旨在实现一个功能丰富的计算器,包括基础的四则运算以及更复杂的数学操作如对数和平方根。这个计算器的关键...

    基于android开发的计算器

    括号运算:支持使用括号进行优先级运算。 小数运算:支持小数的加减乘除运算。 百分比计算:支持百分比的加减乘除运算。 历史记录:记录用户的计算历史,方便查看和复用。 删除功能:支持删除输入的字符或整个表达式...

    Android之可解析带括号的四则运算计算器

    总的来说,"Android之可解析带括号的四则运算计算器"项目涵盖了Android UI设计、事件处理、Java脚本引擎的应用、运算符优先级和错误处理等多个方面,是一个很好的学习和实践Android开发技能的案例。通过这个项目,...

    计算器 vc 满足符号优先级

    计算器是计算机科学中一个基础且重要的工具,尤其在编程领域,理解如何实现一个符合运算符优先级的计算器是一项必备技能。VC(Visual C++)是一种广泛使用的Microsoft开发环境,用于编写C++程序。在这个场景中,...

    计算器+利率计算器-无优先级-有其余拓展

    这里我们探讨的是一款名为“计算器+利率计算器”的应用,它是一款初等计算器,虽然尚未实现优先级运算功能,但其基础计算能力和拓展至利率计算的功能,为学习者提供了丰富的学习体验。接下来,我们将深入解析这款...

    vb 计算器(实现括号运算)

    这个"vb 计算器(实现括号运算)"项目显然旨在实现一个功能丰富的计算工具,不仅支持基本的数学运算,还涉及了更复杂的括号运算、混合运算、求导数以及开平方根等高级功能。下面我们将详细探讨这些知识点。 1. **括号...

    简单的汇编四则运算计算器(包括号,判断优先级)

    在本文中,我们将深入探讨如何使用汇编语言构建一个简单的四则运算计算器,该计算器能够处理加法、减法、乘法和除法,并具备处理括号和判断运算优先级的功能。汇编语言是计算机科学的基础,它允许程序员直接与硬件...

    具有优先级的计算器 实现

    本文将详细探讨如何使用JavaScript(JSQ)来创建这样一个计算器,它支持四则运算以及混合运算,并考虑了运算符的优先级。 首先,我们需要理解四则运算的优先级规则。在数学中,乘法和除法的优先级高于加法和减法,...

    Android计算器(Android studio)

    1. **Android Studio**:Android Studio是Google推出的一款集成开发环境(IDE),专为Android应用开发设计。它提供了代码编辑器、调试工具、构建系统、模拟器等所有必要的工具,让开发者可以高效地创建Android应用。...

    android 实现计算器加减乘除混合运算

    在Android平台上开发一个计算器应用,实现加减乘除的混合运算以及数字的删除和返回功能,需要掌握以下几个关键知识点: 1. **用户界面设计**:首先,你需要使用Android Studio中的XML布局文件来设计计算器的界面。...

Global site tag (gtag.js) - Google Analytics