一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android計(jì)算器——入門(mén)

 印度阿三17 2019-07-29

Android計(jì)算器—入門(mén)

作者:黑衣俠客


一.前言

這是我寫(xiě)的第一個(gè)App,利用的是《安卓第一行代碼》第三章,UI控件的一些知識(shí),然后整體結(jié)構(gòu)綜合了一些CSDN博客和簡(jiǎn)書(shū)上的一些著作,同樣,在寫(xiě)Android計(jì)算器,我將近花費(fèi)了一周的時(shí)間,研究一些層次結(jié)構(gòu),UI控件,以及一些需要用到但書(shū)中沒(méi)有的一些功能關(guān)鍵字和數(shù)據(jù)結(jié)構(gòu),然后,在寫(xiě)Android計(jì)算器的時(shí)候,Android studio總會(huì)出現(xiàn)一些不知名的錯(cuò)誤,然后一點(diǎn)一點(diǎn)的查和修改。另外,如果電腦配置不高的話(huà),用虛擬機(jī)的話(huà),會(huì)編譯運(yùn)行的特別慢,所以,建議大家多用下真機(jī)測(cè)試,特別快。接下來(lái),我將會(huì)為大家分享我做計(jì)算器的基本步驟。

二.準(zhǔn)備

1.編譯器:Android Studio(有很多功能待我們發(fā)現(xiàn))

2.Android計(jì)算器所需知識(shí):
1.在這之前有簡(jiǎn)單的Java基礎(chǔ),了解Java一些關(guān)鍵字的使用
2.對(duì)《第一行代碼》的第三章(UI開(kāi)發(fā)大致掌握,學(xué)會(huì)運(yùn)用)
3.對(duì)計(jì)算器計(jì)算的算法大致掌握(中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,后綴表達(dá)式的運(yùn)算)
4.后綴表達(dá)式需要用到的關(guān)鍵字BigDecimal
3.學(xué)會(huì)使用百度,谷歌,瀏覽一些必要的資料
當(dāng)然也可以去CSDN官網(wǎng)去看一些別人所寫(xiě)的文章,進(jìn)行學(xué)習(xí),然后好好看一遍別人寫(xiě)的代碼,仔細(xì)研究一下,你會(huì)收獲很多知識(shí)的。
4.大致了解Android Studio的基本功能
三.實(shí)現(xiàn)控件的一些分布,并且實(shí)現(xiàn)渲染

這是我用真機(jī)側(cè)試,渲染后的結(jié)果。


代碼部分

**在這里我采用的是百分比布局,但是百分比是新增布局,所以必須自己動(dòng)手增加相應(yīng)的依賴(lài)。在Android Studio中打開(kāi)app的build.grade文件,在dependencies閉包中添加這樣的代碼
在這里插入圖片描述
其中的29.0.1根據(jù)自己的版本填寫(xiě),例如我的是:

注意:填寫(xiě)位置的圖標(biāo)為 :

添加之后,編輯面板頂部會(huì)出現(xiàn)一行提示,點(diǎn)擊Sync now 稍等片刻即可

1.button的周邊邊框

**因?yàn)锳ndroid對(duì)button不能通過(guò)對(duì)屬性的更改進(jìn)行變化,所以我們需要在內(nèi)部進(jìn)行修改,創(chuàng)建一個(gè)圖片文件,設(shè)置背景色以及邊框的寬度和顏色,然后把button的背景屬性設(shè)置為圖片

  • 首先在Android Studio中在app/src/main/drawable文件夾中創(chuàng)建一個(gè)Drawable resource file
  • 之后再?gòu)棾龅拇翱谠O(shè)置文件名,文件名隨意,我設(shè)置的是shape_white
  • 因?yàn)槲覄?chuàng)建了三種顏色,所以就創(chuàng)建了3個(gè)文件,另外兩個(gè)文件名分別是:shape_blue,shape_yellow(當(dāng)時(shí)加減乘除都用的是黃色,后來(lái)改用灰色的了,之后文件名就懶的改了~~)
  • 下面是我這個(gè)文件的內(nèi)容:
