Android 개발 단순 계산기 기능 구현

28229 단어 Android계산기
계산기 항목 은 더하기,빼 기,곱 하기,나 누 기,역수 구하 기,제곱 근 구하 기 등 간단 한 연산 을 실현 해 야 한다.
실제 디 버 깅 결 과 는 다음 그림 과 같다.

레이아웃 파일:mainactivity.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"
    android:padding="3dp">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="     "
                android:textColor="#000000"
                android:textSize="20sp" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#ffffff"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_result"
                    android:background="#4E4B4B"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="right|bottom"
                    android:lines="3"
                    android:maxLines="3"
                    android:scrollbars="vertical"
                    android:text="0"
                    android:textColor="#FFFFFF"
                    android:textSize="35sp" />
            </LinearLayout>

            <GridLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:columnCount="4"
                >

                <Button
                    android:id="@+id/btn_cancel"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:shadowColor="@color/purple_500"
                    android:text="CE"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_divide"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="÷"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_multiply"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="×"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_clear"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="C"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_seven"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="7"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_eight"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="8"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp" />

                <Button
                    android:id="@+id/btn_nine"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="9"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_plus"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="+"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_four"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="4"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_five"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="5"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_six"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="6"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_minus"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="-"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_one"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="1"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_two"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="2"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_three"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="3"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <ImageButton
                    android:id="@+id/ib_sqrt"
                    android:layout_width="90dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:scaleType="centerInside"
                    android:src="@drawable/sqrt"
                    android:gravity="center"
                    android:layout_marginStart="4dp"/>

                <Button
                    android:id="@+id/btn_reciprocal"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="1/x"
                    android:textColor="@color/black"
                    android:textSize="28sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_zero"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="0"
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_dot"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="."
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>

                <Button
                    android:id="@+id/btn_equal"
                    android:layout_width="85dp"
                    android:layout_height="70dp"
                    android:backgroundTint="@color/gray"
                    android:gravity="center"
                    android:text="="
                    android:textColor="@color/black"
                    android:textSize="30sp"
                    android:layout_marginStart="5dp"/>
            </GridLayout>

        </LinearLayout>
    </ScrollView>


</LinearLayout>
이벤트 페이지:MainActivity.java

package com.example.calculator;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.example.calculator.cal.CoreAlgorithm;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

        private TextView tv_result; //           
        private double result =0; //        
        private String showText = ""; //        
        private final StringBuilder builder=new StringBuilder();  //             


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv_result = findViewById(R.id.tv_result);

            int[] buttonSeq={
                    R.id.btn_cancel, // “  ”  
                    R.id.btn_divide,// “  ”  
                    R.id.btn_multiply , // “  ”  
                    R.id.btn_clear , // “  ”  
                    R.id.btn_seven , //   7
                    R.id.btn_eight , //   8
                    R.id.btn_nine , //   9
                    R.id.btn_plus , // “  ”  
                    R.id.btn_four , //   4
                    R.id.btn_five , //   5
                    R.id.btn_six , //   6
                    R.id.btn_minus , // “  ”  
                    R.id.btn_one , //   1
                    R.id.btn_two , //   2
                    R.id.btn_three , //   3
                    R.id.btn_reciprocal , //      
                    R.id.btn_zero , //   0
                    R.id.btn_dot , // “   ”  
                    R.id.btn_equal , // “  ”  
                    R.id.ib_sqrt // “   ”  
            };

            for(int buttonId:buttonSeq)
                findViewById(buttonId).setOnClickListener(this);

            builder.append(0);
        }

