简单 android 计算器应用
Simple android calculator app
我正在尝试制作一个简单的 android 计算器应用程序,我知道它不是很好并且可能有一百种更好的方法来实现它,但这就是它的样子。我需要帮助的是 "resultBtnClick" 方法中的减法、乘法和除法。添加部分很简单,我只是在 for 循环中使用了 "result += ..."。那么我如何使堆栈中的数字彼此 subtract/divide/multiply?
public class MainActivity extends AppCompatActivity {
TextView tv1;
Boolean emptyResult = true;
private static char operator;
double result, res;
Stack values = new Stack();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.tv1);
}
public void btnClick(View v)
{
if (!emptyResult)
{
tv1.setText("");
emptyResult = true;
}
switch(v.getId())
{
case R.id.btn1:
tv1.setText(tv1.getText() + "1");
break;
case R.id.btn2:
tv1.setText(tv1.getText() + "2");
break;
case R.id.btn3:
tv1.setText(tv1.getText() + "3");
break;
case R.id.btn4:
tv1.setText(tv1.getText() + "4");
break;
case R.id.btn5:
tv1.setText(tv1.getText() + "5");
break;
case R.id.btn6:
tv1.setText(tv1.getText() + "6");
break;
case R.id.btn7:
tv1.setText(tv1.getText() + "7");
break;
case R.id.btn8:
tv1.setText(tv1.getText() + "8");
break;
case R.id.btn9:
tv1.setText(tv1.getText() + "9");
break;
case R.id.btn0:
tv1.setText(tv1.getText() + "0");
break;
case R.id.btnDot:
tv1.setText(tv1.getText() + ".");
break;
case R.id.btnClear:
tv1.setText("");
emptyResult = true;
while (!values.isEmpty())
{
values.pop();
}
break;
}
}
public void calculateBtnClick(View v)
{
values.push(tv1.getText());
switch(v.getId())
{
case R.id.btnAdd:
operator = '+';
break;
case R.id.btnSub:
operator = '-';
break;
case R.id.btnMult:
operator = 'x';
break;
case R.id.btnDiv:
operator = '/';
break;
}
tv1.setText("");
}
public void resultBtnClick(View v)
{
values.push(tv1.getText());
switch(operator)
{
case '+':
for (int i=0; i < values.size(); i++)
{
result += Double.valueOf(values.get(i).toString());
}
break;
case '-':
for (int i=0; i < values.size(); i++)
{
result -= Double.valueOf(values.get(i).toString());
}
break;
case 'x':
for (int i=0; i < values.size(); i++)
{
result *= Double.valueOf(values.get(i).toString());
}
break;
case '/':
for (int i=0; i < values.size(); i++)
{
result /= Double.valueOf(values.get(i).toString());
}
break;
}
while (!values.isEmpty())
{
values.pop();
}
res = ((long)(result * 100000 + 0.5))/100000.0;
tv1.setText(Double.toString(res));
result = 0;
emptyResult = false;
}
}
编辑 1:我也知道我一次只能使用一个运算符,也就是最后一次单击的运算符,所以如果我单击:5+6-8x2+4,它将计算为:5 +6+8+2+4,这可能需要更多的工作来修复它才能像普通计算器一样工作,所以请帮我解决上面提到的主要问题,如果有一个简单、快速的解决方法,那么欢迎你将其添加到您的答案中,但我会优先考虑主要问题的答案,谢谢!
编辑 2:乘法和除法没有任何作用,我知道代码有误,只是想弄清楚实际结果是什么。
您的起始结果似乎是 0 而不是第一个数字。加法有效是因为 0+values.get(i) 是 i 的值。您需要先初始化结果
您需要从堆栈中取出第一个值,否则您需要对 0 进行减法/乘法/除法。
result = Double.valueOf(values.get(0)); // Get first, so 'result != 0'
for (int i = 1; i < values.size(); i++) {
double val = Double.valueOf(values.get(i).toString());
switch(operator) {
case '+':
result += val;
break;
case '-':
result -= val;
break;
考虑研究 "Shunting-yard algorithm",不过
我正在尝试制作一个简单的 android 计算器应用程序,我知道它不是很好并且可能有一百种更好的方法来实现它,但这就是它的样子。我需要帮助的是 "resultBtnClick" 方法中的减法、乘法和除法。添加部分很简单,我只是在 for 循环中使用了 "result += ..."。那么我如何使堆栈中的数字彼此 subtract/divide/multiply?
public class MainActivity extends AppCompatActivity {
TextView tv1;
Boolean emptyResult = true;
private static char operator;
double result, res;
Stack values = new Stack();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.tv1);
}
public void btnClick(View v)
{
if (!emptyResult)
{
tv1.setText("");
emptyResult = true;
}
switch(v.getId())
{
case R.id.btn1:
tv1.setText(tv1.getText() + "1");
break;
case R.id.btn2:
tv1.setText(tv1.getText() + "2");
break;
case R.id.btn3:
tv1.setText(tv1.getText() + "3");
break;
case R.id.btn4:
tv1.setText(tv1.getText() + "4");
break;
case R.id.btn5:
tv1.setText(tv1.getText() + "5");
break;
case R.id.btn6:
tv1.setText(tv1.getText() + "6");
break;
case R.id.btn7:
tv1.setText(tv1.getText() + "7");
break;
case R.id.btn8:
tv1.setText(tv1.getText() + "8");
break;
case R.id.btn9:
tv1.setText(tv1.getText() + "9");
break;
case R.id.btn0:
tv1.setText(tv1.getText() + "0");
break;
case R.id.btnDot:
tv1.setText(tv1.getText() + ".");
break;
case R.id.btnClear:
tv1.setText("");
emptyResult = true;
while (!values.isEmpty())
{
values.pop();
}
break;
}
}
public void calculateBtnClick(View v)
{
values.push(tv1.getText());
switch(v.getId())
{
case R.id.btnAdd:
operator = '+';
break;
case R.id.btnSub:
operator = '-';
break;
case R.id.btnMult:
operator = 'x';
break;
case R.id.btnDiv:
operator = '/';
break;
}
tv1.setText("");
}
public void resultBtnClick(View v)
{
values.push(tv1.getText());
switch(operator)
{
case '+':
for (int i=0; i < values.size(); i++)
{
result += Double.valueOf(values.get(i).toString());
}
break;
case '-':
for (int i=0; i < values.size(); i++)
{
result -= Double.valueOf(values.get(i).toString());
}
break;
case 'x':
for (int i=0; i < values.size(); i++)
{
result *= Double.valueOf(values.get(i).toString());
}
break;
case '/':
for (int i=0; i < values.size(); i++)
{
result /= Double.valueOf(values.get(i).toString());
}
break;
}
while (!values.isEmpty())
{
values.pop();
}
res = ((long)(result * 100000 + 0.5))/100000.0;
tv1.setText(Double.toString(res));
result = 0;
emptyResult = false;
}
}
编辑 1:我也知道我一次只能使用一个运算符,也就是最后一次单击的运算符,所以如果我单击:5+6-8x2+4,它将计算为:5 +6+8+2+4,这可能需要更多的工作来修复它才能像普通计算器一样工作,所以请帮我解决上面提到的主要问题,如果有一个简单、快速的解决方法,那么欢迎你将其添加到您的答案中,但我会优先考虑主要问题的答案,谢谢!
编辑 2:乘法和除法没有任何作用,我知道代码有误,只是想弄清楚实际结果是什么。
您的起始结果似乎是 0 而不是第一个数字。加法有效是因为 0+values.get(i) 是 i 的值。您需要先初始化结果
您需要从堆栈中取出第一个值,否则您需要对 0 进行减法/乘法/除法。
result = Double.valueOf(values.get(0)); // Get first, so 'result != 0'
for (int i = 1; i < values.size(); i++) {
double val = Double.valueOf(values.get(i).toString());
switch(operator) {
case '+':
result += val;
break;
case '-':
result -= val;
break;
考虑研究 "Shunting-yard algorithm",不过