//不過(guò)下面代碼的注釋最好刪掉
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas./apk/res/android">
    <solid
        android:color="#ffffff"/>//設(shè)置背景顏色(白色)
    <stroke
        android:width="0.01dp"http://設(shè)置邊框的寬度
        android:color="#ccc0c0c0"/>//設(shè)置邊框的顏色
</shape>

剩下的灰色和藍(lán)色只需要改變背景顏色就好了

android:color="#f0ffff"/>//藍(lán)色
android:color="#fff0f0f0"/>//銀灰色
android:color="#ff0fff"/>//紫色

這里我就不依次介紹顏色屬性了


之后
在你布局的文件(例如app/src/main/res/layout/activity_main.xml)中,對(duì)需要顯示的邊框的button中添加設(shè)置背景這行代碼

<Button
	android:id="@ id/button0"
	android:background="@drawable/click_white"http://設(shè)置button背景顏色
	/>

2.實(shí)現(xiàn)Button的點(diǎn)擊變色功能

我的計(jì)算器中,點(diǎn)擊按鍵時(shí)變?yōu)樽仙?/p>

  • 首先在Android Studio(app/src/main/res/drawable)文件夾中創(chuàng)建一個(gè)Drawable resource file,之后創(chuàng)建文件名,我的是click_purple
  • 然后把代碼修改為:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas./apk/res/android">
    <item android:drawable="@drawable/shape_purple_bg"http://設(shè)置點(diǎn)擊之后的顏色
        android:state_enabled="true"
        android:state_pressed="true"/>//當(dāng)button被點(diǎn)擊時(shí)
    <item android:drawable="@drawable/shape_white_bg"http://設(shè)置背景(點(diǎn)擊之前的顏色)
        android:state_enabled="true"
        android:state_pressed="false"/>//當(dāng)未被點(diǎn)擊時(shí)
</selector>

這串代碼的含義是:由白色變?yōu)樽仙?br> 然后說(shuō)明一下這個(gè)代碼需要兩種顏色文件,剛剛我們已經(jīng)創(chuàng)建了一個(gè),再創(chuàng)建一個(gè)即可
例如:創(chuàng)建紫色的顏色文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas./apk/res/android">
    <solid
        android:color="#ff0fff"/>//紫色
    <stroke
        android:width="0.01dp"
        android:color="#ccc0c0c0"/>
</shape>

3.字體自適應(yīng)顯示框而改變大小

例如:
------------
添加一串代碼

//同樣添加一串代碼
<TextView
	android:"@ id/text_view"
	app:autoSizeTextType="uniform"http://字體自適應(yīng)功能
	app:layout_heightPercent="25%"http://用百分比調(diào)節(jié)顯示模塊的高度
	app:layout_widthPercent="100%"http://用百分比調(diào)節(jié)顯示模塊的寬度
	/>
  • 但是這種做法同樣存在缺點(diǎn),就是他的輸入框有多大,他顯示的字體就有多大,所以這就需要我們對(duì)他進(jìn)行一些限制,限制最大字體,最小字體,和每次變化的字體大小

具體一些控件的說(shuō)明就說(shuō)到這兒了,接下來(lái),我們看一下控件部分的代碼
activity_main.xml

