android 计算器混合运算
时间: 2023-07-28 07:34:47 浏览: 113
要实现一个能够进行混合运算的Android计算器,可以按照以下步骤进行:
1. 创建一个布局文件,包含数字按钮、运算符按钮、清除按钮、等于号按钮等组件。
2. 在Java代码中,为每个按钮添加点击事件监听器,实现相应的功能。
3. 在计算器逻辑中,可以使用栈来实现混合运算。当输入一个数字时,将其压入栈中;当输入一个运算符时,从栈中弹出两个数字,进行相应的运算,并将结果压入栈中。
4. 当按下等于号按钮时,从栈中弹出最终结果,并将其显示在计算器屏幕上。
下面是一个简单的示例代码,用于实现一个简单的支持混合运算的Android计算器:
MainActivity.java
```java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Stack;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mResultTextView;
private StringBuilder mInputString = new StringBuilder();
private Stack<Double> mNumberStack = new Stack<>();
private Stack<Character> mOperatorStack = new Stack<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultTextView = findViewById(R.id.result_text_view);
Button clearButton = findViewById(R.id.clear_button);
clearButton.setOnClickListener(this);
Button equalsButton = findViewById(R.id.equals_button);
equalsButton.setOnClickListener(this);
Button addButton = findViewById(R.id.add_button);
addButton.setOnClickListener(this);
Button subtractButton = findViewById(R.id.subtract_button);
subtractButton.setOnClickListener(this);
Button multiplyButton = findViewById(R.id.multiply_button);
multiplyButton.setOnClickListener(this);
Button divideButton = findViewById(R.id.divide_button);
divideButton.setOnClickListener(this);
Button decimalButton = findViewById(R.id.decimal_button);
decimalButton.setOnClickListener(this);
Button zeroButton = findViewById(R.id.zero_button);
zeroButton.setOnClickListener(this);
Button oneButton = findViewById(R.id.one_button);
oneButton.setOnClickListener(this);
Button twoButton = findViewById(R.id.two_button);
twoButton.setOnClickListener(this);
Button threeButton = findViewById(R.id.three_button);
threeButton.setOnClickListener(this);
Button fourButton = findViewById(R.id.four_button);
fourButton.setOnClickListener(this);
Button fiveButton = findViewById(R.id.five_button);
fiveButton.setOnClickListener(this);
Button sixButton = findViewById(R.id.six_button);
sixButton.setOnClickListener(this);
Button sevenButton = findViewById(R.id.seven_button);
sevenButton.setOnClickListener(this);
Button eightButton = findViewById(R.id.eight_button);
eightButton.setOnClickListener(this);
Button nineButton = findViewById(R.id.nine_button);
nineButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.clear_button:
handleClearButtonClick();
break;
case R.id.equals_button:
handleEqualsButtonClick();
break;
case R.id.add_button:
case R.id.subtract_button:
case R.id.multiply_button:
case R.id.divide_button:
handleOperatorButtonClick((Button) v);
break;
case R.id.decimal_button:
case R.id.zero_button:
case R.id.one_button:
case R.id.two_button:
case R.id.three_button:
case R.id.four_button:
case R.id.five_button:
case R.id.six_button:
case R.id.seven_button:
case R.id.eight_button:
case R.id.nine_button:
handleNumberButtonClick((Button) v);
break;
}
}
private void handleClearButtonClick() {
mInputString.setLength(0);
mNumberStack.clear();
mOperatorStack.clear();
mResultTextView.setText("");
}
private void handleEqualsButtonClick() {
if (mInputString.length() == 0) {
return;
}
double result = evaluateExpression();
mResultTextView.setText(String.valueOf(result));
}
private void handleOperatorButtonClick(Button button) {
if (mInputString.length() == 0) {
return;
}
char operator = button.getText().charAt(0);
while (!mOperatorStack.isEmpty() && hasPrecedence(mOperatorStack.peek(), operator)) {
double rightOperand = mNumberStack.pop();
double leftOperand = mNumberStack.pop();
char op = mOperatorStack.pop();
double result = applyOperator(op, leftOperand, rightOperand);
mNumberStack.push(result);
}
mOperatorStack.push(operator);
mInputString.append(operator);
mResultTextView.setText(mInputString.toString());
}
private void handleNumberButtonClick(Button button) {
char digit = button.getText().charAt(0);
mInputString.append(digit);
mResultTextView.setText(mInputString.toString());
}
private double evaluateExpression() {
while (!mOperatorStack.isEmpty()) {
double rightOperand = mNumberStack.pop();
double leftOperand = mNumberStack.pop();
char op = mOperatorStack.pop();
double result = applyOperator(op, leftOperand, rightOperand);
mNumberStack.push(result);
}
return mNumberStack.pop();
}
private boolean hasPrecedence(char op1, char op2) {
if (op2 == '(' || op2 == ')') {
return false;
}
if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) {
return false;
}
return true;
}
private double applyOperator(char op, double leftOperand, double rightOperand) {
switch (op) {
case '+':
return leftOperand + rightOperand;
case '-':
return leftOperand - rightOperand;
case '*':
return leftOperand * rightOperand;
case '/':
return leftOperand / rightOperand;
default:
throw new IllegalArgumentException("Invalid operator: " + op);
}
}
}
```
activity_main.xml
```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/result_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24sp"
android:textAlignment="viewEnd"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingEnd="16dp"
android:paddingStart="16dp"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/clear_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="C"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/divide_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="/"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/multiply_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="*"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/subtract_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="-"
android:layout_weight="1"
android:textSize="18sp"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/seven_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="7"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/eight_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="8"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/nine_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="9"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/add_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="+"
android:layout_weight="1"
android:textSize="18sp"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/four_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="4"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/five_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="5"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/six_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="6"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/decimal_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="."
android:layout_weight="1"
android:textSize="18sp"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/one_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="1"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/two_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="2"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/three_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="3"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/equals_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="="
android:layout_weight="1"
android:textSize="18sp"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/zero_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="0"
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/placeholder_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text=""
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/placeholder_button_2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text=""
android:layout_weight="1"
android:textSize="18sp"/>
<Button
android:id="@+id/placeholder_button_3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text=""
android:layout_weight="1"
android:textSize="18sp"/>
</LinearLayout>
</LinearLayout>
```
阅读全文