Android實(shí)現(xiàn)計(jì)算器(計(jì)算表達(dá)式/計(jì)算小數(shù)點(diǎn)以及括號(hào))
本文實(shí)例為大家分享了Android實(shí)現(xiàn)計(jì)算器的具體代碼,供大家參考,具體內(nèi)容如下
布局代碼:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="4"
android:focusable="true"
android:focusableInTouchMode="true"
tools:context=".MainActivity">
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#aaaaaa">
<LinearLayout
android:layout_width="0dp"
android:layout_height="200dp"
android:layout_column="0"
android:gravity="right"
android:layout_weight="1">
<EditText
android:id="@+id/content_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:background="@null"
android:hint="0"
android:textSize="20pt" />
</LinearLayout>
</TableRow> <!--計(jì)算表達(dá)式輸入框-->
<TableRow>
<Button
android:id="@+id/btn_c"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="0"
android:layout_weight="1"
android:text="C"
android:textColor="#ff0000"
android:textSize="12pt" />
<Button
android:id="@+id/btn_ce"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="1"
android:layout_weight="1"
android:text="CE"
android:textColor="#ff0000"
android:textSize="12pt" />
<Button
android:id="@+id/btn_aliquot"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="2"
android:layout_weight="1"
android:text="%"
android:textColor="#ff0000"
android:textSize="12pt" />
<Button
android:id="@+id/btn_divide"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="3"
android:layout_weight="1"
android:text="/"
android:textColor="#ff0000"
android:textSize="12pt" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_leftBracket"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="0"
android:layout_span="1"
android:layout_weight="1"
android:text="("
android:textColor="#ff0000"
android:textSize="12pt" />
<Button
android:id="@+id/btn_rightBracket"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="0"
android:layout_span="1"
android:layout_weight="1"
android:text=")"
android:textColor="#ff0000"
android:textSize="12pt" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_seven"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="0"
android:layout_weight="1"
android:text="7"
android:textSize="12pt" />
<Button
android:id="@+id/btn_eight"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="1"
android:layout_weight="1"
android:text="8"
android:textSize="12pt" />
<Button
android:id="@+id/btn_nine"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="2"
android:layout_weight="1"
android:text="9"
android:textSize="12pt" />
<Button
android:id="@+id/btn_multiply"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="3"
android:layout_weight="1"
android:text="*"
android:textColor="#ff0000"
android:textSize="12pt" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_four"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="0"
android:layout_weight="1"
android:text="4"
android:textSize="12pt" />
<Button
android:id="@+id/btn_five"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="1"
android:layout_weight="1"
android:text="5"
android:textSize="12pt" />
<Button
android:id="@+id/btn_six"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="2"
android:layout_weight="1"
android:text="6"
android:textSize="12pt" />
<Button
android:id="@+id/btn_subtract"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="3"
android:layout_weight="1"
android:text="-"
android:textColor="#ff0000"
android:textSize="12pt" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_one"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="0"
android:layout_weight="1"
android:text="1"
android:textSize="12pt" />
<Button
android:id="@+id/btn_two"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="1"
android:layout_weight="1"
android:text="2"
android:textSize="12pt" />
<Button
android:id="@+id/btn_three"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="2"
android:layout_weight="1"
android:text="3"
android:textSize="12pt" />
<Button
android:id="@+id/btn_add"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="3"
android:layout_weight="1"
android:text="+"
android:textColor="#ff0000"
android:textSize="12pt" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_point"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="0"
android:layout_weight="1"
android:text="."
android:textSize="12pt" />
<Button
android:id="@+id/btn_zero"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="1"
android:layout_weight="1"
android:text="0"
android:textSize="12pt" />
<Button
android:id="@+id/btn_equal"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_column="2"
android:layout_weight="2"
android:text="="
android:textColor="#ff0000"
android:textSize="12pt" />
</TableRow>
</TableLayout>
Activicy代碼:
package com.example.newcalculator;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.lang.reflect.Type;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
/*按鈕定義*/
Button btn_one; //1
Button btn_two; //2
Button btn_three; //3
Button btn_four; //4
Button btn_five; //5
Button btn_six; //6
Button btn_seven; //7
Button btn_eight; //8
Button btn_nine; //9
Button btn_zero; //0
Button btn_c; //c
Button btn_ce; //ce
Button btn_aliquot; //%
Button btn_divide; //除號(hào)
Button btn_multiply;//x
Button btn_subtract;//-
Button btn_add; //+
Button btn_point; //.
Button btn_equal; //=
Button btn_leftBracket;//(
Button btn_rightBracket;//)
EditText contentBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initControls();
initClickEvent();
}
//找到控件
private void initControls() {
btn_one = findViewById(R.id.btn_one);
btn_two = findViewById(R.id.btn_two);
btn_three = findViewById(R.id.btn_three);
btn_four = findViewById(R.id.btn_four);
btn_five = findViewById(R.id.btn_five);
btn_six = findViewById(R.id.btn_six);
btn_seven = findViewById(R.id.btn_seven);
btn_eight = findViewById(R.id.btn_eight);
btn_nine = findViewById(R.id.btn_nine);
btn_zero = findViewById(R.id.btn_zero);
btn_c = findViewById(R.id.btn_c);
btn_ce = findViewById(R.id.btn_ce);
btn_aliquot = findViewById(R.id.btn_aliquot);
btn_divide = findViewById(R.id.btn_divide);
btn_multiply = findViewById(R.id.btn_multiply);
btn_subtract = findViewById(R.id.btn_subtract);
btn_add = findViewById(R.id.btn_add);
btn_point = findViewById(R.id.btn_point);
btn_equal = findViewById(R.id.btn_equal);
contentBox = findViewById(R.id.content_box);
btn_leftBracket = findViewById(R.id.btn_leftBracket);
btn_rightBracket = findViewById(R.id.btn_rightBracket);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_one:{
changeVal("1");
}break;
case R.id.btn_two:{
changeVal("2");
}break;
case R.id.btn_three:{
changeVal("3");
}break;
case R.id.btn_four:{
changeVal("4");
}break;
case R.id.btn_five:{
changeVal("5");
}break;
case R.id.btn_six:{
changeVal("6");
}break;
case R.id.btn_seven:{
changeVal("7");
}break;
case R.id.btn_eight:{
changeVal("8");
}break;
case R.id.btn_nine:{
changeVal("9");
}break;
case R.id.btn_zero:{
changeVal("0");
}break;
case R.id.btn_aliquot:{
changeVal("%");
}break;
case R.id.btn_divide:{
changeVal("/");
}break;
case R.id.btn_multiply:{
changeVal("*");
}break;
case R.id.btn_subtract:{
changeVal("-");
}break;
case R.id.btn_add:{
changeVal("+");
}break;
case R.id.btn_rightBracket:{
changeVal(")");
}break;
case R.id.btn_leftBracket:{
changeVal("(");
}break;
case R.id.btn_c:{
funC();
}break;
case R.id.btn_ce:{
funClearAll();
}break;
case R.id.btn_point:{
changeVal(".");
}break;
case R.id.btn_equal:{
String str = contentBox.getText().toString();
Calculator calculator = new Calculator();
Double result = calculator.Eval(str);
contentBox.setText(result.toString());
}break;
}
}
private void changeVal(String flag){
String str = contentBox.getText().toString();
contentBox.setText(str+flag);
}
private void funC(){
String str = contentBox.getText().toString();
str = str.substring(0,str.length()-1);
contentBox.setText(str);
}
private void funClearAll(){
contentBox.setText("");
}
private void initClickEvent(){
btn_one.setOnClickListener(this);
btn_two.setOnClickListener(this);
btn_three.setOnClickListener(this);
btn_four.setOnClickListener(this);
btn_five.setOnClickListener(this);
btn_six.setOnClickListener(this);
btn_seven.setOnClickListener(this);
btn_eight.setOnClickListener(this);
btn_nine.setOnClickListener(this);
btn_zero.setOnClickListener(this);
btn_aliquot.setOnClickListener(this);
btn_divide.setOnClickListener(this);
btn_multiply.setOnClickListener(this);
btn_subtract.setOnClickListener(this);
btn_point.setOnClickListener(this);
btn_equal.setOnClickListener(this);
btn_add.setOnClickListener(this);
btn_c.setOnClickListener(this);
btn_ce.setOnClickListener(this);
btn_rightBracket.setOnClickListener(this);
btn_leftBracket.setOnClickListener(this);
}
}
計(jì)算表達(dá)式代碼:
package com.example.newcalculator;
import java.util.*;
//計(jì)算 2*(4+(88-86)/2)
//計(jì)算 2*(4+(88-86)/2)
class Caculater {
private String[] sArry;//存分割后的字符串
private Stack<String> houx = new Stack<String>();
private Stack<String> fuhao = new Stack<String>();
//結(jié)構(gòu)初始化
Caculater(String str) {
int i = str.length() - 1;
String temp = "";
int j = 0;
Boolean bool = true;
//在符號(hào)左右各添加一個(gè)#字符劃分
while (true) {
if (!bool) break;
if (i == j) {
bool = false;
}
if (str.charAt(j) == '+'
|| str.charAt(j) == '-'
|| str.charAt(j) == '*'
|| str.charAt(j) == '/'
|| str.charAt(j) == '('
|| str.charAt(j) == ')') {
temp += '#';
temp += str.charAt(j);
temp += '#'; //填完后是2#*##(#4#+##(#88#-#86#)##/#32#)#
} else {
temp += str.charAt(j);
}
j++;
}
sArry = temp.split("#+");//用正則表達(dá)式分割成字符串,#+表示一個(gè)或多個(gè)#字符//結(jié)果:[2,*,(,4,+,(,88,-,85,),/,2,)]
}
//后序排列
public void backsort() {
//循環(huán)sArry
for (int i = 0; i < sArry.length; i++) {
//如果不是字符,就直接push入houx棧
if (!sArry[i].equals("+")
&& !sArry[i].equals("-")
&& !sArry[i].equals("*")
&& !sArry[i].equals("/")
&& !sArry[i].equals("(")
&& !sArry[i].equals(")")) {
houx.push(sArry[i]);
continue;
//否則是字符,若符號(hào)棧為空,直接入棧
} else if (fuhao.isEmpty()) {
fuhao.push(sArry[i]);
continue;
//如果為(括號(hào),直接入符號(hào)棧
} else if (sArry[i].equals("(")) {
fuhao.push(sArry[i]);
continue;
//如果為)括號(hào)
} else if (sArry[i].equals(")")) {
/**
* 不斷出棧直到(括號(hào)出現(xiàn)
*
*/
while (!fuhao.peek().equals("(")) {
houx.push(fuhao.pop());
}
fuhao.pop();//清掉(括號(hào)
//如果不為空,且要入的符號(hào)比符號(hào)棧頂?shù)姆?hào)優(yōu)先級(jí)高,則直接push入符號(hào)棧
} else if (!fuhao.isEmpty() && check(sArry[i], fuhao.peek())) { //
fuhao.push(sArry[i]);
continue;
//否則,將符號(hào)棧內(nèi)優(yōu)先級(jí)高的符號(hào)出棧,push入houx棧,再將符號(hào)存進(jìn)符號(hào)棧
} else {
houx.push(fuhao.pop());
fuhao.push(sArry[i]);
continue;
}
}
//遍歷完后,直接將符號(hào)棧內(nèi)的依次出棧,push入houx棧
while (!fuhao.isEmpty()) {
houx.push(fuhao.pop());
}//結(jié)果是:2 4 88 86 - 2 / + * 棧內(nèi)順序
}
//check對(duì)比優(yōu)先級(jí)
private boolean check(String a, String b) {
//如果符號(hào)棧內(nèi)是(括號(hào),直接返true
if (b.equals("(")) {
return true;
}
//如果符號(hào)棧內(nèi)的優(yōu)先級(jí)比要入的高,返回false
if ((b.equals("*") || b.equals("/")) && (a.equals("+") || a.equals("-"))) { //b>a
return false;
}
//。。。。。。。。。。。。。的低,返回true
if ((b.equals("+") || b.equals("-")) && (a.equals("*") || a.equals("/"))) { //b<a
return true;
}
return false;
}
//出棧計(jì)算
public Double suan() {
backsort();//后序排列
//結(jié)果棧end
Stack<Double> end = new Stack<Double>();
//遍歷houx棧
for (int i = 0; i < houx.size(); i++) {
//如果是加號(hào),end pop出來(lái)兩個(gè)數(shù)字,計(jì)算后結(jié)果入棧
if (houx.get(i).equals("+")) {
Double b = end.pop();
Double a = end.pop();
end.push(a + b);
continue;
//如果是減號(hào),end pop出棧兩個(gè)數(shù)字,計(jì)算后結(jié)果入棧
} else if (houx.get(i).equals("-")) {
Double b = end.pop();
Double a = end.pop();
end.push(a - b);
continue;
//如果是乘號(hào),end pop出棧兩個(gè)數(shù)字,計(jì)算后結(jié)果入棧
} else if (houx.get(i).equals("*")) {
Double b = end.pop();
Double a = end.pop();
end.push(a * b);
continue;
//如果是除號(hào),end pop出棧兩個(gè)數(shù)字,計(jì)算后結(jié)果入棧
} else if (houx.get(i).equals("/")) {
Double b = end.pop();
Double a = end.pop();
end.push(a / b);
continue;
} else if (houx.get(i).isEmpty()) {
continue;
} else {
//不是符號(hào),也就是數(shù)字的情況,Integer.parseInt轉(zhuǎn)int型, push入棧
end.push(Double.parseDouble(houx.get(i)));
}
}
//輸出結(jié)果
return end.pop();
}
}
public class Calculator {
static String str="";
public Double Eval(String str){
//結(jié)構(gòu)化
Caculater cl = new Caculater(str);
//計(jì)算
Double result = cl.suan();
return result;
}
}
關(guān)于計(jì)算器的精彩文章請(qǐng)查看《計(jì)算器專題》 ,更多精彩等你來(lái)發(fā)現(xiàn)!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android用RecyclerView實(shí)現(xiàn)動(dòng)態(tài)添加本地圖片
本篇文章主要介紹了Android用RecyclerView實(shí)現(xiàn)動(dòng)態(tài)添加本地圖片,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
Android中Uri和Path之間的轉(zhuǎn)換的示例代碼
本篇文章主要介紹了Android中Uri和Path之間的轉(zhuǎn)換的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Android實(shí)現(xiàn)多級(jí)樹(shù)形選擇列表
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)多級(jí)樹(shù)形選擇列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Android通過(guò)反射實(shí)現(xiàn)強(qiáng)制停止應(yīng)用程序的方法
這篇文章主要介紹了Android通過(guò)反射實(shí)現(xiàn)強(qiáng)制停止應(yīng)用程序的方法,涉及Android的反射機(jī)制與進(jìn)程操作的相關(guān)技巧,需要的朋友可以參考下2016-02-02
Android學(xué)習(xí)之AppWidget高級(jí)效果
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)之AppWidget高級(jí)效果的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-08-08
Android串口開(kāi)發(fā)之使用JNI實(shí)現(xiàn)ANDROID和串口通信詳解
這篇文章主要給大家介紹了關(guān)于Android串口開(kāi)發(fā)之使用JNI實(shí)現(xiàn)ANDROID和串口通信的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
Android實(shí)現(xiàn)倒計(jì)時(shí)方法匯總
這篇文章主要為大家詳細(xì)總結(jié)了Android實(shí)現(xiàn)倒計(jì)時(shí)的3種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android?App應(yīng)用退到后臺(tái)顯示通知的實(shí)現(xiàn)方法
當(dāng)用戶收到app發(fā)過(guò)來(lái)的消息時(shí),如果app沒(méi)有在前臺(tái)打開(kāi),需要提醒用戶有新的消息,所以這篇文章主要給大家介紹了關(guān)于Android?App應(yīng)用退到后臺(tái)顯示通知的實(shí)現(xiàn)方法,需要的朋友可以參考下2022-01-01