<androidx.percentlayout.widget.PercentRelativeLayout//百分比布局,一定要看清,因?yàn)檫€有一個(gè)androidx...中也帶Percent
    xmlns:android="http://schemas./apk/res/android"
    xmlns:app="http://schemas./apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@ id/buttonc"
        android:layout_width="0dp"http://沒(méi)有具體作用,因?yàn)檫\(yùn)用百分比布局,這里的0dp是一種規(guī)范
        android:layout_height="0dp"
        android:layout_alignParentLeft="true"http://控制控件的位置
        android:layout_alignParentBottom="true"http://控制控件的位置
        android:layout_gravity="bottom"
        android:text="C"http://控件顯示的名稱(chēng)
        android:textSize="40sp"http://控件名稱(chēng)字體大小
        app:layout_heightPercent="14%"http://控件高度占屏幕高度的百分比
        app:layout_widthPercent="25%"http://控件寬度占屏幕寬度的百分比
        android:background="@drawable/click_purple_blue"/>//點(diǎn)擊事件的顏色(點(diǎn)擊之前是藍(lán)色,點(diǎn)擊之后是紫色)
    <Button
        android:id="@ id/button1"
        android:textSize="40sp"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:layout_above="@id/buttonc"
        android:text="1"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/buttond"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:text="="
        android:textSize="40sp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:background="@drawable/click_purple_blue"/>
    <Button
        android:id="@ id/button0"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_toRightOf="@id/buttonc"
        android:layout_alignParentBottom="true"
        android:text="0"
        android:textSize="40sp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/buttonDot"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_toRightOf="@id/button0"
        android:layout_alignParentBottom="true"
        android:text="."
        android:textSize="40sp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:background="@drawable/click_purple_blue"/>
    <Button
        android:id="@ id/button2"
        android:textSize="40sp"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:layout_toRightOf="@id/button1"
        android:layout_above="@id/button0"
        android:text="2"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/button3"
        android:textSize="40sp"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:layout_toRightOf="@id/button2"
        android:layout_above="@id/buttonDot"
        android:text="3"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/button4"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="4"
        android:textSize="40sp"
        android:layout_above="@id/button1"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/button5"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="5"
        android:textSize="40sp"
        android:layout_above="@id/button2"
        android:layout_toRightOf="@id/button4"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/button6"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="6"
        android:textSize="40sp"
        android:layout_above="@id/button3"
        android:layout_toRightOf="@id/button5"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/buttonj"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text=" "
        android:textSize="40sp"
        android:layout_above="@id/buttonchenG"
        android:layout_toRightOf="@id/button6"
        android:background="@drawable/click_purple_yellow"
        />
    <Button
        android:id="@ id/buttonchenG"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="*"
        android:textSize="40sp"
        android:layout_above="@id/buttond"
        android:layout_toRightOf="@id/button3"
        android:background="@drawable/click_purple_yellow"
        />
    <Button
        android:id="@ id/button7"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="7"
        android:textSize="40sp"
        android:layout_above="@id/button4"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/button8"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="8"
        android:textSize="40sp"
        android:layout_above="@id/button5"
        android:layout_toRightOf="@id/button7"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/button9"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="9"
        android:textSize="40sp"
        android:layout_above="@id/button6"
        android:layout_toRightOf="@id/button8"
        android:background="@drawable/click_purple_white"/>
    <Button
        android:id="@ id/buttonjian"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="-"
        android:textSize="40sp"
        android:layout_above="@id/buttonj"
        android:layout_toRightOf="@id/button9"
        android:background="@drawable/click_purple_yellow"
        />
    <Button//左括號(hào)
        android:id="@ id/buttonzuokuo"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:text="("
        android:textSize="40sp"
        android:layout_above="@id/button7"
        android:background="@drawable/click_purple_blue"/>
    <Button//右括號(hào)
        android:id="@ id/buttonyoukuo"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text=")"
        android:layout_toRightOf="@id/buttonc"
        android:layout_above="@id/button8"
        android:textSize="40sp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:background="@drawable/click_purple_blue"/>
    <Button//除號(hào)
        android:id="@ id/buttonchufa"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="/"
        android:layout_toRightOf="@id/buttonyoukuo"
        android:layout_above="@id/button9"
        android:textSize="40sp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:background="@drawable/click_purple_yellow"/>
    <Button//刪除鍵
        android:id="@ id/buttons"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="Del"
        android:layout_toRightOf="@id/buttonchufa"
        android:layout_above="@id/buttonjian"
        android:textSize="30sp"
        app:layout_heightPercent="14%"
        app:layout_widthPercent="25%"
        android:background="@drawable/click_purple_blue"/>
    <TextView//顯示
        android:id="@ id/text_view"
        android:background="#FAFFF0"http://背景顏色
        android:autoSizeTextType="uniform"http://字體自適應(yīng)
        app:autoSizeMaxTextSize="80sp"http://規(guī)定最大字體
        app:autoSizeMinTextSize="20sp"http://規(guī)定最小字體
        app:autoSizeStepGranularity="4sp"http://每次字體改變的大小
        android:layout_height="0dp"http://規(guī)范
        android:layout_width="0dp"http://規(guī)范
        android:textSize="40sp"http://字體最初大小
        app:layout_heightPercent="30%"http://顯示的高度的百分比
	app:layout_widthPercent="100%"/>

