到第四天,来讲一下各双目运算符的实现。双目运算符的特点运算参数有两个,先输入一个参数,点击双目运算符后,再输入第二个参数,点击等号或其它运算符会先将之前的结果算出来。这就需要专门的变量存储第一个参数和运算符,在输入第二个参数后进行计算(另外,测试了一下,win7的简易计算器里不考虑四则运算的优先级问题,都是从左到右的运算顺序),我在Operation类里增加了一个名为stack的LinkedList变量来存储第一个参数和运算符,当点击双目运算符时,如果stack为空,则将数据及符号存入stack;否则等同于点击等号,计算结果。另外,C的作用就是要将stack清空,再输出0。
先介绍一下各双目运算符的功能:
1. +、-、*、/:四则运算。
2. %:这个运算符比较少见,查了一下才知道这个符号的功能,是在进行加减乘除运算的途中(输入了第二个参数后,按等号之前),可以将第一个参数与第二个参数相乘,再除以100,这个运算的使用无需点击等号。例如,输入7+8之后点击%,则会自动计算7*8/100,输出0.56,如果没有输入两个参数,则输出0。输出的结果仍可继续进行加法运算。
这里必须先特别提一提等号按钮的响应处理。经过多次测试,win7计算器的等号按钮是这样实现的:
1. 如果stack为空,则等号按钮返回的是显示区的内容;
2. 如果stack不为空,则点击等号后,将stack中存储的数和符号取出,与第二个参数进行相应运算,结束后返回结果;
3. 如果点击了存储计算且stack为空,每点一次等号则将文本区的数据加1。
根据这些要求,我编写了EqualAction()方法,代码如下:
/**
* 点击等号的处理
*
*@param num
* 计算数
*@return 是简单符号则处理并返回true,否则返回false
*/
public static String equalAction(double num){
if (stack.size() > 1) {
char op =stack.get(1).toString().charAt(0);
double operator =Double.parseDouble((String) stack.get(0));
isResult = true;
empty();
switch (op) {
case'+':
return resultFormat(operator +num);
case '-':
return resultFormat(operator -num);
case '*':
return resultFormat(operator *num);
case '/':
return resultFormat(operator /num);
default:
return "";
}
} else if (MOperation.isMemoryFilled) {
return resultFormat(num + 1);
} else {
return resultFormat(num);
}
}
然后为双目运算符编写addStack()函数,实现上面所说的双目运算符功能,最后调用即可。
/**
* 添加堆栈
*
* @paramop
* 运算符
* @paramtext
* 输入文本
* @return
*/
public static String addStack(String op,String text) {
isResult = true;
if (stack.size() == 0) {
stack.add(text);
stack.add(op);
return text;
} else {
String res = equalAction(Double.parseDouble(text));
stack.add(res);
stack.add(op);
return res;
}
}
/**
* 双目运算符的处理
*
*@param text
* 输入文本
*@param index
* 序列号码
*@return 是双目运算符则处理并返回结果,否则返回空字符串
*/
public static String operationAction(Stringtext, int index) {
double digit;
switch (index) {
case Button.PLUS:
return addStack("+", text);
case Button.MINUS:
return addStack("-", text);
case Button.MULTIPLY:
return addStack("*", text);
case Button.DIVIDE:
return addStack("/", text);
case Button.PERCENT:
if (stack.size() > 0) {
isResult = true;
returnresultFormat(Double.parseDouble((String) stack.get(0))
* Double.parseDouble(text)/ 100);
} else {
return "0";
}
case Button.EQUAL:
returnequalAction(Double.parseDouble(text));
default:
return "";
}
}
双目运算符的处理也到此完成。