第28篇 Android Studio无括号计算器(二)计算算法说明
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,一些说明和代码如上了。