</androidx.percentlayout.widget.PercentRelativeLayout>

4.活動(dòng)代碼的異常處理

  • 1.在開(kāi)始輸入時(shí),輸入“-”時(shí),代表負(fù)號(hào),此時(shí),屏幕顯示的應(yīng)該是“(-”。
  • 2.對(duì)于“)”這個(gè)符號(hào)來(lái)說(shuō),在運(yùn)算時(shí),需要先查明左右括號(hào)數(shù)是否相等,若不相等應(yīng)該報(bào)錯(cuò)
  • 3.當(dāng)輸出結(jié)果有問(wèn)題時(shí),應(yīng)該報(bào)錯(cuò),輸出Error
  • 4.如果減號(hào)前面有加減乘除號(hào)時(shí),該減號(hào)系統(tǒng)內(nèi)部,應(yīng)該當(dāng)做負(fù)號(hào)處理
  • 5.還有就是小數(shù)點(diǎn)的一些問(wèn)題,例如前面自動(dòng)補(bǔ)零,等等
  • 6.還有就是刪除負(fù)號(hào)時(shí),點(diǎn)擊一下del,刪除兩個(gè)
    字符,這個(gè)需要加一個(gè)判斷,在加判斷時(shí)注意一下空間分配問(wèn)題
  • 7.當(dāng)然,還有很多,就不依次列舉了

MainActivity代碼

