我是刚学习入门的小苗子。这是我的第一个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]));
}
}
分享到:
相关推荐
可实现符号(+、-、*、/)优先级运算,并且括号优先级运算,界面交互良好
java计算器含括号可进行优先级运算
实现大数六则运算的C++小计算器(带包含括号的优先级运算) 六则:加减乘除 乘方 求余 编程的思路发在了这篇文章里 : https://blog.csdn.net/X_P_X_P/article/details/122646365?spm=1001.2014.3001.5501 本人大一 学艺...
一个简单计算器,可以实现括号、加减乘除优先级的计算,很适合于安卓新手的入门学习
FPGA实现计算器(四位以内加减乘除,逻辑运算,包含优先级)
括号运算:支持使用括号进行优先级运算。 小数运算:支持小数的加减乘除运算。 百分比计算:支持百分比的加减乘除运算。 历史记录:记录用户的计算历史,方便查看和复用。 删除功能:支持删除输入的字符或整个表达式...
包含了最基础的加减乘除运算,并结合优先级,增加了括号
用 BeanShell来解析的,有算法优先级以及带括号,程序精炼转发分享供大家学习。
免费分享 自己写的 递归计算器 例如: 2+2/3+(33+6+(3-3*(33.44-4+(33*44.3/33+(333-33))))) 像这样的复杂运算,能够快速得出结果, 不调用系统的快速计算方法; ps: javascript像这样复杂的连接公式 是得不出结果的;
1)有运算优先级(括号最先,乘方次之,乘除再次之,加减最后等) 2)思路:按运算优先级将数学式子步步化简 3)数学式子用字符串存储,负数用中括号[]括起来表示,如:[-93]
java作业,可以实现括号的优先级判定以及输入错误时的纠错
当遇到加减乘除或左括号时进行优先级判断:如果传入的操作符优先级大于栈顶操作符的优先级则操作符入栈,如果传入的操作符优先级小于等于栈顶操作数的优先级则将栈顶操作符弹出,另外从操作数堆栈弹出两操作数进行...
此计算器实现了有优先级计算,除了+、-、*、/等基本运算外,还有括号、三角函数、开根等附加运算。
可以四则运算的计算器,可以按优先级计算,例如:(3+2*4-6)/2
C# 实现简单的四则运算计算器可以处理括号的优先级 适合初学者入门学习
MFC四则运算有优先级的计算器 Q697901 的回答 https://ask.csdn.net/questions/697901
可以计算是是数学表达式:从一个简单的表达式,如“1+2”到更高级的表达式,如“3+(3*9(80+sin90))” 除了可以实现了系统自带计算器功能外还可以进行基本函数的运算和括号的运算,能根据表达式的优先级来自动...
很完整的用JAVA写的带优先级的计算器,支持小括号运算
输入一串计算式子,其中可以包含*—+/(),按优先级算出结果,可以在控制台输入一串运算式,也可以修改一下在文件中读出运算式