Android,간이 계산기 기능 구현

21531 단어 Android계산기
이 프로젝트 는 안 드 로 이 드 가 계산기 기능 을 실현 하 는 구체 적 인 코드 를 공유 하여 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
프로젝트 소개
선수 종목.가감 승제 와 괄호 연산 을 실현 할 수 있다.
개발 방향
인터페이스 레이아웃
 1.인터페이스 레이아웃 은 세 가지 로 나 뉜 다.공식 텍스트 구역,결과 텍스트 구역,버튼 구역 이다.
 2.버튼 을 눌 러 수학 공식 을 입력 하고 공식 텍스트 구역 에 실시 간 으로 보 여 줍 니 다.
 3.등 호 를 누 르 면 계산 결 과 는 결과 텍스트 에 표 시 됩 니 다.
 4.데이터 비우 기와 문자 삭제 기능 도 있 습 니 다.
계산 논리
 1.접미사 표현 식 을 접미사 표현 식 으로 변환
 2.접미사 표현 식 을 계산 하여 결 과 를 얻는다.
기타 설명
스 택 데이터 구조 에 대한 간단 한 설명:
 1.스 택 데이터 구 조 는 핀 과 같이 먼저 눌 러 넣 은 총알 을 쏜 다음 에 눌 러 넣 은 총알 을 먼저 쏜 다.
 2.스 택 에 들 어가 기:스 택 에 원 소 를 넣 고 스 택 상단 지침 을 변경 합 니 다.
 3.스 택 나 가기:스 택 에서 원 소 를 꺼 내 고 스 택 상단 지침 을 변경 합 니 다.
 4.창고 지붕 을 보고 창고 지붕 요 소 를 얻 지만 창고 지붕 지침 을 변경 하지 않 습 니 다
접미사 표현 식 접미사 표현 식 간단 한 설명
 1.숫자 라면 접미사 표현 식 에 넣 습 니 다.
 2.왼쪽 괄호 라면 창고 에 들어간다.
 3.오른쪽 괄호 라면 왼쪽 괄호 를 만 날 때 까지 스 택 에서 순서대로 나 옵 니 다.
 4.연산 기호:
  1).빈 창고 나 창고 지붕 은 왼쪽 괄호 로 창고 에 들어간다.
  2).스 택 상단 기호 우선 순위 가 현재 기호 보다 작 습 니 다.스 택 에 들 어 갑 니 다.
  3).스 택 상단 기 호 는 현재 기호 보다 우선 순위 가 크 고 스 택(접미사 표현 식 에 넣 기)을 차례로 나 가 조건 에 만족 하지 않 는 요소 나 스 택 이 비 워 질 때 까지 합 니 다.
 5.마지막 으로 스 택 에 기호 가 있 으 면 순서대로 스 택 을 나 갑 니 다(접미사 표현 식 에 넣 습 니 다)
접미사 식 계산 간단 설명
 1.숫자 라면 입 점
 2.연산 자 라면 스 택 꼭대기 에 있 는 두 개의 숫자 를 팝 업 하고 계산(먼저 스 택 에서 나 온 숫자 를 연산 자 뒤에 두 고 계산)한 다음 에 계산 결 과 를 스 택 에 넣 습 니 다.
