版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】android怎么實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要介紹了android怎么實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓在下帶著大家一起了解一下。具體內(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ù)字鍵是否需要分開(kāi)實(shí)現(xiàn)
//
實(shí)現(xiàn)對(duì)"0123456789.+-*/()"按鈕的監(jiān)聽(tīng);而對(duì)"="按鈕的監(jiān)聽(tīng)則采用匿名內(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
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年開(kāi)封大學(xué)單招職業(yè)傾向性考試題庫(kù)附答案詳解
- 銷售經(jīng)理面試題及銷售技巧訓(xùn)練含答案
- 2026年天津交通職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)帶答案詳解
- 2026年內(nèi)蒙古體育職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性考試題庫(kù)參考答案詳解
- 2026年湖南網(wǎng)絡(luò)工程職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)及答案詳解1套
- 2026年陜西機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案詳解一套
- 2026年安徽中醫(yī)藥高等??茖W(xué)校單招職業(yè)技能測(cè)試題庫(kù)及參考答案詳解一套
- 2025廣西北海市殘疾人康復(fù)培訓(xùn)中心招聘2人筆試重點(diǎn)題庫(kù)及答案解析
- 2026年陜西學(xué)前師范學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)及完整答案詳解1套
- 2026年黑龍江冰雪體育職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)及答案詳解1套
- 少年宮剪紙社團(tuán)活動(dòng)記錄
- 生命科學(xué)前沿技術(shù)智慧樹(shù)知到答案章節(jié)測(cè)試2023年蘇州大學(xué)
- GB/T 16102-1995車間空氣中硝基苯的鹽酸萘乙二胺分光光度測(cè)定方法
- GB/T 15171-1994軟包裝件密封性能試驗(yàn)方法
- 外科護(hù)理學(xué)期末試卷3套18p
- 人員出車次數(shù)統(tǒng)計(jì)表
- 飛行區(qū)培訓(xùn)題庫(kù)
- 新蘇教版2022-2023六年級(jí)科學(xué)上冊(cè)《專項(xiàng)學(xué)習(xí):像工程師那樣》課件
- 幕墻裝飾施工組織設(shè)計(jì)
- 科傻軟件使用說(shuō)明書(shū)
- DB52∕T 1599-2021 高性能瀝青路面(Superpave)施工技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論