具有多个操作的Java计算器
发布时间:2020-12-15 05:09:30 所属栏目:Java 来源:网络整理
导读:到目前为止我有以下工作正常.我确定可能有一种更简单的方法可以做到这一点,但我需要改变/改变的是Matheq的顶级方法. Math方法执行单个数学运算. 它适用于任何单个操作,–,*和/. 我的问题是解决一个更大的等式,如10 – 10/5 3. 然而,它确实正确地解决了10/5 6
到目前为止我有以下工作正常.我确定可能有一种更简单的方法可以做到这一点,但我需要改变/改变的是Matheq的顶级方法. Math方法执行单个数学运算.
它适用于任何单个操作,–,*和/. 我的问题是解决一个更大的等式,如10 – 10/5 3. 字符串数组的示例 这是我的代码,有人请帮助我: 修订 public class Matheq { String fnum = null; String lnum = null; String total = null; public String Matheq(String mathoperation) { String mathoperation= "6 * 3 - 4 * 2"; mathoperation = mathoperation.replaceAll(",",""); mathoperation = mathoperation.replaceAll("plus","+"); mathoperation = mathoperation.replaceAll("minus","-"); mathoperation = mathoperation.replaceAll("times","*"); mathoperation = mathoperation.replaceAll("divided by","dividedby"); mathoperation = mathoperation.replaceAll("percent of","percentof"); String[] splitstr = mathoperation.split(" "); while(splitstr.length>1){ for(int i=0; i<splitstr.length; i++) { System.out.println("Get value: " + splitstr[i]); if(splitstr[i].indexOf("percentof") >= 0) { String buildit = splitstr[i-1] + " percent of " + splitstr[i+1]; String done = math(buildit); System.out.println("Percentage operation: " + splitstr[i-1] + " percent of " + splitstr[i+1] + "=" + done); splitstr[i] = done; splitstr[i-1] = ""; splitstr[i+1] = ""; ArrayList<String> list = new ArrayList<String>(); for(String s : splitstr){ if(!s.equals("")){ list.add(s); } } splitstr = list.toArray(new String[list.size()]); } } for(int i=0; i<splitstr.length; i++) { System.out.println("Get value: " + splitstr[i]); if(splitstr[i].indexOf("dividedby") >= 0) { String buildit = splitstr[i-1] + " divided by " + splitstr[i+1]; String done = math(buildit); System.out.println("Division operation: " + splitstr[i-1] + " divided by " + splitstr[i+1] + "=" + done); splitstr[i] = done; splitstr[i-1] = ""; splitstr[i+1] = ""; ArrayList<String> list = new ArrayList<String>(); for(String s : splitstr){ if(!s.equals("")){ list.add(s); } } splitstr = list.toArray(new String[list.size()]); } } for(int i=0; i<splitstr.length; i++) { System.out.println("Get value: " + splitstr[i]); if(splitstr[i].indexOf("*") >= 0) { String buildit = splitstr[i-1] + " * " + splitstr[i+1]; String done = math(buildit); System.out.println("Multiplication operation: "+ splitstr[i-1] + " * " + splitstr[i+1] + "=" + done); splitstr[i] = done; splitstr[i-1] = ""; splitstr[i+1] = ""; ArrayList<String> list = new ArrayList<String>(); for(String s : splitstr){ if(!s.equals("")){ list.add(s); } } splitstr = list.toArray(new String[list.size()]); } } for(int i=0; i<splitstr.length; i++) { System.out.println("Get value: " + splitstr[i]); if(splitstr[i].indexOf("+") >= 0) { String buildit = splitstr[i-1] + " + " + splitstr[i+1]; String done = math(buildit); System.out.println("Addition operation: " + splitstr[i-1] + " + " + splitstr[i+1] + "=" + done); splitstr[i] = done; splitstr[i-1] = ""; splitstr[i+1] = ""; ArrayList<String> list = new ArrayList<String>(); for(String s : splitstr){ if(!s.equals("")){ list.add(s); } } splitstr = list.toArray(new String[list.size()]); } } for(int i=0; i<splitstr.length; i++) { System.out.println("Get value: " + splitstr[i]); if(splitstr[i].indexOf("-") >= 0) { String buildit = splitstr[i-1] + " - " + splitstr[i+1]; String done = math(buildit); System.out.println("Subtraction operation: " + splitstr[i-1] + " - " + splitstr[i+1] + "=" + done); splitstr[i] = done; splitstr[i-1] = ""; splitstr[i+1] = ""; ArrayList<String> list = new ArrayList<String>(); for(String s : splitstr){ if(!s.equals("")){ list.add(s); } } splitstr = list.toArray(new String[list.size()]); } } for(int i=0; i<splitstr.length; i++) { System.out.println("Final operation: " + total + " " + splitstr[i]); } } return total; } private String math(String mathoperation) { // TODO Auto-generated method stub if(mathoperation.contains("percent of")){ mathoperation = mathoperation.replaceAll("percent of","%"); int str = mathoperation.indexOf("%"); System.out.println(str); fnum = mathoperation.substring(0,str-1); fnum = fnum.replaceAll(" ",""); fnum = "." + fnum; System.out.println(fnum); double intfnum = Double.parseDouble(fnum); System.out.println(intfnum); int lastind = mathoperation.length(); System.out.println(lastind); lnum = mathoperation.substring(str+1,lastind); lnum = lnum.replaceAll(" ",""); System.out.println(lnum); double intlnum = Double.parseDouble(lnum); System.out.println(intlnum); double tot = intlnum * intfnum; System.out.println(tot); total = Double.toString(tot); if(total.length() == 3){ total = total + "0"; } if(total.length() > 5){ total = total.substring(0,4); } total = total.replace("0.",""); System.out.println("Total:" + total); } else if(mathoperation.contains("-")){ int str = mathoperation.indexOf("-"); System.out.println(str); fnum = mathoperation.substring(0,""); System.out.println(fnum); double intfnum = Double.parseDouble(fnum); System.out.println(intfnum); int lastind = mathoperation.length(); System.out.println(lastind); lnum = mathoperation.substring(str+1,""); System.out.println(lnum); double intlnum = Double.parseDouble(lnum); System.out.println(intlnum); double tot = intfnum - intlnum; System.out.println(tot); total = Double.toString(tot); System.out.println(total); } else if(mathoperation.contains("+")){ int str = mathoperation.indexOf("+"); System.out.println(str); fnum = mathoperation.substring(0,""); System.out.println(lnum); double intlnum = Double.parseDouble(lnum); System.out.println(intlnum); double tot = intfnum + intlnum; System.out.println(tot); total = Double.toString(tot); System.out.println(total); } else if(mathoperation.contains("*")){ int str = mathoperation.indexOf("*"); System.out.println(str); fnum = mathoperation.substring(0,str-1); fnum = fnum.replaceAll(" ",""); System.out.println(fnum); double intfnum = Double.parseDouble(fnum); System.out.println(intfnum); int lastind = mathoperation.length(); System.out.println(lastind); lnum = mathoperation.substring(str+1,lastind); lnum = lnum.replaceAll(" ",""); System.out.println(lnum); double intlnum = Double.parseDouble(lnum); System.out.println(intlnum); double tot = intfnum * intlnum; System.out.println(tot); total = Double.toString(tot); System.out.println(total); } else if(mathoperation.contains("divided by")){ mathoperation = mathoperation.replaceAll("divided by","/"); int str = mathoperation.indexOf("/"); System.out.println(str); fnum = mathoperation.substring(0,""); System.out.println(lnum); double intlnum = Double.parseDouble(lnum); System.out.println(intlnum); double tot = intfnum / intlnum; System.out.println(tot); total = Double.toString(tot); System.out.println(total); } else { total = null; } return total; } } 解决方法
数组是表示解析方程的错误结构.您需要具有可以表示运算符优先级的结构.处理此类问题的典型机制是
abstract syntax tree.对于您的10 – 10/5 3示例,您可能希望构建一个如下所示的树:
<result> / '-' '+' / / 10 '/' 3 / 10 5 使用高优先级操作符的这种类型的结构降低树,然后您可以执行自下而上的评估以获得正确的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |