以前学习java的时候,也做过一个简易的计算器程序,代码是老师带着写的。
现在自己在android上也写一个计算器程序,算法部分自己动脑筋想的,对我这个新人来说可不简单。
花了不少时间,收获也不少。
主要分享下我做这个计算器算法的思路:
1.将功能相同的Botton分为一类,使用同一个点击事件。(可以使用Button数组,再通过for循环让数字中的每一个元素都使用同一个适配器)
数字:1~9,小数点。
符号:+ - * /
功能符号:C(清屏键),=(等于号键)
当然分得越细越好,但要是给每个按钮都写了不同的处理代码,肯定会有很多代码重复,阅读性很差。
2.功能实现
为了方便调试,先定义好C(清屏键的功能)。点击后TextView.setText("");//清屏
数字:点击对应数字按钮后,在TextView上显示。
TextView.setText(Button.getText().toString());设置TextView的内容为当前Button的内容。
即你点击“1”按钮,TextView上便显示1。击“2”按钮,TextView上便显示2。
可是我们要输入12呢?上面的设置会使当然输入的数字覆盖上一个数字。所以应该是如下代码:
TextView.setText(TextView.getText().toString()+Button.getText().toString());
设置前,先获取上一次TextView上的数字,再加上当前输入的数字。这里就可以使用C(清屏键)进行调试了。
符号:对之前输入的数字进行运算。
例如输入1+2=。你按“+”的时候,就能获取1+2的结果吗?问题是,“2”还没按下去呢。所以应该是“=”对“1”和“2”进行加法运算。
1-2 = (0+1)-2;
1+2+3= ((0+1)+2)+3;
每次输入的运算符会对前面的数字进行运算,所以我们应该定义一个command来记录上一个输入的运算符。
另外,参考Windows自带的计算器,为了方便获取TextView中的数字,TextView中是不显示运算符的。
算法部分的代码如下:
Boolean isNextCommand = true; //判断前一次输入是不是command
Boolean isFirst = true; //判断这次运算中是否第一次用运算符
Boolean isNewNumber = true; //判断使用运算符后,是否有新的数字写入
Double number = 0.0; //初始化的数字
String command = "+"; //初始化运算符,默认为”+“
Double result = 0.0; //初始化运算结果,默认为 ”0.0“
TextView tvResult="0" //初始当前TextView中的显示
private class MyNumberListener implements OnClickListener {
//数字按钮的点击事件,0~9,小数点。有些判断语句是为了防止出错而加上的,可以之后再理解。
public void onClick(View v) {
isNewNumber = true;
Button b = (Button) v;//获取当前输入的Button
String inputNumber = b.getText().toString();//获取当前输入的按钮的内容
String tvCurrent = tvResult.getText().toString();//获取当前TextView的内容。
if(isNextCommand){
//之所以要判断前一次输入是不是运算符,因为在1+23当中,”2“和"3"的输入判断是不相同的。
//输入“2”时,要直接设置TextView的内容为“2”。输入“3”时,要先获取之前输入的“2”.
if(inputNumber.equals(".")){//对使用运算符后,输入为小数点时,设置为“0.”
tvResult.setText("0.");
isNextCommand = false;
return;
}else if(inputNumber.equals("0")){//用运算符后,输入是“0”时,无效。
tvResult.setText("0");
}else{
tvResult.setText(inputNumber);//用运算符后,首个数字输入
isNextCommand = false;
}
}else{
if(tvCurrent.contains(".") && inputNumber.equals(".")){//只能输入一个小数点,再次输入无效。
return;
}
tvResult.setText(tvCurrent + inputNumber);//之后的数字输入
tvCurrent = tvResult.getText().toString();//获取当前的TextView内容
}
number = Double.parseDouble(tvResult.getText().toString());//获取当前输入的数字字符串,用于运算。
}
}
private class MyCommandListener implements OnClickListener {
//运算符的点击事件,
public void onClick(View v) {
if(isNewNumber){//如果没有输入新的数字,防止连续点击运算符时,进行多次运算。
operator(number);//进行运算。
}
Button b = (Button) v;
command = b.getText().toString();//获取当前的运算符。
isNextCommand = true;//点击运算符后,现在可以将isNextCommand设置为true了。
if(isFirst==false){//如果在这次计算中,即没有点击“C”或者“=”之前,如果进行多次运算操作,即便没有点击“=”也会进行输出结果。例如1+2+3会自动输出为3+3。
tvResult.setText(""+result);
}
isFirst = false;//使用“C”或者“=”后,会被设置成true。
isNewNumber = false;
}
}
public void operator(Double number) {
//运算操作,在运算符点击事件中被调用。
if (command.equals("+")) {//加法运算。
result = result + number;
}
if (command.equals("-")) {
result = result - number;
}
if (command.equals("*")) {
result = result * number;
}
if (command.equals("/")) {
if(number!=0){//对除零的处理。为了正常使用,除零操作后,结果返回“0”并提示
result = result / number;
}else{
tvResult.setText("0");
result = 0.0;
Toast.makeText(getApplicationContext(), "除数不能为零", 1).show();
}
}
}
自己进行多次测试,算法应该没什么Bug。起码你乱点程序是不会出错的。
因为还没有对代码进行优化,加上我这个计算器还有其他小功能,源码看起来比较乱这里就不发了。
有不足之处请指点,谢谢。