package com.example.calculation;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView textView;
    private StringBuffer sb=new StringBuffer();
    private StringBuffer str=new StringBuffer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       //定義控件
        Button button0=findViewById(R.id.button0);
        Button button1=findViewById(R.id.button1);
        Button button2=findViewById(R.id.button2);
        Button button3=findViewById(R.id.button3);
        Button button4=findViewById(R.id.button4);
        Button button5=findViewById(R.id.button5);
        Button button6=findViewById(R.id.button6);
        Button button7=findViewById(R.id.button7);
        Button button8=findViewById(R.id.button8);
        Button button9=findViewById(R.id.button9);
        Button buttonj=findViewById(R.id.buttonj);
        Button buttonjian=findViewById(R.id.buttonjian);
        Button buttonzuokuo=findViewById(R.id.buttonzuokuo);
        Button buttonyoukuo=findViewById(R.id.buttonyoukuo);
        Button buttonchenG=findViewById(R.id.buttonchenG);
        Button buttonc=findViewById(R.id.buttonc);
        Button buttond=findViewById(R.id.buttond);
        Button buttonDot=findViewById(R.id.buttonDot);
        Button buttons=findViewById(R.id.buttons);
        Button buttonchufa=findViewById(R.id.buttonchufa);
        textView =findViewById(R.id.text_view);
        button0.setOnClickListener(this);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
        button4.setOnClickListener(this);
        button5.setOnClickListener(this);
        button6.setOnClickListener(this);
        button7.setOnClickListener(this);
        button8.setOnClickListener(this);
        button9.setOnClickListener(this);
        buttonc.setOnClickListener(this);
        buttonchufa.setOnClickListener(this);
        buttonchenG.setOnClickListener(this);
        buttonjian.setOnClickListener(this);
        buttonj.setOnClickListener(this);
        buttond.setOnClickListener(this);
        buttonDot.setOnClickListener(this);
        buttons.setOnClickListener(this);
        buttonzuokuo.setOnClickListener(this);
        buttonyoukuo.setOnClickListener(this);
    }
    private int count_negative=0;
    private boolean equals=false;
    private int count_bracket_left=0;//左括號(hào)個(gè)數(shù)標(biāo)記
    private int count_bracket_right=0;//右括號(hào)個(gè)數(shù)標(biāo)記
    private int a=0;//刪除時(shí)當(dāng)做記錄的指針
    @Override
    public void onClick(View view){
        switch(view.getId()){
            case R.id.button0:
                if(equals){
                    sb =sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("0");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){///如果前面是右括號(hào)那么在0前補(bǔ)充乘號(hào)
                        sb.append("*0");
                    }
                    else{
                        sb.append("0");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button1:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("1");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*1");
                    }
                    else{
                        sb.append("1");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button2:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("2");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*2");
                    }
                    else{
                        sb.append("2");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button3:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("3");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*3");
                    }
                    else{
                        sb.append("3");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button4:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("4");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*4");
                    }
                    else{
                        sb.append("4");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button5:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("5");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*5");
                    }
                    else{
                        sb.append("5");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button6:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("6");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*6");
                    }
                    else{
                        sb.append("6");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button7:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("7");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*7");
                    }
                    else{
                        sb.append("7");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button8:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("8");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*8");
                    }
                    else{
                        sb.append("8");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.button9:
                if(equals){
                    sb=sb.delete(0,sb.length());
                    equals=false;
                }
                if(sb.length()==0){
                    sb.append("9");
                }else{
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*9");
                    }
                    else{
                        sb.append("9");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.but
                if(equals){
                    equals=false;
                }
                if(sb.length()!=0&&a==0){
                    if(sb.charAt(sb.length()-1)=='-'&&sb.charAt(sb.length()-2)=='('||sb.charAt(sb.length()-1)=='.'&&sb.charAt(sb.length()-2)=='0'){
                        sb=sb.deleteCharAt(sb.length()-1);
                        sb=sb.deleteCharAt(sb.length()-1);
                    }else{
                        sb=sb.deleteCharAt(sb.length()-1);
                    }
                }
                else if(sb.length()!=0&&a==1){
                    sb=sb.delete(0,sb.length());
                }
                textView.setText(sb.toString());
                a=0;
                break;
            case R.id.buttonc:
                if(equals){
                    equals=false;
                }
                sb=sb.delete(0,sb.length());
                textView.setText(sb.toString());
                break;
            case R.id.buttonzuokuo:
                if(equals){
                    equals=false;
                }
                if(sb.length()>0&&(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9')){
                    sb=sb.append("*(");
                }
                if(sb.length()==0){
                    sb.append("(");
                }
                if(sb.length()>0&&(sb.charAt(sb.length()-1)=='*'||sb.charAt(sb.length()-1)=='/'||sb.charAt(sb.length()-1)==' '||sb.charAt(sb.length()-1)=='-')){
                    sb=sb.append("(");
                }
                textView.setText(sb.toString());
                break;
            case R.id.buttonyoukuo:
                if(equals){
                    equals=false;
                }
                int count_num=0;
                int Sum=0;
                int num=0;
                count_bracket_left=count_bracket_right=0;
                if(sb.length()!=0){
                    for(int i=sb.length()-1;i>=0;i--){
                        if(count_bracket_left==0&&(sb.charAt(i)>='0'&&sb.charAt(i)<='9')){
                            count_num  ;
                        }
                        if(sb.charAt(i)=='('){
                            count_bracket_left  ;

                        }
                        if(sb.charAt(i)==')'){
                            count_bracket_right  ;
                        }
                    }
                    if((count_bracket_left>count_bracket_right)&&count_num>0){
                        if(sb.charAt(sb.length()-1)!='-'&&sb.charAt(sb.length()-1)!=' '&&sb.charAt(sb.length()-1)!='*'&&sb.charAt(sb.length()-1)!='/'){
                            sb.append(")");
                        }
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.buttonj:
                if(equals){
                    equals=false;
                }
                if(sb.length()!=0){
                    if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'||sb.charAt(sb.length()-1)=='.'){
                        if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'){
                            sb.append(" ");
                        }
                        if(sb.charAt(sb.length()-1)=='.'){
                            sb.append("0 ");
                        }
                    }
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append(" ");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.buttonjian:
                if(equals){
                    equals=false;
                }
                if(sb.length()!=0){
                    if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'||sb.charAt(sb.length()-1)=='.'){
                        if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'){
                            sb.append("-");
                        }
                        if(sb.charAt(sb.length()-1)=='.'){
                            sb.append("0-");
                        }
                    }
                    else if(sb.charAt(sb.length()-1)==')'){
                        sb.append("-");
                    }
                    else if(sb.charAt(sb.length()-1)=='('){
                        sb.append("(-");
                    }
                    else if(sb.charAt(sb.length()-1)==' '||sb.charAt(sb.length()-1)=='-'||sb.charAt(sb.length()-1)=='*'||sb.charAt(sb.length()-1)=='/'){
                        sb.append("(-");
                    }
                }
                else{
                    sb.append("(-");
                }
                textView.setText(sb.toString());
                break;
            case R.id.buttonchenG:
                if(equals){
                    equals=false;
                }
                if(sb.length()!=0){
                    if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'||sb.charAt(sb.length()-1)=='.'){
                        if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'){
                            sb.append("*");
                        }
                        if(sb.charAt(sb.length()-1)=='.'){
                            sb.append("0*");
                        }
                    }
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("*");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.buttonchufa:
                if(equals){
                    equals=false;
                }
                if(sb.length()!=0){
                    if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'||sb.charAt(sb.length()-1)=='.'){
                        if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'){
                            sb.append("/");
                        }
                        if(sb.charAt(sb.length()-1)=='.'){
                            sb.append("0/");
                        }
                    }
                    if(sb.charAt(sb.length()-1)==')'){
                        sb.append("/");
                    }
                }
                textView.setText(sb.toString());
                break;
            case R.id.buttonDot:
                int apps=0;
                if(equals){
                    equals=false;
                }
                if(sb.length()!=0){
                    if(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9'){
                        for(int i=sb.length()-2;i>=0;i--){
                            if(sb.charAt(i)=='.'){
                                apps=1;
                                break;
                            }
                            else if(sb.charAt(i)=='('||sb.charAt(i)==' '||sb.charAt(i)=='-'||sb.charAt(i)=='*'||sb.charAt(i)=='/'){
                                break;
                            }
                        }
                        if(apps==0){
                            sb.append(".");
                        }
                    }
                    if(sb.charAt(sb.length()-1)=='('||sb.charAt(sb.length()-1)==')'){
                        if(sb.charAt(sb.length()-1)==')'){
                            sb.append("*0.");
                        }else{
                            sb.append("0.");
                        }
                    }
                    if(sb.charAt(sb.length()-1)=='*'||sb.charAt(sb.length()-1)=='/'||sb.charAt(sb.length()-1)==' '||sb.charAt(sb.length()-1)=='-'){
                        sb.append("0.");
                    }
                }
                else{
                    sb.append("0.");
                }
                textView.setText(sb.toString());
                break;
            case R.id.buttond:
                int count_left=0;
                int count_right=0;
                if(equals){
                    equals=false;
                }
                if(sb.length()!=0){
                    for(int i=sb.length()-1;i>=0;i--){
                        if(sb.charAt(i)==')'){
                            count_right  ;
                        }
                        if(sb.charAt(i)=='('){
                            count_left  ;
                        }
                    }
                    if(count_left!=count_right){
                        Toast.makeText(MainActivity.this, "請(qǐng)注意括號(hào)匹配?。。?, Toast.LENGTH_SHORT).show();
                    }
                    if(count_left==count_right&&(sb.charAt(sb.length()-1)>='0'&&sb.charAt(sb.length()-1)<='9')||sb.charAt(sb.length()-1)==')'){
                        try{
                            textView.setText(InfixToSuffix.Cal(InfixToSuffix.Suffix(sb)));
                            a=1;
                            //利用類(lèi)名兩次調(diào)用靜態(tài)方法,將后綴表達(dá)式的結(jié)果輸出在屏幕上
                            sb=sb.delete(0,sb.length());
                            sb.append(textView.getText().toString());
                        }catch(Exception e){
                            textView.setText("Error!!!");
                            sb=sb.delete(0,sb.length());
                        }
                    }
                }
                break;
            default:
                break;
        }
    }
}//如果等號(hào)前面是小數(shù)點(diǎn)的話(huà),就在小數(shù)點(diǎn)后補(bǔ)0

