宏鹏开发部吧 关注:25贴子:103
  • 9回复贴,共1

【练习】四则运算计算器小程序

只看楼主收藏回复

编写一个计算器,要求输入一个只有整数的四则运算的字符串表达式,输出结果。例如输入3+5*6,输出33。


IP属地:湖北1楼2017-04-25 10:17回复
    这个,貌似有点难度...


    来自Android客户端2楼2017-04-25 10:37
    回复
      2025-06-15 06:12:49
      广告



      先来一波,等下看能不能,优化一下


      3楼2017-04-25 14:07
      回复
        我觉得这题可以考虑用递归。


        5楼2017-04-25 14:46
        收起回复
          /*
          * 该方法可进行加减乘除运算,对括号处理需要另外算法
          */
          public String compute(String s) {
          StringBuffer sBuffer=new StringBuffer(s);
          StringBuffer li=new StringBuffer();//生成运算符序列表
          for (int i = 0; i < sBuffer.length(); i++) {
          char c=sBuffer.charAt(i);
          if (c=='+'||c=='-'||c=='*'||c=='/') {
          li.append(c);//运算符列表赋值
          sBuffer.setCharAt(i, ' ');
          }
          }
          //提取字符串中的数值
          String[] d=sBuffer.toString().split(" ");
          LinkedList<String> list=new LinkedList<String>();
          for (String string : d) {
          list.add(string);
          }
          //根据运算符序列完成乘除运算
          for (int i = 0; i < li.length(); i++) {
          char c=li.charAt(i);
          if (c=='*'||c=='/') {
          int num1=new Integer(list.get(i));
          int num2=new Integer(list.get(i+1));
          if (c=='*') {
          list.set(i, num1*num2+"");
          }else {
          list.set(i, num1/num2+"");
          }
          list.remove(i+1);
          li.deleteCharAt(i);
          i--;
          }
          }
          //根据运算符序列完成加减运算
          for (int i = 0; i < li.length(); i++) {
          char c=li.charAt(i);
          int num1=new Integer(list.get(0));
          int num2=new Integer(list.get(i+1));
          if (c=='+') {
          list.set(0, num1+num2+"");
          }else {
          list.set(0, num1-num2+"");
          }
          }
          return list.get(0);//返回结果
          }


          6楼2017-04-26 09:34
          回复
            /**
            * 去括号 并完成运算
            */
            public String finish(String s) {
            StringBuffer dBuffer=new StringBuffer(s);
            while (dBuffer.indexOf("(")>0) {
            int index1=0;
            int index2=0;
            for (int i = 0; i < dBuffer.length(); i++) {
            char c=dBuffer.charAt(i);
            if (c=='(') {
            index1=i;
            }else if (c==')') {
            index2=i;
            String dString=dBuffer.substring(index1, index2+1);
            String eString=compute(dString.substring(1, dString.length()-1));
            dBuffer.replace(index1, index2+1,eString);
            break;
            }
            }
            }
            s=dBuffer.toString();
            s=compute(s);
            return s;
            }


            7楼2017-04-26 10:31
            回复
              将两个方法放在一个类中可完成四则运算


              8楼2017-04-26 10:32
              回复
                把代码优化了下(ps:尽量的减少了冗余度)并添加了注释,顺便强化了下功能,现在可以实现识别括号,加减乘除,还有次方
                public class Three {
                public static void main(String[] args) {
                caculatorPlus("3+(5*(2+6)+1)-2");
                caculatorPlus("1+2*3-4");
                caculatorPlus("60/3-8/4+5");
                caculatorPlus("5*(2+6)+1+(2+4)/2");
                caculatorPlus("5*(2+6)/+1+(2+4)/2");
                caculatorPlus("1+2*3^2-4");
                caculatorPlus("1+(2*3)^2-4*(5+6)");
                }
                /**
                * 能识别括号的计算器
                * @param str 字符串表达式
                */
                public static void caculatorPlus(String str){
                String strTemp="";
                StringBuffer bfTemp=new StringBuffer(str);//处理str的过渡StringBuffer变量
                int count=str.length()-str.replace("(", "").length();//记录括号数
                int leftIndex=0;//记录左括好的位置
                int rightIndex=0;//记录右括好的位置
                //防止输入异常
                try{
                //遍历所有括号的内容
                for(int j=1;j<=count;j++){
                //获取最内层的左括号位置
                for(int i=bfTemp.length()-1;i>=0;i--){
                if(bfTemp.charAt(i)=='('){
                leftIndex=i;
                break;
                }
                }
                //获取最内层的右括号位置
                for(int i=leftIndex+1;i<bfTemp.length();i++){
                if(bfTemp.charAt(i)==')'){
                rightIndex=i;
                break;
                }
                }
                strTemp=caculator(bfTemp.substring(leftIndex+1, rightIndex));//调用无括号计算器
                bfTemp=bfTemp.replace(leftIndex, rightIndex+1,strTemp);//将算出来的结果替换相应部分
                }
                str=caculator(bfTemp.toString());//计算非括号的内容
                System.out.println(str);
                }catch(Exception e){
                System.out.println("您的输入非法!");
                }
                }
                /**
                * 无法识别括号的计算器
                * @param str 字符串表达式
                */
                public static String caculator(String str){
                str=prior(str,"\\^");//计算次方
                str=prior(str,"[*|/]");//计算乘除
                str=prior(str,"[+|\\-]");//计算加减
                return str;
                }
                /**
                * 处理算术运算
                * @param str 表达式字符串
                * @param sign 所要计算的运算符
                * @return
                */
                public static String prior(String str,String sign){
                int result=0;
                String singleSign=null;//取出运算符号
                int a,b;
                int count=str.length()-str.replaceAll(sign, "").length();//记录有多少个次方号
                Pattern p=Pattern.compile("\\d*["+sign+"]\\d*");
                Matcher m=null;
                for(int i=1;i<=count;i++){
                m=p.matcher(str);
                //寻找最左边的运算式
                if(m.find()){
                singleSign=m.group().replaceAll("\\d*","");
                a=Integer.parseInt(m.group().split("[+|\\-|*|/|\\^]")[0]);
                b=Integer.parseInt(m.group().split("[+|\\-|*|/|\\^]")[1]);
                switch (singleSign){
                case "+":
                result=a+b;
                break;
                case "-":
                result=a-b;
                break;
                case "/":
                result=a/b;
                break;
                case "*":
                result=a*b;
                break;
                case "^":
                result=(int)Math.pow(a, b);
                break;
                }
                }
                str=str.replaceFirst("\\d*["+sign+"]\\d*", result+"");//将计算好的结果替换该部分运算式
                }
                return str;
                }
                }


                11楼2017-04-27 00:13
                回复