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;
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.