5.計(jì)算器算法

1.中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

2.后綴表達(dá)式計(jì)算

另外后續(xù)用代碼實(shí)現(xiàn)時(shí)還是有些困難,需要慢慢用心看


6.計(jì)算的具體代碼

在MainActivity同一個(gè)包下創(chuàng)建class文件,命名為InfixToSuffix,將其作為計(jì)算方法
代碼如下:

package com.example.calculation;
import android.util.Log;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;

public class InfixToSuffix {
    //將中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式
    public static ArrayList Suffix(StringBuffer str) {
        for (int i = 1; i < str.length(); i  ) {//在負(fù)數(shù)的負(fù)號(hào)前添加一個(gè)“0”
            if (str.charAt(i) == '-' && str.charAt(i - 1) == '(') {//識(shí)別負(fù)數(shù)
                str.insert(i, '0');
            }
        }
        StringBuilder temp = new StringBuilder();
        List<String> list = new ArrayList<>();
        ArrayList<String> result = new ArrayList<>();//將中綴表達(dá)式轉(zhuǎn)換后的后綴表達(dá)式儲(chǔ)存在result數(shù)組中
        for (int i = 0; i < str.length(); i  ) {//遍歷整個(gè)中綴表達(dá)式
            if ((str.charAt(i) >= '0' && str.charAt(i) <= '9') || str.charAt(i) == '.') {//檢測(cè)數(shù)字和小數(shù)點(diǎn)
                if (str.charAt(i) == '.' && temp.length() == 0) {
                    temp.append(0);
                    temp.append(str.charAt(i));
                } else {
                    temp.append(str.charAt(i));
                }
                if (i == str.length() - 1) {//該步驟的作用是取決于上一步的else中的,例如:假設(shè)中綴表達(dá)式?jīng)]有小數(shù)點(diǎn)時(shí),那么最后一位如果為數(shù)字,就先執(zhí)行else里的命令,然后將temp全部輸入到list里
                    list.add(temp.toString());//將temp中的全部添加到list中
                }
            } else {//符號(hào)進(jìn)到這里
                if (temp.length() != 0)
                    list.add(temp.toString());
                list.add(String.valueOf((str.charAt(i))));//將StringBuffer型的str.charAt(i)轉(zhuǎn)化為String類(lèi)型的,添加到list數(shù)組中
                temp.delete(0, temp.length());//temp清空
            }
        }//以上步驟就是將StringBuffe類(lèi)型轉(zhuǎn)換為String類(lèi)型,中綴表達(dá)式不變
        for (String aList : list) {
            System.out.println(aList   "");
        }
        System.out.println();
        Stack<String> stack = new Stack<>();
        Map<Character, Integer> map = new HashMap<>();
        //Character代表字符類(lèi),表示對(duì)單個(gè)字符進(jìn)行操作,其基本數(shù)據(jù)類(lèi)型為char。
        //Integer為復(fù)雜數(shù)據(jù)類(lèi)型,是int的封裝類(lèi),其初始值為null
        map.put('(', 2);//定義符號(hào)的優(yōu)先級(jí)
        map.put(')', 2);
        map.put('*', 1);
        map.put('/', 1);
        map.put(' ', 0);
        map.put('-', 0);
        for (String s : list) {
            if (s.equals("*") || s.equals("/") || s.equals(" ") || s.equals("-") || s.equals("(") || s.equals(")")) {
                if (stack.size() == 0) {
                    stack.push(s);//如果當(dāng)前棧內(nèi)沒(méi)有元素,讓符號(hào)直接進(jìn)棧
                } else {
                    if (s.equals(")")) {
                        if (!stack.empty()) {
                            while (!stack.peek().equals("(")) {
                                result.add(stack.pop());
                                if (stack.empty()) {
                                    break;
                                }
                            }
                            if (!stack.empty()) {
                                if (stack.peek().equals("("))//查看棧頂對(duì)象而不移除它
                                    stack.pop();
                            }
                        }
                    } else {
                        if (stack.peek().charAt(0) != '(') {
                            if (map.get(s.charAt(0)) > map.get(stack.peek().charAt(0))) {
                                stack.push(s);
                            } else {
                                while ((map.get(s.charAt(0)) <= map.get(stack.peek().charAt(0))) && !stack.empty()) {
                                    result.add(stack.pop());
                                    if (stack.empty()) {
                                        break;
                                    }
                                    if (stack.peek().equals("(")) {
                                        break;
                                    }
                                }
                                stack.push(s);
                            }
                        } else {
                            stack.push(s);
                        }
                    }
                }
            } else {
                result.add(s);
            }
        }
        while (!stack.empty()) {
            result.add(stack.pop());
        }
        return result;
    }

