长度为8的字符串,第一个值为0,最后一个值为7,打乱顺序计算四个数字的总合

public class sx6 {
    public static void main(String[] args) {
        //注意特殊数字10,10分成两位是1和0,两位代表一个数字
        //1\没有括号,2\有1个括号
        //3\两个括号
        //(5+3)*(1+2)
        //2+2+2*10
        //其它情况
//        String biaoda="5*6*8/10";
//        String biaoda="(5+2+K)*3";
//        String biaoda="2+2+2*10";
        String biaoda="(5+3)*(2+J)";
        //和差积商的计算结果有一值放在循环外
        int num1=0;
        //如果有第二个括号的值,用num2
        int num2=0;
        //把记录的flag做一个全局,给flag一个没有的符号初始化
        char flag='|';
//        System.out.println(biaoda.indexOf("("));
        //indexOf输出字符串中的第0个位置,可以输出右括号在字符串的位置,这个位置从0开始
        //把字符串拆开,每一个是一个字符,就是char,在字符串有函数charAt(位置)
//        System.out.println(biaoda.indexOf(")"));
        //这里把(开始位置定义变量,把)结束位置定义变量,中间的可以进行有效性判断和计算
        int index_first=biaoda.indexOf("(");
//        System.out.println(index_first);
//        System.out.println("pppppppppppppppppppppppppp");
//        if(index_first==-1){
//            index_first=-1;
//        }
        int index_last=biaoda.indexOf(")");
        int index_second=biaoda.lastIndexOf(")");
        System.out.println(index_second);
        System.out.println("ppppppppppppppppppppppppp");
        int index_second_last=biaoda.lastIndexOf("(");
        //先判断左括号
        //考虑问题,只要出现条件共用代码,考虑事情,不要重码,1把代码放在条件外,2用函数
        if(index_last==-1){
            //字符串有长度函数length()
            index_last=biaoda.length();
            //全局有传有收
            //没有括号,从左往右算即可
            num1=test_for(index_first+1,index_last,num1,biaoda,flag);

        }else {
            if(index_second==-1){
                //暂时先不处理
                //全局有传有收
                //有1个括号的时候
                num1=test_for(index_first+1,index_last,num1,biaoda,flag);
                if(index_last<biaoda.length()){
                    //执行这句的意思,把后面的加减乘除就算进来了,这个括号算进来0
                    //如果是两个括号,右边终止不应该是biaoda.length(),应该是右括号结束
                    num1=test_for(index_last+1,biaoda.length(),num1,biaoda,flag);
                }
            }else{
                //另外做一个事,再做另外一个括号的事,计算第二个括号后,就不要把num1覆盖了,
                //num2是需要计算的,不需要传
                num2=test_for(index_second+1,index_second_last,num1,biaoda,flag);
                System.out.println(num2);
                System.out.println("-------------------");
                num1=test_for(index_first+1,index_last+2,num1,biaoda,flag);
                num1=test_for_num1_num2(num1,num2,flag);
//                if(index_last<index_second+1){
//                    //执行这句的意思,把后面的加减乘除就算进来了,这个括号算进来0
//                    //如果是两个括号,右边终止不应该是biaoda.length(),应该是右括号结束
//                    //如果是两个括号,直接到第二个左括号结束+1的位置即可
//                    num1=test_for(index_last+1, index_second+1,num1,biaoda,flag,num2);
//                }

            }
        }

//        //全局有传有收
//        num1=test_for(index_first+1,index_last,num1,biaoda,flag,num2);
//        if(index_last<biaoda.length()){
//            //执行这句的意思,把后面的加减乘除就算进来了,这个括号算进来0
//            //如果是两个括号,右边终止不应该是biaoda.length(),应该是右括号结束
//                    num1=test_for(index_last+1,biaoda.length(),num1,biaoda,flag,num2);
//        }
        //两个括号间还有运算符号

        //再计算括号外面的结果
        //循环计算结束,打印全局的num1
        System.out.println(num1);
    }
    //函数需要根据flag来做事情,所以传入flag,凡是出现变量报错,证明这段函数需要变量,再把变量做参数传入,
    //函数中缺少计算的量,采用传参就可以
    //这个函数中有主函数中的全局,num1是主函数的全局,只要有全局,把全局返回
    //默认返回是void,是空,把void改成返回全局的int
    public static int test_switch(char flag,int num1,int num2){
//        System.out.println("---------------------");
//        System.out.println(num2);
        //如果num2传入一个0,证明num2之前的数字1,num1已加过一个1

        switch(flag){
            case '|':
                //证明没有操作

                if (num2==0) {
                    num1 += 9;
                }else{
                    num1=num2;
                }
                break;
            case '+':
                //加减乘除=后面的数值还是需要变化,不是固定的1

                if (num2==0){
                    num1+=9;
                }else{
                    num1+=num2;
                }
                break;
            case '-':

                if (num2==0){
                    num1-=9;
                }else{
                    num1-=num2;
                }
                break;
            case '*':
                //num2是0,不能做乘法
                if(num2!=0){
                    num1*=num2;
                }else{
                    num1*=10;
                }

                break;
            case '/':
                //num2,不能做除法
                if(num2!=0){
                    num1/=num2;
                }else{
                    num1/=10;
                }

        }

        //如果有全局,在计算中还有全局变量参与,最后返回全局
        return num1;
    }
    //复制后,错的标红的作输入变量,
    //函数里:如果大括号没有错误,看一下返回值
    public static int test_for(int start,int end,int num1,String biaoda,char flag) {
//        for(int i=index_first+1;i<index_last;i++){
        for (int i = start; i < end; i++) {
//            System.out.println(biaoda.charAt(i));
            //()内的字符全部取出,碰到数字记录,一个加法的和是由被加数和加数决定的
            //这是记录加数和被加数的;也可以sum和num的关系,num是记数的,sum是求和的
            //charAt(i)输出的字符可能是J ,Q,K。如果直接接收整型不合适,这里用一个中间变量
            //这里把num1记录当前的字符
//            int num1=0;
            char num1_mid = biaoda.charAt(i);
//            System.out.println(num1_mid);
//            System.out.println("XXXXXXXXXXXXXXX");
            //记录操作的标志位,放在循环里面,每次循环flag定义一次,每次循环flag变化,不能让flag发生变化,
            //记录的操作在遇到第二个操作数之前都是有效的。所以flag应该是全局

            //记录标志位后,只有再有一个数,就可以使用
            //如果是J,Q,K就转化成1
            switch (num1_mid) {
                case 'J':
                    //把后面的switch复制到每一个switch里面,这段代码才能一直有效
                    //这里简化操作,把这段不断重复,影响结构的代码提出来,变成一个函数,函数名不能是main,前面的内容一致
                    //注意test_switch有结果返回,有结果返回就要接收,使用全局来接收
                    num1 = test_switch(flag, num1, 1);
//                    num1+=1;
                    break;
                case 'Q':
                    num1 = test_switch(flag, num1, 1);
//                    num1+=1;
                    break;
                case 'K':
                    num1 = test_switch(flag, num1, 1);
//                    num1+=1;
                    break;
                case '+':
                    //当加减乘除任一开始操作时,只有一个数存在,不能做任何运算,只能等另一个数过来,才能运算
                    //遇到这类问题,你把这个符号当作标志位
                    flag = '+';
                    break;
                case '-':
                    //只记录,不能计算
                    flag = '-';
                    break;
                case '*':
                    flag = '*';
                    break;
                case '/':
                    flag = '/';
                    break;
//                case '(':
//                    //这个函数有返回值,有返回值就需要接收
//                    if(num2!=-1){
//                     num1=test_for_num1_num2(num1,num2,flag);
//                     System.out.println(num1);
//                     return num1;
//                    }
                  //计算结束,直接返回
//                    break;
                case ')':
                    break;
                default:
//                    System.out.println(Integer.parseInt(num1_mid+""));
                    System.out.println("------------1--------------");
                    System.out.println(num1_mid);
                    num1 = test_switch(flag, num1, Integer.parseInt(num1_mid + ""));
                    //把char型加上一个字符,只不过这个字符是""
//                    num1+=Integer.parseInt(num1_mid+"");
            }
            //一个一个打印,看错误的原因
//            System.out.println(num1);
            //如果碰到加减乘除,就把这两个数计算

        }
        return num1;
    }
    public static int test_for_num1_num2(int num1,int num2,char flag){
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(flag);
        System.out.println("++++++++++++++++++++++");
        switch(flag){
            case '+':
                return num1+num2;
            case '-':
                return num1-num2;
            case '*':
                return num1*num2;
            case '/':
                return num1/num2;
        }
        return 0;
    }
}
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值