电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能

瀏覽:3日期:2022-09-17 17:22:27

本項(xiàng)目為大家分享了Android實(shí)現(xiàn)計(jì)算器功能的具體代碼,供大家參考,具體內(nèi)容如下

項(xiàng)目介紹

練手項(xiàng)目。能實(shí)現(xiàn)加減乘除及括號(hào)運(yùn)算。

開(kāi)發(fā)思路

界面布局

1.界面布局分三大塊:公式文本區(qū)、結(jié)果文本區(qū)、按鈕區(qū)。 2.通過(guò)點(diǎn)擊按鈕錄入數(shù)學(xué)公式,實(shí)時(shí)展示在公式文本區(qū)。 3.點(diǎn)擊等號(hào),計(jì)算結(jié)果展示在結(jié)果文本區(qū)。 4.另外還有清空數(shù)據(jù)和刪除一個(gè)字符功能。

計(jì)算邏輯

1.將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式 2.計(jì)算后綴表達(dá)式得出結(jié)果

其他說(shuō)明

棧數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單說(shuō)明:

1.棧數(shù)據(jù)結(jié)構(gòu)像彈夾一樣,先壓進(jìn)去的子彈后打出來(lái),后壓進(jìn)去的子彈先打出來(lái) 2.入棧:將元素放進(jìn)棧里,并改變棧頂指針 3.出棧:將元素從棧里拿出來(lái),并改變棧頂指針 4.查看棧頂,取得棧頂元素,但不改變棧頂指針

中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式簡(jiǎn)單說(shuō)明

1.如果是數(shù)字,直接放進(jìn)后綴表達(dá)式里。

2.如果是左括號(hào),入棧。

3.如果是右括號(hào),依次出棧(放到后綴表達(dá)式里),直到遇到左括號(hào)。

4.運(yùn)算符號(hào):

1).空棧或棧頂是左括號(hào),入棧 2).棧頂符號(hào)優(yōu)先級(jí)比當(dāng)前符號(hào)小,入棧 3).棧頂符號(hào)優(yōu)先級(jí)大于等于當(dāng)前符號(hào),依次出棧(放到后綴表達(dá)式里),直到遇到不滿足條件的元素或棧被掏空。

5.最后如果棧還有符號(hào),依次出棧(放到后綴表達(dá)式里)

后綴表達(dá)式計(jì)算簡(jiǎn)單說(shuō)明

1.如果是數(shù)字,入棧 2.如果是運(yùn)算符,將棧頂?shù)膬蓚€(gè)數(shù)字彈出并計(jì)算(先出棧的數(shù)字放在運(yùn)算符后面進(jìn)行計(jì)算),再將計(jì)算結(jié)果入棧。

代碼

界面代碼

<?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'> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><TextView android: android:layout_width='match_parent' android:layout_height='match_parent' android:gravity='right' android:textSize='50dp' /> </LinearLayout> <Viewandroid:layout_width='wrap_content'android:layout_height='2dp'android:background='#000' /> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><TextView android: android:layout_width='match_parent' android:layout_height='match_parent' android:gravity='right' android:textSize='50dp' /> </LinearLayout> <Viewandroid:layout_width='wrap_content'android:layout_height='2dp'android:background='#000' /> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='(' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text=')' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='C' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='DEL' android:textSize='30sp' /> </LinearLayout> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='7' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='8' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='9' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='-' android:textSize='30sp' /> </LinearLayout> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='4' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='5' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='6' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='+' android:textSize='30sp' /> </LinearLayout> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='1' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='2' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='3' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='÷' android:textSize='30sp' /> </LinearLayout> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='0' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='.' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='=' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='×' android:textSize='30sp' /> </LinearLayout></LinearLayout>

后臺(tái)邏輯

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 = ')'; //符號(hào)集合 static final List<String> SYMBOLS = Arrays.asList(ADD_TEXT, SUBSTRACTION_TEXT, MULTIPLICATION_TEXT, DIVISION_TEXT, LEFT_BRACKET_TEXT, RIGHT_BRACKET_TEXT); //符號(hào)優(yōu)先級(jí) 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);//數(shù)字與運(yùn)算符按鈕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); });}//刪除一個(gè)字符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);}); } //字符串轉(zhuǎn)中綴表達(dá)式 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; } //中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式 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)) {//數(shù)值,直接放到后綴表達(dá)式sufText.add(text); } else if (LEFT_BRACKET_TEXT.equals(text)) {//左括號(hào),直接入棧stack.push(text); } else if (RIGHT_BRACKET_TEXT.equals(text)) {//右括號(hào),依次取出棧頂元素放到后綴表達(dá)式,直到遇到左括號(hào)while (!stack.isEmpty()) { String pop = stack.pop(); if (!LEFT_BRACKET_TEXT.equals(pop)) {sufText.add(pop); } else {break; }} } else {//其他符號(hào)(+-*/)buildSuffix(text, sufText, stack); }}//取出剩余棧內(nèi)數(shù)據(jù)放到后綴表達(dá)式while (!stack.isEmpty()) { sufText.add(stack.pop());}return sufText; } //后綴表達(dá)式求結(jié)果 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()) { //是空棧符號(hào)直接入棧 stack.push(symbol);} else { //棧頂查看 String peek = stack.peek(); //棧頂是左括號(hào)符號(hào)或當(dāng)前符號(hào)優(yōu)先級(jí)大于棧頂符號(hào)直接入棧 if (LEFT_BRACKET_TEXT.equals(peek) || isGreaterThanLevel(symbol, peek)) {stack.push(symbol); } else {//棧頂不是左括號(hào),依次取出比當(dāng)前符號(hào)優(yōu)先級(jí)小或優(yōu)先級(jí)相同的符號(hào)放到后綴表達(dá)式while (!stack.isEmpty()) { if (isLessThanOrEquals(symbol, stack.peek())) {suffix.add(stack.pop()); } else {//遇到不符合條件的棧頂數(shù)據(jù),直接退出break; }}//取完數(shù)據(jù)后,將當(dāng)前符號(hào)入棧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; }}

棧數(shù)據(jù)結(jié)構(gòu)

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; }}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 合肥宠物店装修_合肥宠物美容院装修_合肥宠物医院设计装修公司-安徽盛世和居装饰 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 好物生环保网、环保论坛 - 环保人的学习交流平台 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 压砖机_电动螺旋压力机_粉末成型压力机_郑州华隆机械tel_0371-60121717 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 【连江县榕彩涂料有限公司】官方网站 | 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 断桥铝破碎机_铝合金破碎机_废铁金属破碎机-河南鑫世昌机械制造有限公司 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 内六角扳手「厂家」-温州市威豪五金工具有限公司 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | 光照全温振荡器(智能型)-恒隆仪器| 衢州装饰公司|装潢公司|办公楼装修|排屋装修|别墅装修-衢州佳盛装饰 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 路斯特伺服驱动器维修,伦茨伺服驱动器维修|万骏自动化百科 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 陕西鹏展科技有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛婚外情取证-青岛王军侦探事务所 | 耐压仪-高压耐压仪|徐吉电气| 泰国专线_泰国物流专线_广州到泰国物流公司-泰廊曼国际 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 玖容气动液压设备有限公司-气液增压缸_压力机_增压机_铆接机_增压器 |