    //將得到的后綴表達(dá)式進(jìn)行運(yùn)算
    public static String Cal(ArrayList arrayList) {
        int length = arrayList.size();
        String[] arr = new String[length];
        for (int i = 0; i < arrayList.size(); i  ) {
            arr[i] = (String) arrayList.get(i);
        }
        List<String> list = new ArrayList<>();
        for (String anArr : arr) {
            int size = list.size();
            switch (anArr) {
                case " ":
                    BigDecimal a = new BigDecimal(list.remove(size - 2)).add(new BigDecimal(list.remove(size - 2)));
                    list.add(a.stripTrailingZeros().toString());//用科學(xué)計(jì)數(shù)法向list中輸入字符串
                    break;
                case "-":
                    BigDecimal b = new BigDecimal(list.remove(size - 2)).subtract(new BigDecimal(list.remove(size - 2)));
                    list.add(b.stripTrailingZeros().toString());
                    break;
                case "*":
                    BigDecimal c = new BigDecimal(list.remove(size - 2)).multiply(new BigDecimal(list.remove(size - 2)));
                    list.add(c.stripTrailingZeros().toString());
                    break;
                case "/":
                    BigDecimal d = new BigDecimal(list.remove(size - 2)).divide(new BigDecimal(list.remove(size - 2)), 10, BigDecimal.ROUND_HALF_UP);
                    list.add(d.stripTrailingZeros().toString());
                    break;
                default:
                    list.add(anArr);
                    break;
            }
        }
        if (list.size() == 1) {
            if (list.get(0).length() < 30) {
                BigDecimal bd = new BigDecimal(list.get(0));
                return bd.toPlainString();
            } else {
                double d = Double.valueOf(list.get(0));
                return String.valueOf(d);
            }
        } else {
            return "運(yùn)算失敗";
        }
    }
}

