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;
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.