코드
인터페이스 코드

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <TextView
            android:id="@+id/the_expression"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="right"
            android:textSize="50dp" />
    </LinearLayout>

    <View
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:background="#000" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <TextView
            android:id="@+id/the_result"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="right"
            android:textSize="50dp" />
    </LinearLayout>

    <View
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:background="#000" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/left_bracket"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="("
            android:textSize="30sp" />

        <Button
            android:id="@+id/right_bracket"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text=")"
            android:textSize="30sp" />

        <Button
            android:id="@+id/clear"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="C"
            android:textSize="30sp" />

        <Button
            android:id="@+id/delete"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="DEL"
            android:textSize="30sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/seven"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="7"
            android:textSize="30sp" />

        <Button
            android:id="@+id/eight"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="8"
            android:textSize="30sp" />

        <Button
            android:id="@+id/nine"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="9"
            android:textSize="30sp" />

        <Button
            android:id="@+id/substraction"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="-"
            android:textSize="30sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/four"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="4"
            android:textSize="30sp" />

        <Button
            android:id="@+id/five"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="5"
            android:textSize="30sp" />

        <Button
            android:id="@+id/six"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="6"
            android:textSize="30sp" />

        <Button
            android:id="@+id/add"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="+"
            android:textSize="30sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/one"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="1"
            android:textSize="30sp" />

        <Button
            android:id="@+id/two"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="2"
            android:textSize="30sp" />

        <Button
            android:id="@+id/three"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="3"
            android:textSize="30sp" />

        <Button
            android:id="@+id/division"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="÷"
            android:textSize="30sp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <Button
            android:id="@+id/zero"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="0"
            android:textSize="30sp" />

        <Button
            android:id="@+id/point"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="."
            android:textSize="30sp" />

        <Button
            android:id="@+id/equal"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="="
            android:textSize="30sp" />

        <Button
            android:id="@+id/mulitipliction"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="×"
            android:textSize="30sp" />

    </LinearLayout>
</LinearLayout>
백그라운드 논리

package com.example.calc;

import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.calc.utils.Stack;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    static final String ADD_TEXT = "+";
    static final String SUBSTRACTION_TEXT = "-";
    static final String MULTIPLICATION_TEXT = "×";
    static final String DIVISION_TEXT = "÷";
    static final String LEFT_BRACKET_TEXT = "(";
    static final String RIGHT_BRACKET_TEXT = ")";
    //    
    static final List<String> SYMBOLS = Arrays.asList(ADD_TEXT, SUBSTRACTION_TEXT, MULTIPLICATION_TEXT, DIVISION_TEXT, LEFT_BRACKET_TEXT, RIGHT_BRACKET_TEXT);
    //     
    static final Map<String, Integer> SYMBOL_PRIORITY_LEVEL = new HashMap<String, Integer>(4) {{
        put(ADD_TEXT, 1);
        put(SUBSTRACTION_TEXT, 1);
        put(MULTIPLICATION_TEXT, 2);
        put(DIVISION_TEXT, 2);
    }};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        TextView expTextView = findViewById(R.id.the_expression);
        TextView resultTextView = findViewById(R.id.the_result);
        //        
        int[] ids = {R.id.zero, R.id.one, R.id.two, R.id.three, R.id.four, R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine, R.id.point, R.id.add, R.id.substraction, R.id.mulitipliction, R.id.division, R.id.left_bracket, R.id.right_bracket};
        for (int id : ids) {
            findViewById(id).setOnClickListener((v) -> {
                String newText = expTextView.getText().toString() + ((Button) v).getText().toString();
                expTextView.setText(newText);
            });
        }
        //      
        findViewById(R.id.delete).setOnClickListener((v) -> {
            CharSequence text = expTextView.getText();
            if (text != null && text.length() > 0) {
                if (text.length() == 1) {
                    expTextView.setText(null);
                } else {
                    expTextView.setText(text.subSequence(0, text.length() - 1));
                }
            }
        });
        //  
        findViewById(R.id.clear).setOnClickListener((v) -> {
            expTextView.setText(null);
            resultTextView.setText(null);
        });
        //  
        findViewById(R.id.equal).setOnClickListener((v) -> {
            List<String> infix = getInfix(expTextView.getText().toString());
            List<String> suffix = infixToSuffix(infix);
            Double result1 = getResult(suffix);
            String result = String.valueOf(result1);
            if (result.contains(".") && result.split("\\.")[1].replace("0", "").length() == 0) {
                result = result.split("\\.")[0];
            }
            resultTextView.setText(result);
        });
    }

    //         
    private List<String> getInfix(String exp) {
        List<String> texts = new ArrayList<>();
        char[] chars = exp.toCharArray();
        StringBuilder sText = new StringBuilder();
        for (char c : chars) {
            String text = String.valueOf(c);
            if (SYMBOLS.contains(text)) {
                if (sText.length() > 0) {
                    texts.add(sText.toString());
                    sText.delete(0, sText.length());
                }
                texts.add(text);
            } else {
                sText.append(text);
            }
        }
        if (sText.length() > 0) {
            texts.add(sText.toString());
            sText.delete(0, sText.length());
        }
        return texts;
    }

    //           
    private List<String> infixToSuffix(List<String> infix) {
        List<String> sufText = new ArrayList<>();
        Stack<String> stack = new Stack<>(infix.size());
        for (String text : infix) {
            if (!SYMBOLS.contains(text)) {
                //  ,         
                sufText.add(text);
            } else if (LEFT_BRACKET_TEXT.equals(text)) {
                //   ,    
                stack.push(text);
            } else if (RIGHT_BRACKET_TEXT.equals(text)) {
                //   ,               ,       
                while (!stack.isEmpty()) {
                    String pop = stack.pop();
                    if (!LEFT_BRACKET_TEXT.equals(pop)) {
                        sufText.add(pop);
                    } else {
                        break;
                    }
                }
            } else {
                //    (+-*/)
                buildSuffix(text, sufText, stack);
            }
        }
        //               
        while (!stack.isEmpty()) {
            sufText.add(stack.pop());
        }
        return sufText;
    }

    //        
    private Double getResult(List<String> suffix) {
        Stack<Double> stack = new Stack<>(suffix.size());
        for (String text : suffix) {
            switch (text) {
                case SUBSTRACTION_TEXT: {
                    Double pop1 = stack.pop();
                    Double pop2 = stack.pop();
                    stack.push(pop2 - pop1);
                    break;
                }
                case ADD_TEXT: {
                    Double pop1 = stack.pop();
                    Double pop2 = stack.pop();
                    stack.push(pop1 + pop2);
                    break;
                }
                case DIVISION_TEXT: {
                    Double pop1 = stack.pop();
                    Double pop2 = stack.pop();
                    stack.push(pop2 / pop1);
                    break;
                }
                case MULTIPLICATION_TEXT: {
                    Double pop1 = stack.pop();
                    Double pop2 = stack.pop();
                    stack.push(pop1 * pop2);
                    break;
                }
                default:
                    stack.push(Double.valueOf(text));
                    break;
            }
        }
        return stack.pop();
    }

    private void buildSuffix(String symbol, List<String> suffix, Stack<String> stack) {
        if (stack.isEmpty()) {
            //         
            stack.push(symbol);
        } else {
            //    
            String peek = stack.peek();
            //                          
            if (LEFT_BRACKET_TEXT.equals(peek) || isGreaterThanLevel(symbol, peek)) {
                stack.push(symbol);
            } else {
                //       ,                             
                while (!stack.isEmpty()) {
                    if (isLessThanOrEquals(symbol, stack.peek())) {
                        suffix.add(stack.pop());
                    } else {
                        //            ,    
                        break;
                    }
                }
                //     ,       
                stack.push(symbol);
            }
        }
    }

    private boolean isGreaterThanLevel(String symbol, String peek) {
        Integer symbolLevel = SYMBOL_PRIORITY_LEVEL.get(symbol);
        Integer peekLevel = SYMBOL_PRIORITY_LEVEL.get(peek);
        return symbolLevel != null && peekLevel != null && symbolLevel > peekLevel;
    }

    private boolean isLessThanOrEquals(String symbol, String peek) {
        Integer symbolLevel = SYMBOL_PRIORITY_LEVEL.get(symbol);
        Integer peekLevel = SYMBOL_PRIORITY_LEVEL.get(peek);
        return symbolLevel != null && peekLevel != null && symbolLevel <= peekLevel;
    }
}
스 택 데이터 구조

package com.example.calc.utils;

public class Stack<T> {

    private int size;
    private Object[] elements;
    private int top = -1;

    public Stack(int size) {
        this.size = size;
        elements = new Object[size];
    }

    //  
    public void push(T element) {
        if (top != size - 1) {
            elements[top + 1] = element;
            top++;
        } else {
            throw new RuntimeException("stack is full!");
        }
    }

    //  
    public T pop() {
        if (top > -1) {
            top--;
            return (T) elements[top + 1];
        } else {
            throw new RuntimeException("stack is null!");
        }
    }

    //    
    public T peek() {
        if (top > -1) {
            return (T) elements[top];
        } else {
            return null;
        }
    }

    public boolean isEmpty(){
        return top == -1;
    }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기