來(lái)源:https://www./content-4-368001.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    欧美一级特黄特色大色大片| 高清国产日韩欧美熟女| 好吊视频一区二区在线| 出差被公高潮久久中文字幕| 邻居人妻人公侵犯人妻视频| 中文字幕佐山爱一区二区免费| 亚洲国产四季欧美一区| 国产一区二区三区口爆在线| 久久大香蕉精品在线观看| 久久精品国产亚洲av麻豆尤物| 日韩国产亚洲欧美激情| 国产水滴盗摄一区二区| 一区二区三区日韩中文| 国产亚洲中文日韩欧美综合网| 亚洲一区二区三区免费的视频 | 欧美一级黄片免费视频| 色播五月激情五月婷婷| 欧美人妻一区二区三区| 国产欧美高清精品一区| 中文字幕91在线观看| 欧美黄色黑人一区二区| 中文字幕久久精品亚洲乱码| 久久这里只精品免费福利| 国产女高清在线看免费观看| 亚洲国产精品无遮挡羞羞| 欧美二区视频在线观看| 91久久精品中文内射| 国产熟女高清一区二区| 国产精品一区二区视频大全| 免费特黄欧美亚洲黄片| 国产一区二区三区口爆在线| 日韩成人动画在线观看| 熟女乱一区二区三区四区| 懂色一区二区三区四区| 黑丝国产精品一区二区| 人妻久久这里只有精品| 国产又色又爽又黄又免费| 日韩三极片在线免费播放| 欧美日韩亚洲国产综合网| 无套内射美女视频免费在线观看| 中文字幕91在线观看|