第28篇 Android Studio无括号计算器(二)计算算法说明

第28篇 Android Studio无括号计算器(二)计算算法说明

  • 2.算法
    • 2.1.主计算函数:protected String compute(String formal, String operator1, String operator2);
    • 2.2.辅助函数1:protected String before(int index,String formal)
    • 2.3.辅助函数2:protected String back(int index,String formal)
    • 2.4.辅助函数3:protected String getResult(double number1,double number2,char operator);

2.算法

因为算式涉及乘除和加减,所以使用两步进行计算,即先乘除后加减。
先乘除后加减这个很简单了吧,就是先进行乘法和除法部分的计算,再进行加法和减法的计算,那么怎么样计算呢,我想到的虽然粗鲁了一点,但还是挺好理解的,就是同传符号的方式进行。
这里除了一个主要的计算函数之外,要用三个函数来辅助,就要写四个函数。

2.1.主计算函数:protected String compute(String formal, String operator1, String operator2);

(1)参数

传进来的算式:formal(String类型)
传进来的运算符1:operator1(String类型)
传进来的运算符2:operator2(String类型)
返回值:formal(String类型)

(2)说明

因为算式是这个样子的:“2+3+5+4”
所以不需要考虑第一位是否是运算符,这个算式的第一位必然是数字。

因此:
(1)取i,赋值为1;
(2)若i小于算式的长度(formal.length()),则将formal[i]赋值给str1,否则返回formal;
(3)若str1是运算符,则将i前面的数字(贴着该运算符)赋值给str2,将i后面的数字(贴着该运算符)赋值给str3,若str1不是运算符,则i加一,返回第(2)步。
(4)如果str2为空或者str3为空,则i++,跳过当前循环,返回第(2)步。否则进行第(5)步。
(5)将算式中,第(3)步中的str2的前面部分赋值给s1(即比如算式为"2+35+9",符号是"",则str2是"3",s1就是"2+")。
(6)如果是加减法,则str2重新赋值,将i对应的运算符前面的算是部分赋值给str2(因为是从左到右,以此避免漏了前一位数的符号),s1赋值为空。
(7)将i对应的运算符极其两侧的数字的运算结果赋值给s2,将算式中,第(3)步中的str2的后面部分赋值给s3(即比如算式为"2+35+9",符号是"",则str2是"3",s3就是"+9")。
(8)获得新的算式:formal = s1 + s2 + s3;str2的首位所在位置i_before赋值给i,返回第(2)步。

(3)代码

protected String compute(String formal, String operator1, String operator2){
   int i = 1;
   while (i < formal.length()){
       String str1 = String.valueOf(formal.charAt(i));
       if(str1.equals(operator1) || str1.equals(operator2)){
           String str2 = before(i,formal);
           String str3 = back(i,formal);
           if(str2.equals("") || str3.equals("")){
               i++;
               continue;
           }

           String s1 = formal.substring(0,i_before);
           if(operator1.equals("+") && i_before > 0){
               str2 = formal.substring(0,i);
               s1 = "";
           }
           String s2 = getResult(Double.parseDouble(str2),Double.parseDouble(str3),formal.charAt(i));
           String s3 = formal.substring(i_back);
           formal = s1 + s2 + s3;
           i = i_before;
       }
       else{
           i++;
       }
   }
   return formal;
}

2.2.辅助函数1:protected String before(int index,String formal)

(1)功能及参数

功能:获取当前运算符前面的数字,如算式"6+3+2.526+5+4",运算符为’'号,则返回的是"2.52";

参数index:当前运算符的位置。
参数formal:算式

(2)说明

因为取的是运算符的前一位数字,则从index-1开始即可。
(1)取i,将index-1赋值给i;
(2)若i大于等于0,则判断formal[i]是否是数字或者小数位。
(3)如果是数字或者小数位。则i减一,返回第(2)步,否则退出循环。
(4)将i+1的值赋给i_before,返回这个数字。

(3)代码

protected String before(int index,String formal){
   int i = index - 1;
   while(i >= 0){
       if((formal.charAt(i) >= '0' && formal.charAt(i) <= '9') || formal.charAt(i) == '.'){
           i--;
       }
       else{
           break;
       }
   }
   i_before = i + 1;
   return formal.substring(i + 1,index);
}

2.3.辅助函数2:protected String back(int index,String formal)

(1)功能及参数

功能:获取当前运算符后面的数字,如算式"6+3+2.526+5+4",运算符为’'号,则返回的是"6";

参数index:当前运算符的位置。
参数formal:算式

(2)说明

因为取的是运算符的前一位数字,则从index-1开始即可。
(1)取i,将index+1赋值给i;
(2)若i小于式子长度,则判断formal[i]是否是数字或者小数位。
(3)如果是数字或者小数位。则i加一,返回第(2)步,否则退出循环。
(4)将i的值赋给i_back,返回这个数字。

(3)代码

protected String back(int index,String formal){
    int i = index + 1;
    while(i < formal.length()){
        if((formal.charAt(i) >= '0' && formal.charAt(i) <= '9') || formal.charAt(i) == '.'){
            i++;
        }
        else{
            break;
        }
    }
    i_back = i;
    return formal.substring(index + 1,i);
}

2.4.辅助函数3:protected String getResult(double number1,double number2,char operator);

(1)功能及参数

功能:计算结果

参数number1:第一位数字。
参数number2:第二位数字。
参数operator:运算符

(2)说明

返回对应的计算。

(3)代码

protected String getResult(double number1,double number2,char operator){
    double result = 0;
    switch(operator){
        case '+':
            result = number1 + number2;
            break;
        case '-':
            result = number1 - number2;
            break;
        case '*':
            result = number1 * number2;
            break;
        case '/':
            result = number1 / number2;
            break;
    }
    DecimalFormat df = new DecimalFormat("#.0");
    return df.format(result);
}

ok,一些说明和代码如上了。

你可能感兴趣的:(Android,Studio,算法,android,javascript)