android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
本文實(shí)例為大家分享了android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器的具體代碼,供大家參考,具體內(nèi)容如下
// 日期:2014/9/26 // 首先,人們的輸入習(xí)慣為中綴表達(dá)式。為了便于計(jì)算,程序會(huì)將中綴表達(dá)式會(huì)轉(zhuǎn)換為后綴表達(dá)式 //////////////////////////////////////////////////////////////////////////////////////// // 目前軟件還存在 // 1.輸入運(yùn)算數(shù)和運(yùn)算符不匹配時(shí),崩潰的現(xiàn)象。(如:只輸入一個(gè)操作數(shù)) // 2.一個(gè)數(shù)字中重復(fù)輸入兩個(gè)小數(shù)點(diǎn)。(如4.5.6) // 這兩個(gè)重大的bug,后續(xù)會(huì)繼續(xù)修改 //////////////////////////////////////////////////////////////////////////////////////// // 只有一種布局。這也會(huì)在后續(xù)考慮完善。 // 若有其他不完善的地方,請(qǐng)指正。(╯▽╰) package com.example.countea; import android.os.Bundle; //不太明白到底是啥 import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; // 顯示版權(quán)信息 import java.util.Iterator; // 迭代器 import java.util.LinkedList; // 雙向列表 public class MainActivity extends Activity { private EditText content; private EditText operaline; private Double first_num = 0.0; // 第一個(gè)操作數(shù) private Double sec_num = 0.0; // 第二個(gè)操作數(shù) //無法設(shè)置bool型變量????? private static int equal_flg = 0; // 等號(hào)的狀態(tài):FALSE表示未按過等號(hào),TRUE表示已經(jīng)按過等號(hào) private double negative_mark = 0; // 正負(fù)數(shù)標(biāo)記 LinkedList<String> Infix = new LinkedList<String>(); // 對(duì)content進(jìn)行解析,即存放中綴表達(dá)式的鏈表 LinkedList<String> Suffix = new LinkedList<String>(); // 存放后綴表達(dá)式的鏈表 LinkedList<Double> Suffix_Num = new LinkedList<Double>(); // 存放后綴表達(dá)式的數(shù)字鏈表 LinkedList<String> OP = new LinkedList<String>(); // 1.作為臨時(shí)存放運(yùn)算符的鏈表;2.存放后綴表達(dá)式的運(yùn)算符 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 處理"c"清屏按鈕功能 Button clear = (Button) findViewById(R.id.clear); clear.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub content = (EditText) findViewById(R.id.content); content.setText(""); equal_flg = 0; first_num = 0.0; sec_num = 0.0; OP.clear(); Suffix.clear(); Suffix_Num.clear(); operaline.setText(""); operaline.setSelection(operaline.getText().length()); } }); // 處理CE刪除當(dāng)前操作按鈕功能 Button current_clear = (Button) findViewById(R.id.current_clear); current_clear.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub content = (EditText) findViewById(R.id.content); content.setText(""); equal_flg = 0; first_num = 0.0; sec_num = 0.0; OP.clear(); Suffix.clear(); Suffix_Num.clear(); } }); // 處理back退格按鈕功能 Button back = (Button) findViewById(R.id.back); back.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub content = (EditText) findViewById(R.id.content); String str = content.getText().toString(); if (content.getText().length() != 0) content.setText(str.substring(0, str.length() - 1)); content.setSelection(content.getText().length()); //暫時(shí)不知道有什么用,若編輯框?yàn)榭談t無需處理,驗(yàn)證是否會(huì)導(dǎo)致異常退出 } }); // 考慮對(duì)符號(hào)鍵和數(shù)字鍵是否需要分開實(shí)現(xiàn) // 實(shí)現(xiàn)對(duì)"0123456789.+-*/()"按鈕的監(jiān)聽;而對(duì)"="按鈕的監(jiān)聽則采用匿名內(nèi)部類的方法在onCreate()方法體內(nèi)進(jìn)行 OnClickListener mylistener = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Button num_btn = (Button) v; content = (EditText) findViewById(R.id.content); // 儲(chǔ)存界面運(yùn)算式 String content_str = content.getText().toString(); // 當(dāng)已經(jīng)有一次運(yùn)算時(shí),再次按“數(shù)字鍵”清除上次的結(jié)果 if((1==equal_flg)/*&&(num_btn.getText().toString().equals("1") ||num_btn.getText().toString().equals("2") ||num_btn.getText().toString().equals("3") ||num_btn.getText().toString().equals("4") ||num_btn.getText().toString().equals("5") ||num_btn.getText().toString().equals("6") ||num_btn.getText().toString().equals("7") ||num_btn.getText().toString().equals("8") ||num_btn.getText().toString().equals("9") ||num_btn.getText().toString().equals("0"))*/) { content.setText("0"); content.setSelection(content.getText().length()); Toast.makeText(MainActivity.this,"還真執(zhí)行了!", Toast.LENGTH_LONG).show(); equal_flg=0; } // 重復(fù)輸入運(yùn)算符、括號(hào)或者“.”的處理 if(("+".equals(content_str.substring(content_str.length()-1,content_str.length())) ||"-".equals(content_str.substring(content_str.length()-1,content_str.length())) ||"*".equals(content_str.substring(content_str.length()-1,content_str.length())) ||"/".equals(content_str.substring(content_str.length()-1,content_str.length())) ||".".equals(content_str.substring(content_str.length()-1,content_str.length())))&&((num_btn.getText().toString().equals("+") ||num_btn.getText().toString().equals("-") ||num_btn.getText().toString().equals("*") ||num_btn.getText().toString().equals("/") ||num_btn.getText().toString().equals(".")))) { content_str=content_str.substring(0, content_str.length()-1); //Toast.makeText(MainActivity.this,"手抖了嗎?", Toast.LENGTH_LONG).show(); } // 重復(fù)按“.”的處理 /*if(num_btn.getText().toString().equals(".")) { // 如果界面只有數(shù)字,則改變當(dāng)前數(shù)字的符號(hào) if("0"!=content_str) { judge_str = turn_mark(judge_str); content.setText(judge_str); content.setSelection(content.getText().length()); // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show(); } }*/ // 不實(shí)現(xiàn)拼接 // 當(dāng)前數(shù)據(jù)為0,下次輸入為非0數(shù)字或括號(hào) if("0".equals(content.getText().toString()) &&!(num_btn.getText().toString().equals("+")) &&!(num_btn.getText().toString().equals("-")) &&!(num_btn.getText().toString().equals("*")) &&!(num_btn.getText().toString().equals("/")) &&!(num_btn.getText().toString().equals("."))) { // 強(qiáng)制轉(zhuǎn)換測(cè)試是否有危險(xiǎn)?????? content_str = (String) num_btn.getText(); //Toast.makeText(MainActivity.this,num_btn.getText(), Toast.LENGTH_LONG).show(); } // 實(shí)現(xiàn)拼接 // 當(dāng)前數(shù)據(jù)為0且下次輸入為運(yùn)算符或點(diǎn)號(hào) else { content_str += num_btn.getText(); //Toast.makeText(MainActivity.this,content_str, Toast.LENGTH_LONG).show(); } content.setText(content_str); content.setSelection(content.getText().length()); } }; // 無需特別處理的數(shù)字和符號(hào)按鈕 Button num1 = (Button) findViewById(R.id.num_1); num1.setOnClickListener(mylistener); Button num2 = (Button) findViewById(R.id.num_2); num2.setOnClickListener(mylistener); Button num3 = (Button) findViewById(R.id.num_3); num3.setOnClickListener(mylistener); Button num4 = (Button) findViewById(R.id.num_4); num4.setOnClickListener(mylistener); Button num5 = (Button) findViewById(R.id.num_5); num5.setOnClickListener(mylistener); Button num6 = (Button) findViewById(R.id.num_6); num6.setOnClickListener(mylistener); Button num7 = (Button) findViewById(R.id.num_7); num7.setOnClickListener(mylistener); Button num8 = (Button) findViewById(R.id.num_8); num8.setOnClickListener(mylistener); Button num9 = (Button) findViewById(R.id.num_9); num9.setOnClickListener(mylistener); Button point = (Button) findViewById(R.id.point); point.setOnClickListener(mylistener); Button left = (Button) findViewById(R.id.left); left.setOnClickListener(mylistener); Button right = (Button) findViewById(R.id.right); right.setOnClickListener(mylistener); Button plus = (Button) findViewById(R.id.plus); plus.setOnClickListener(mylistener); Button subtract = (Button) findViewById(R.id.subs); subtract.setOnClickListener(mylistener); Button multiply = (Button) findViewById(R.id.multiply); multiply.setOnClickListener(mylistener); Button divide = (Button) findViewById(R.id.division); divide.setOnClickListener(mylistener); // 對(duì)按鈕0的處理 Button num0 = (Button) findViewById(R.id.num_0); num0.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { content = (EditText) findViewById(R.id.content); // 當(dāng)前編輯框中的值為0 if ("0".equals(content.getText().toString())||""== content.getText().toString()) { content.setText("0"); } // 編輯框已有非0數(shù)據(jù) else { String str = content.getText().toString(); str += "0"; content.setText(str); } content.setSelection(content.getText().length()); // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show(); } }); // 對(duì)“-/+”的處理 Button mark_sign = (Button) findViewById(R.id.mark_sign); mark_sign.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { content = (EditText) findViewById(R.id.content); String judge_str = content.getText().toString(); // 如果界面只有數(shù)字,則改變當(dāng)前數(shù)字的符號(hào) if("0"!=judge_str&&((-1==judge_str.indexOf("+")) ||(-1==judge_str.indexOf("-"))) ||(-1==judge_str.indexOf("*")) ||(-1==judge_str.indexOf("/")) ||(-1==judge_str.indexOf("(")) ||(-1==judge_str.indexOf(")"))) { judge_str = turn_mark(judge_str); content.setText(judge_str); content.setSelection(content.getText().length()); // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show(); } } }); // 實(shí)現(xiàn)"="按鈕的功能 Button equal = (Button) findViewById(R.id.equal); equal.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub content = (EditText) findViewById(R.id.content); operaline = (EditText) findViewById(R.id.operatline); // str_Infix為待轉(zhuǎn)換的中綴表達(dá)式 String str_Infix = content.getText().toString(); // 友好的界面提示處理 String equate = str_Infix; equate += "="; operaline.setText(equate); operaline.setSelection(content.getText().length()); // 調(diào)用Analysis函數(shù)對(duì)content進(jìn)行解析 MainActivity.this.Analysis(str_Infix); System.out.println(Infix); // 至此,中綴表達(dá)式已存放到Infix鏈表中 Iterator<String> it = Infix.iterator(); while (it.hasNext()) { String tmp_str = it.next(); if (isNum(tmp_str)) { // 如果是數(shù)字或小數(shù)點(diǎn)則直接進(jìn)入Suffix鏈表; Suffix.addLast(tmp_str); } // 如果不是數(shù)字或小數(shù)點(diǎn)的話; else { int OP_level = OP.isEmpty() ? 0 : getLevel(OP.getLast()); // tmp_str比OP的頂運(yùn)算符優(yōu)先級(jí)高則入OP if (getLevel(tmp_str) > OP_level) { OP.addLast(tmp_str); } // tmp_str比OP的頂運(yùn)算符優(yōu)先級(jí)低 else { // tmp_str為")",則將OP一直出棧直到遇到"(" if (getLevel(tmp_str) == -1) { String temp_OP = OP.removeLast(); while (getLevel(temp_OP) != -2) { Suffix.addLast(temp_OP); temp_OP = OP.removeLast(); } } // tmp_str為"(",則直接入OP else if (getLevel(tmp_str) == -2) { OP.addLast(tmp_str); } // tmp_str比OP_level優(yōu)先級(jí)低又不是"(" ")", // 則OP一直出棧直到OP為空或tmp_str比OP_level優(yōu)先級(jí)高 else { String str2 = OP.removeLast(); while (getLevel(str2) >= OP_level) { Suffix.addLast(str2); if (OP.isEmpty()) { break; } str2 = OP.removeLast(); } OP.addLast(tmp_str); } } } } Infix.clear();// 清空Infix鏈表 // OP中剩余的元素出OP進(jìn)入Suffix while (!OP.isEmpty()) { Suffix.addLast(OP.removeLast()); } System.out.println(Suffix); // 至此,中綴表達(dá)式已全部轉(zhuǎn)化為后綴表達(dá)式Suffix // 后綴表達(dá)式的計(jì)算過程???未指定操作數(shù)時(shí) 默認(rèn)為0 while (!(Suffix.isEmpty())) { String count_str = Suffix.removeFirst(); if (isOP(count_str)) { char compare_ch = count_str.charAt(0); first_num = Suffix_Num.removeLast(); sec_num = Suffix_Num.removeLast(); switch (compare_ch) { case '*': Suffix_Num.addLast(sec_num * first_num); break; case '/': // 測(cè)試注意除數(shù)和被除數(shù)的順序 if (first_num != 0) { Suffix_Num.addLast(sec_num / first_num); break; } else { content = (EditText) findViewById(R.id.content); // ?????無法再編輯框內(nèi),設(shè)置提示 content.setText("∞"); content.setSelection(content.getText().length()); } case '+': Suffix_Num.addLast(sec_num + first_num); break; case '-': Suffix_Num.addLast(sec_num - first_num); break; } } else { Suffix_Num.addLast(Double.parseDouble(count_str)); } } // 至此,求得的結(jié)果已在Suffix_Num列表中 // 這部分的邏輯為 result 存放從Suffix_Num列表中取出的數(shù)據(jù),處理結(jié)果后顯示到界面上。 Double result=Suffix_Num.removeFirst(); String res_str=Double.toString(result); if("0".equals(res_str.substring(res_str.length()-1,res_str.length()))) { if(".".equals(res_str.substring(res_str.length()-2,res_str.length()-1))) { res_str=res_str.substring(0,res_str.length()-2); //Toast.makeText(MainActivity.this,res_str, Toast.LENGTH_LONG).show(); }; }; content.setText(res_str); content.setSelection(content.getText().length()); equal_flg = 1; if("-".equals(res_str.substring(0,1))) res_str=turn_mark(res_str); } }); // 操作數(shù)清空?????android有自動(dòng)釋放機(jī)制? first_num = 0.0; sec_num = 0.0; OP.clear(); Suffix.clear(); Suffix_Num.clear(); } // 自定義isNum()方法來檢測(cè)元素是否為數(shù)值 public boolean isNum(String str) { int num = 0; for (int i = 0; i < str.length(); i++) { String strr = str.substring(i, i + 1); if (strr.equals("0") || strr.equals("1") || strr.equals("2") || strr.equals("3") || strr.equals("4") || strr.equals("5") || strr.equals("6") || strr.equals("7") || strr.equals("8") || strr.equals("9") || strr.equals(".")) num = num + 1; } if (num == str.length()) return true; else return false; } // 自定義isOP()方法來檢測(cè)Suffix列表的元素是否為運(yùn)算符 public boolean isOP(String strr) { if (strr.equals("+") || strr.equals("-") || strr.equals("*") || strr.equals("/")) return true; else return false; } // 定義運(yùn)算符的等級(jí) public int getLevel(String str) { if (str.equals("*") || str.equals("/")) { return 2; } else if (str.equals("+") || str.equals("-")) { return 1; } else if (str.equals("(")) { return -2; } else if (str.equals(")")) { return -1; } else { return 0; } } // 改變正負(fù)號(hào) public String turn_mark(String str) { String temp = "("; temp += "-"; temp += str; temp += ")"; str = temp; return str; } // 實(shí)現(xiàn)對(duì)編輯框內(nèi)容以數(shù)字和操作符分開儲(chǔ)存 public void Analysis(String str) { String sub = ""; for (int i = 0; i < str.length(); i++) { // 用substring遍歷需要解析的數(shù)組 String strr = str.substring(i, i + 1); if (isNum(strr)) { sub += strr; } else { if (sub != "") { Infix.addLast(sub); // 首先sub進(jìn)Infix sub = ""; // 將sub清空 } Infix.addLast(strr); // "+-*/" "(" ")" 則直接進(jìn)Infix表 } } // ?????測(cè)試for下面的IF是否是因?yàn)檠h(huán)無法判斷最后一個(gè)數(shù) if (isNum(str.substring(str.length() - 1))) { Infix.addLast(sub); // 首先sub進(jìn)Infix sub = ""; // 將sub清空 } } @Override public boolean onCreateOptionsMenu(Menu menu) { /* * // Inflate the menu; this adds items to the action bar if it is * present. getMenuInflater().inflate(R.menu.main, menu); */ menu.add(0, 1, 1, "退出"); menu.add(0, 2, 2, "關(guān)于"); menu.add(0, 3, 3, "幫助"); return super.onCreateOptionsMenu(menu); /* return true; */ } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub //finish(); if (item.getItemId() == 2) { // 利用Toast來顯示提示信息 Toast.makeText(MainActivity.this,"作者:歡 聯(lián)系:cdch@gmail.com", Toast.LENGTH_LONG).show(); } if (item.getItemId() == 3) { // 利用Toast來顯示提示信息 Toast.makeText(MainActivity.this,"適用于一般算數(shù)運(yùn)算!", Toast.LENGTH_LONG).show(); } return super.onOptionsItemSelected(item); }; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android計(jì)算器實(shí)現(xiàn)兩位數(shù)的加減乘除
- Android實(shí)現(xiàn)簡(jiǎn)單加法計(jì)算器
- Android實(shí)現(xiàn)加法計(jì)算器
- Android studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
- Android實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小程序
- Android studio設(shè)計(jì)簡(jiǎn)易計(jì)算器
- 從零開始學(xué)android實(shí)現(xiàn)計(jì)算器功能示例分享(計(jì)算器源碼)
- Android開發(fā)實(shí)現(xiàn)的簡(jiǎn)單計(jì)算器功能【附完整demo源碼下載】
- android計(jì)算器簡(jiǎn)單實(shí)現(xiàn)代碼
- Android Studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器APP
相關(guān)文章
Android創(chuàng)建簡(jiǎn)單發(fā)送和接收短信應(yīng)用
收發(fā)短信應(yīng)該是每個(gè)手機(jī)最基本的功能之一了,即使是許多年前的老手機(jī)也都會(huì)具備這項(xiàng)功能,而Android 作為出色的智能手機(jī)操作系統(tǒng),自然也少不了在這方面的支持。今天我們開始自己創(chuàng)建一個(gè)簡(jiǎn)單的發(fā)送和接收短信的應(yīng)用,需要的朋友可以參考下2016-04-04Android開發(fā)實(shí)現(xiàn)消除屏幕鎖的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)消除屏幕鎖的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android鎖屏的原理及消除屏幕鎖的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09Android如何實(shí)現(xiàn)非本地圖片的點(diǎn)擊態(tài)
Android如何實(shí)現(xiàn)非本地圖片的點(diǎn)擊態(tài),本文提供了詳細(xì)的實(shí)現(xiàn)代碼,需要了解的朋友可以參考下2012-12-12關(guān)于Android中點(diǎn)擊通知欄的通知啟動(dòng)Activity問題解決
這篇文章主要介紹了關(guān)于解決Android中點(diǎn)擊通知欄的通知啟動(dòng)Activity問題的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03Android如何實(shí)現(xiàn)NFC讀取卡片信息
這篇文章主要介紹了Android如何實(shí)現(xiàn)NFC讀取卡片信息問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Flutter簡(jiǎn)潔實(shí)用的圖片編輯器的實(shí)現(xiàn)
本文主要介紹了Flutter簡(jiǎn)潔實(shí)用的圖片編輯器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02下載、編譯、運(yùn)行android 7.1系統(tǒng)詳解(ubuntu 16.0.4)
Android 7的系統(tǒng)版本新增的很多的新功能,本篇文章主要介紹了基于ubuntu 16.0.4環(huán)境的下載、編譯、運(yùn)行android 7.1系統(tǒng),有興趣的可以了解一下。2017-01-01Android編程開發(fā)之TextView單擊鏈接彈出Activity的方法
這篇文章主要介紹了Android編程開發(fā)之TextView單擊鏈接彈出Activity的方法,涉及Android中TextView控件的相關(guān)操作技巧,需要的朋友可以參考下2016-01-01