计算器算法

本文作者分享了在Android上实现计算器程序的算法思路,包括将按钮按功能分类,使用同一点击事件,以及如何处理数字和运算符输入。通过设置变量记录运算状态,实现了连续运算和防止错误输入的功能。代码实现中包括数字按钮和运算符按钮的点击事件处理,以及具体的加减乘除运算逻辑。作者进行了多次测试以确保算法的正确性。
摘要由CSDN通过智能技术生成

以前学习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。起码你乱点程序是不会出错的。

因为还没有对代码进行优化,加上我这个计算器还有其他小功能,源码看起来比较乱这里就不发了。

有不足之处请指点,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值