//    
        //  
        //     
        //   
        //  ,  ,  ,     
        //CE C


        @Override
        public void onClick(View v) {
            int id=v.getId();
            String inputText="";

//        if(result!=0){          //      0,         
//            clear();
//            builder.append(result);
//        }


            //     ,          
            if(id!=R.id.ib_sqrt) {
                inputText = ((TextView) v).getText().toString();

                //       、          

                if (inputText.matches("\\d|\\.")) {         //          
                    resultCheck();
                    if(builder.toString().equals("0")){
                        builder.deleteCharAt(builder.length()-1);}

                    builder.append(inputText);
                    if(verifyExp(builder.toString())){
                        refreshText(builder.toString());      //       
                    }else{
                        builder.deleteCharAt(builder.length() - 1);  //              
                    }


                } else if (inputText.matches("\\+|-|×|÷")) {        //        

                    resultCheck();

                    builder.append(inputText);
                    if(verifyExp(builder.toString())){
                        refreshText(builder.toString());
                    }else{                                               //       
                        builder.deleteCharAt(builder.length() - 1);
                        builder.deleteCharAt(builder.length() - 1);
                        builder.append(inputText);
                        refreshText(builder.toString());
                    }

                }
                else {                          //   CE C 1/X =

                    switch (inputText) {
                        case "CE":
                            resultCheck();
                            //       
                            if (builder.length() > 0) {
                                builder.deleteCharAt(builder.length() - 1);
                                refreshText(builder.toString());
                            } else {

                                Toast.makeText(this, "       ", Toast.LENGTH_SHORT).show();
                            }
                            break;
                        case "C":
                            refreshText("");
                            result=0.0;
                            builder.delete(0, builder.length());    //builder  
                            builder.append(0);
                            break;
                        case "1/x":
                            resultCheck();
                            result=1/(CoreAlgorithm.calExp(builder.toString()));
                            refreshText("1/("+builder.toString()+")=
"+result); break; case "=": resultCheck(); if(result==0.0) { result = CoreAlgorithm.calExp(builder.toString()); // builder.append("=");// , refreshText(builder.toString() + "=
" + result); } break; default: Toast.makeText(this, "error", Toast.LENGTH_SHORT).show(); } } }else{ // , , resultCheck(); // , builder result = Math.sqrt(CoreAlgorithm.calExp(builder.toString())); refreshText("√(" + builder.toString() + ")=
" + result); } } // public boolean verifyExp(String exp){ // String lastNum=""; String[] sp=exp.split("\\+|-|×|÷"); // char lastChar=exp.charAt(exp.length()-1); // lastNum=sp[sp.length-1]; // if(String.valueOf(lastChar).matches("\\+|-|×|÷")) // { lastNum=""; return exp.matches(".*(\\d[+-×÷])|.*(\\.[+-×÷])"); // }else{ // return lastNum.matches("^[-]?\\d*\\.?\\d*"); // } } // private void refreshText(String text) { showText = text; tv_result.setText(showText); } // private void clear() { builder.delete(0, builder.length()); showText=""; } // public void resultCheck(){ // , , if(result!=0){ // 0, String res=String.valueOf(result); if(res.matches("^[-]?\\d*\\.?\\d*")){ // clear(); builder.append(result); result=0; // , }else{ // , 0 Infinity, clear(); builder.append("0"); result=0; } } if(builder.length()==0){ builder.append(0); } } }
핵심 알고리즘:CoreAlgorithm.java

package com.example.calculator.cal;


import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CoreAlgorithm {

        private static final Stack<Double> st = new Stack<>();      //     
        private static final Queue<Double> qu = new ArrayDeque<>();  //       ,
        private static final Queue<String> queOp = new ArrayDeque<>();        //    
        private static final Queue<String> newQueOp = new ArrayDeque<>();

        public static double calExp(String exp) {


//       String str="1+3*2-8/2+6";
//        String str="1+3*2/1";

            //             ,        


            //          
            if (exp.matches(".*[\\+\\-×÷]")) {
                exp = exp.substring(0, exp.length() - 1);
            }

            String[] sp; //      

            //         
            if (exp.matches("[\\+\\-×÷].*")) {
                String fistElem=exp.substring(0,1); //      
                exp=exp.substring(1);       //      
                //    ,    
                sp = exp.split("\\+|-|×|÷");
                if(fistElem.equals("-")){       //       
                    sp[0]="-"+sp[0];        //    
                }
            }else{  //      
                sp = exp.split("\\+|-|×|÷");
            }

            //           ,       ,        

            for (int i = sp.length - 1; i >= 0; i--) {
                if (sp[i].equals(".")) {
                    st.push(0.0);       //    
                } else {
                    st.push(Double.parseDouble(sp[i]));
                }

            }

            //       
            Pattern p = Pattern.compile("\\+|-|×|÷");
            Matcher m = p.matcher(exp);
            while (m.find()) {

                queOp.add(m.group());
            }

//        for(int i=sp.length-1;i>=0;i--){
//           System.out.println(st.pop());
//        }

//       int size=queNum.size();
//       for(int i=0;i<size;i++)
//           System.out.println(queNum.poll());

            //       
            while (st.size() > 0) {

                String currOp;

                if (queOp.size() > 0) {
                    currOp = queOp.poll();
                } else {
                    currOp = "0";
                }

                switch (currOp) {
                    case "×":
                        st.push(st.pop() * st.pop());
                        break;
                    case "÷":
                        st.push(st.pop() / st.pop());
                        break;
                    case "+":
                        qu.add(st.pop());
                        newQueOp.add("+");
                        break;
                    case "-":
                        qu.add(st.pop());
                        newQueOp.add("-");
                        break;
                    default:
                        qu.add(st.pop());

                }
            }

            //    
            if (qu.size() > 0) {
                double res = qu.poll();
                while (qu.size() > 0) {

                    String op = "";
                    if (newQueOp.size() > 0) {
                        op = newQueOp.poll();
                    } else {
                        op = "none";
                    }

                    switch (op) {
                        case "+":
                            res += qu.poll();
                            break;
                        case "-":
                            res -= qu.poll();
                            break;
                        default:
                            System.out.println("none");
                    }

                }

                return res;

            }

            return 0.0;
        }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기