xml布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal" > <EditText android:id="@+id/show" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:editable="false" android:gravity="right" android:hint="@string/class3_1" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_marginBottom="15dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="10dp" android:layout_weight="6" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="3" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > <Button android:id="@+id/bt_c" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="C" /> <Button android:id="@+id/bt_del" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="DEL" /> <Button android:id="@+id/bt_d" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="÷" /> <Button android:id="@+id/bt_m" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="×" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > <Button android:id="@+id/bt_7" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="7" /> <Button android:id="@+id/bt_8" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="8" /> <Button android:id="@+id/bt_9" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="9" /> <Button android:id="@+id/bt_di" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="-" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > <Button android:id="@+id/bt_4" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="4" /> <Button android:id="@+id/bt_5" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="5" /> <Button android:id="@+id/bt_6" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="6" /> <Button android:id="@+id/bt_a" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="+" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="2" android:orientation="horizontal" > <LinearLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="3" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal" > <Button android:id="@+id/bt_1" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="1" /> <Button android:id="@+id/bt_2" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="2" /> <Button android:id="@+id/bt_3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="3" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal" > <Button android:id="@+id/bt_0" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="2" android:text="0" /> <Button android:id="@+id/bt_p" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:text="." /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:orientation="vertical" > <Button android:id="@+id/bt_e" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="=" /> </LinearLayout> </LinearLayout> </LinearLayout> </LinearLayout>
java 代码:
package com.example.class3; import java.util.Stack; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import com.example.lesson.R; public class Activity3 extends Activity implements OnClickListener { private EditText show; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.class3_1); show = (EditText) findViewById(R.id.show); /* * 数字键监听 */ findViewById(R.id.bt_0).setOnClickListener(this); findViewById(R.id.bt_1).setOnClickListener(this); findViewById(R.id.bt_2).setOnClickListener(this); findViewById(R.id.bt_3).setOnClickListener(this); findViewById(R.id.bt_4).setOnClickListener(this); findViewById(R.id.bt_5).setOnClickListener(this); findViewById(R.id.bt_6).setOnClickListener(this); findViewById(R.id.bt_7).setOnClickListener(this); findViewById(R.id.bt_8).setOnClickListener(this); findViewById(R.id.bt_9).setOnClickListener(this); /* * 功能键监听 */ findViewById(R.id.bt_c).setOnClickListener(this); findViewById(R.id.bt_p).setOnClickListener(this); findViewById(R.id.bt_del).setOnClickListener(this); findViewById(R.id.bt_e).setOnClickListener(this); /* * 运算符监听 */ findViewById(R.id.bt_di).setOnClickListener(this); findViewById(R.id.bt_d).setOnClickListener(this); findViewById(R.id.bt_a).setOnClickListener(this); findViewById(R.id.bt_m).setOnClickListener(this); } public void onClick(View view) { switch (view.getId()) { case R.id.bt_c: show.setText(""); break; case R.id.bt_del: String text = show.getText().toString(); text = (String) text.subSequence(0, text.length() - 1); show.setText(text); break; case R.id.bt_e: Calculate(); break; default: Button button = (Button) findViewById(view.getId()); show.setText(show.getText() + "" + button.getText()); break; } } private void Calculate() { Stack<Double> num = new Stack<Double>(); Stack<Character> operator = new Stack<Character>(); char[] op = { '#', '+', '-', '×', '÷' }; int[] rules = new int[256]; String express = show.getText().toString(); express += '#'; rules[op[0]] = 0; rules[op[1]] = rules[op[2]] = 1; rules[op[3]] = rules[op[4]] = 2; operator.push('#'); int i = 0, len = express.length(); double value1 = 0, value2 = 0; double value = 0; boolean isNum = false; boolean firstNum = false; boolean isOver = false; boolean isZero = false; boolean isXiao = false; double index = 1; String ans = ""; while (i < len) { char ch = express.charAt(i); if ((ch >= '0' && ch <= '9') || ch == '.') { if (ch == '.') isXiao = true; else { if (isXiao == true) { index *= 0.1; value2 = value2 + index * (ch - '0'); } else value1 = value1 * 10 + ch - '0'; } System.out.println("c = " + ch); System.out.print("value1 = " + value1); System.out.println(" value2 = " + value2); isNum = true; } else if (isNum == true) { value = value1 + value2; if (firstNum == true) value = -value; num.push(value); value1 = value2 = 0; index = 1; isXiao = firstNum = isNum = false; while (rules[ch] <= rules[operator.peek()]) { char c = operator.pop(); if (c == '#') { isOver = true; break; } double num2 = num.pop(); double num1 = num.pop(); if (c == '÷' && num2 == 0) { isZero = true; break; } double v = calcu(num1, c, num2); num.push(v); } if (isOver == true || isZero == true) break; operator.push(ch); } else firstNum = true; i++; } if (isZero == true) ans = "表达式不成立(出现了除数为0的情况)"; else ans = num.pop() + ""; show.setText(express.substring(0, express.length() - 1) + " = " + ans); } private double calcu(double num1, char ch, double num2) { double ans = 0.0; switch (ch) { case '+': ans = num1 + num2; break; case '-': ans = num1 - num2; break; case '×': ans = num1 * num2; break; case '÷': ans = num1 / num2; break; default: break; } return ans; } }