【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】android怎么實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】android怎么實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】android怎么實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】android怎么實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】android怎么實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論