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ù)
//無(wú)法設(shè)置bool型變量?????
private static int equal_flg = 0; // 等號(hào)的狀態(tài):FALSE表示未按過(guò)等號(hào),TRUE表示已經(jīng)按過(guò)等號(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無(wú)需處理,驗(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());
}
};
// 無(wú)需特別處理的數(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ì)算過(guò)程???未指定操作數(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);
// ?????無(wú)法再編輯框內(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()方法來(lái)檢測(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()方法來(lái)檢測(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)無(wú)法判斷最后一個(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來(lái)顯示提示信息
Toast.makeText(MainActivity.this,"作者:歡 聯(lián)系:cdch@gmail.com", Toast.LENGTH_LONG).show();
}
if (item.getItemId() == 3)
{
// 利用Toast來(lái)顯示提示信息
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如何基于坐標(biāo)對(duì)View進(jìn)行模擬點(diǎn)擊事件詳解
這篇文章主要給大家介紹了關(guān)于Android如何基于坐標(biāo)對(duì)View進(jìn)行模擬點(diǎn)擊事件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
Android實(shí)現(xiàn)計(jì)時(shí)與倒計(jì)時(shí)的方法匯總
這篇文章主要介紹了Android實(shí)現(xiàn)計(jì)時(shí)與倒計(jì)時(shí)的方法匯總,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-06-06
Android LayoutInflater中 Inflate()方法應(yīng)用
本文主要介紹Android 中Inflate 方法的用法, 在開發(fā)Android應(yīng)用過(guò)程中,可以在程序中應(yīng)用 Inflate()方法加載新布局,希望能幫助有需要的朋友2016-07-07
Android響應(yīng)事件onClick方法的五種實(shí)現(xiàn)方式小結(jié)
本篇文章主要介紹了Android響應(yīng)onClick方法的五種實(shí)現(xiàn)方式小結(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Android中ListView下拉刷新的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Android中ListView下拉刷新的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-03-03
Android實(shí)現(xiàn)控件拖動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)控件拖動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
淺析Android企業(yè)級(jí)開發(fā)數(shù)據(jù)綁定技術(shù)
這篇文章通過(guò)代碼實(shí)例分析了Android企業(yè)級(jí)開發(fā)數(shù)據(jù)綁定技術(shù)的應(yīng)用以及相關(guān)的原理知識(shí),跟著小編一起學(xué)習(xí)參考下吧。2017-12-12

