android計算器設計方案_第1頁
android計算器設計方案_第2頁
android計算器設計方案_第3頁
android計算器設計方案_第4頁
android計算器設計方案_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

android計算器設計本人學習android有一個多月了,在學習期間為了對所學的知識進行應用,因而設計了一個簡潔的計算器,現(xiàn)在通過本文與大家一起共享.由于本人水平有限,因此設計的計算器可能有著一部分的BUG,如發(fā)現(xiàn)BUG請聯(lián)系我,感謝!?QQ:4740279151。界面的設計應用程序圖標的設計每一個應用程序,我們都要設計一個圖標,可以說圖標是應用程序的名片,好的圖標能夠很快地吸引用戶。關于如何設計圖標,在網(wǎng)上可以查詢相關文件進行學習,在這不多做敘述,本人在網(wǎng)上尋找了一個圖標作為計算器應用的圖標,圖標如下所示。由于不同的android手機有著不同的分辨率,將不同分辨率的圖標圖片放置在相應位置,如下圖所示。drawable-hdpi中放置分辨率最高的圖標,drawable-ldpi中放置分辨率中等的圖標,drawable-hdpi中放置分辨率最低的圖標。圖標圖片大小的要求如下:在AndroidManifest.xml文件中進行修改,修改情況如下:<applicationandroid:icon="@drawable/calculator"android:label="@string/app_name">其他設置保持不變.在value中的String.xml中加入app_name,代碼為:〈stringname=”app_name”>計算器</string。結(jié)果如下圖所示:按鈕放置以及界面編排界面設計應該盡量簡潔而美觀,應該具有良好的交互性.因本人水平有限,所以設計的界面不是很完善,望請見諒。最終設計的計算器界面情況如下所示:整個界面的布局為LinearLayout,按鈕的布局為TableLayout。另外需要對EditText和Button的一些屬性進行相關設置,以使得它們滿意我們的需要。在這直接給出main.xml中的代碼,代碼如下所示:<?xmlversion=”1.0"encoding=”utf—8"?〉<LinearLayoutxmlns:android=”http://schemas.a(chǎn)ndroid.com/apk/res/android"android:orientation=”vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#880000”android:paddingTop="50px”>〈EditText?android:id=”@+id/editText"?android:gravity="left” android:text=""?android:textSize=”37px”?android:layout_height="150px"?android:layout_width=”fill_parent”?android:layout_marginBottom="20px"?android:layout_marginLeft="10px"?android:layout_marginRight=”10px"?android:editable=”false"?android:cursorVisible="false" ?></EditText><EditText?android:id=”@+id/editText1”?android:gravity=”left" android:text="" android:textSize="40px"?android:layout_height=”80px"?android:layout_width=”fill_parent”?android:layout_marginBottom=”30px"?android:layout_marginLeft=”10px" android:layout_marginRight=”10px"?android:editable="false" android:cursorVisible="false"?android:focusable="false” >〈/EditText>?〈TableLayout??android:layout_width="fill_parent" android:layout_height=”fill_parent”?android:stretchColumns=”0,1,2,3,4"?〉??<TableRow>?? <Button ???android:id="@+id/buttom7"?? ?android:layout_margin="3px"? ??android:text=”7" ???android:textSize="40px”????android:focusable="false"???/>? ?<Button????android:id="@+id/buttom8”????android:layout_margin="3px”????android:text="8" ? android:textSize=”40px"??? android:focusable="false"???/>? ?〈Button????android:id="@+id/buttom9" ???android:layout_margin="3px"????android:text="9” ? ?android:textSize=”40px" ? ?android:focusable=”false” ??/> ??<Button? ? android:id="@+id/buttom10"? ? android:layout_margin="3px"????android:text="ON"????android:textSize=”40px"? ??android:focusable=”false”? ?/〉?? <Button ???android:id="@+id/buttom11"?? ?android:layout_margin="3px"? ??android:text="OFF”????android:textSize="40px"?? ?android:focusable=”false"?? /> ?〈/TableRow>? <TableRow>? ?<Button??? android:id="@+id/buttom4" ???android:layout_margin="3px"????android:text="4" ?? android:textSize=”40px”????android:focusable="false”???/>???<Button? android:id="@+id/buttom5"?? android:layout_margin=”3px"????android:text="5" ???android:textSize="40px"??? android:focusable="false"???/>???〈Button? ??android:id="@+id/buttom6”?? ?android:layout_margin="3px"?? ?android:text="6" ? ?android:textSize="40px"????android:focusable="false"???/>???<Button????android:id=”@+id/buttom12”??? android:layout_margin=”3px”? ??android:text="+"??? android:textSize="40px” ? android:focusable=”false” ??/〉???〈Button?? android:id="@+id/buttom13”????android:layout_margin="3px"? android:text="—" ? android:textSize="40px"? ?android:focusable="false” ??/〉 ?〈/TableRow>??〈TableRow>???<Button? ??android:id=”@+id/buttom1”????android:layout_margin="3px"????android:text=”1”??? android:textSize=”40px”????android:focusable=”false"???/〉???〈Button????android:id="@+id/buttom2"????android:layout_margin="3px"?? ?android:text="2"? ??android:textSize="40px"????android:focusable="false”? ?/>? ?〈Button?? ?android:id="@+id/buttom3"????android:layout_margin="3px" ??android:text="3”?? ?android:textSize="40px”????android:focusable="false"? ?/>???<Button?? ?android:id="@+id/buttom14" ???android:layout_margin=”3px"? ??android:text=”×” ? android:textSize="40px" ? ?android:focusable="false" ??/〉 ??〈Button ???android:id="@+id/buttom15" ? ?android:layout_margin=”3px"??? android:text="÷” ?? android:textSize="40px” ???android:focusable=”false" ??/〉??</TableRow> ?<TableRow>???<Button? ? android:id="@+id/buttom0"? ??android:layout_margin="3px”? ??android:text="0”????android:textSize="40px”? ??android:focusable="false” ??/〉? ????<Button?? ?android:id=”@+id/buttom16"?? ?android:layout_margin="3px"? ??android:text=”.”? android:textSize=”40px" ?android:focusable="false”? ?/>? ?<Button??? android:id=”@+id/buttom17”??? android:layout_margin="3px"????android:text="=”? ??android:textSize=”40px”????android:focusable="false"???/〉???〈Button????android:id="@+id/buttomback"????android:layout_margin="3px"????android:text=”←”?? android:textSize=”40px"?? ?android:focusable="false"???/>?? <Button?? android:id="@+id/buttom18”??? android:layout_margin=”3px"????android:text="C”????android:textSize="40px" ? ?android:focusable="false"? />??</TableRow>?</TableLayout〉? </LinearLayout〉若對相關控件的屬性不夠生疏的話,可自行查閱相關文獻。2.設計思想2。1整體思想在整個過程中,首先應該對輸入進行容錯處理,這樣有利于提高用戶體驗。對于用戶的按鍵輸入,需要準時地顯示在第一個EditView中。在EditView中顯示的是一個字符串,用戶每輸入一個操作,字符串發(fā)生相應轉(zhuǎn)變,然后在EditView中反映出來。接著便是對第一個EditView中的字符串進行處理。通過程序設計,可以將字符串中的數(shù)據(jù)和操作符分別存在兩個棧中。然后需要設計算法處理兩個棧,通過算法得出字符串表達式的運算結(jié)果,再將運算結(jié)果反映在其次個EditView中的字符串中。?(注:數(shù)據(jù)和操作符也可以儲存在隊列中,實際上儲存在隊列中更為合理。)?2.2容錯處理用戶在輸入過程中,肯定會存在肯定的錯誤,程序設計過程中需要對應用程序進行容錯處理。容錯設計比如:在輸入過程中小數(shù)的話只能有一個小數(shù)點,操作符不能連續(xù)輸入,整數(shù)數(shù)據(jù)的開頭不能消滅0等等。在設計的應用程序中,設計了幾個標記flag,每按下一個按鍵,若是按鍵是合理的話,都會引起標記flag的轉(zhuǎn)變。標記flag將會限制接下來的輸入是否有效,無效則不做任何處理。flag0=0:處理0的輸出,為1則表示數(shù)字的開頭有一個0。當flag0=1時,不能再輸入0,當再輸入數(shù)字或者操作符時,flag0重新置0。flag1=0:處理0的輸出,每個數(shù)字開頭的標志數(shù)值為0表示為數(shù)字開頭。當flag1=0時,如果先輸入0再輸入1的話,前面的0自動消除。還有當flag1=0時,不能輸入小數(shù)點等等。flag2=0:處理小數(shù)點,一個數(shù)字最多只能有一個小數(shù)點。當數(shù)字中有小數(shù)點時,flag2變?yōu)?,此后不能再輸入小數(shù)點,輸入操作符等操作后,flag2又變?yōu)?.flag3=0:處理運算符的輸出.很明顯不能連續(xù)輸入操作符,用此標志,來限制連續(xù)操作符的輸入。flag4=0:處理ON/OFF問題.當OFF之后,flag變?yōu)椋保挥挟攆lag等于1時,ON按鈕才能進行操作.flag5=0:處理等號問題.很明顯操作符之后不能按下等號按鈕,等號按鈕按下之后要在其次個EditView中顯示結(jié)果、將顯示輸出的EditView清空. 2.3數(shù)據(jù)結(jié)構的設計在程序設計過程中,需要設計數(shù)據(jù)結(jié)構來存儲數(shù)字、操作符和容錯標記,在本文中使用了棧,對這些數(shù)據(jù)進行了存儲。?容錯標記flag的存儲結(jié)構如下所示:classFlag{ privateinta0;?privateinta1;?privateinta2; privateinta3;?publa0()?{?returna0;?} publicinta1()?{?returna1;?}?publicinta2()?{?returna2; } publicinta3()?{ returna3;?}?publicFlag(inta,intb,intc,intd)?{??a0=a; ?a1=b;??a2=c;? a3=d;?}?publicFlagnext;}classFlagList{?privat(yī)eFlagfirst;?publicFlagList(inta,intb,intc,intd)?{ first=null;?} publicbooleanisEmpty()?{return(first==null);}?publicvoidinsertFirst(inta,intb,intc,intd)?{ ???? ? ? ?FlagnewFlag=newFlag(a,b,c,d); ?newFlag。next=first;??first=newFlag;?}?publicFlagdeleteFirst() {? Flagtemp=first;???first=first。next;??returntemp;?}}classFlagStack{?privateFlagListtheFlagList;?privateintcount;?publicFlagStack()?{ ?theFlagList=newFlagList(0,0,0,0);??count=0;?}?publicvoidpush(inta,intb,intc,intd)?{??theFlagList.insertFirst(a,b,c,d);??count++;?}?publicFlagpop()?{??count=count-1;??returntheFlagList.deleteFirst();?? }?publicbooleanisEmpty() {??return(theFlagList.isEmpty()); }?publicintcount()?{??returncount; }}?數(shù)字存儲的形式如下所示:classNum{?privateStrings=newString();?publicNum(Strings1)?{??s=s1;?}?publicStringgetNum()?{??returns;?}?publicNumnext;}classNumList{?privateNumfirstNum; publicNumList()?{ firstNum=null;?}?publicbooleanisEmpty()?{return(firstNum==null);}?publicvoidinsertFirst(Strings1) {??? ?? ?? ?NumnewNum=newNum(s1);? newNum。next=firstNum;??firstNum=newNum; } publicNumdeleteFirst()?{??Numtemp=firstNum;?? firstNum=firstNum。next; ?returntemp;?}}classNumStack{?privateNumListtheNumList;?privcountNum;?publicNumStack()?{??theNumList=newNumList();??countNum=0; }?publicvoidpush(Strings1)?{??theNumList.insertFirst(s1);??countNum++;?} publicNumpop() {? countNum=countNum—1;? returntheNumList.deleteFirst();?? } publicbooleanisEmpty()?{ return(theNumList.isEmpty()); } publicintcountNum()?{? returncountNum;?}}操作符存儲的形式如下所示:classSymbol{?privatecharc;?privat(yī)eintdegree1;?publicSymbol(charc1)?{??c=c1;? if(c=='×'||c=='÷’)???degree1=2; ?else???degree1=1;?}?publicintgetDegree()?{? returndegree1; }?publicchargetSymbol() {??returnc;?}?publicSymbolnext;}classSymbolList{ privat(yī)eSymbolfirstSymbol;?publicSymbolList()?{?firstSymbol=null;?}?publicbooleanisEmpty()?{return(firstSymbol==null);}?publicvoidinsertFirst(charc1)?{??? ? ?????SymbolnewSymbol=newSymbol(c1); newSymbol。next=firstSymbol;? firstSymbol=newSymbol;?}?publicSymboldeleteFirst() { ?Symboltemp=firstSymbol;? ?firstSymbol=firstSymbol.next;??returntemp;?}}classSymbolStack{?privateSymbolListtheSymbolList;?privacountSymbol;?publicSymbolStack()?{ ?theSymbolList=newSymbolList();??countSymbol=0;?}?publicvoidpush(charc1)?{ ?theSymbolList。insertFirst(c1);??countSymbol++;?}?publicSymbolpop()?{??countSymbol=countSymbol—1;??returntheSymbolList.deleteFirst();?? }?publicbooleanisEmpty()?{? return(theSymbolList.isEmpty());?} publicintcountSymbol()?{??returncountSymbol;?}} 2.4表達式運算的算法設計? 如何編程實現(xiàn)“1×2-2÷1+5"的計算? ?事先假設算術表達式中不包括括號(包括括號的可先將表達式轉(zhuǎn)為后綴表達式,然后利用棧進行計算,此處省略),現(xiàn)在設計算法來計算題目所示的表達式。將表達式轉(zhuǎn)為字符串類進行存儲。將表達式的字符串進行處理,將數(shù)字和運算符分別存放在兩個棧中(也可以使用隊列,理論上使用隊列更為合理,在這我使用棧來實現(xiàn))。由于棧是后進先出的,所以先將兩個棧進行逆序.設計方法來處理兩個棧從而得到相應的計算結(jié)果.設計方法如下:11×2×2--22÷1÷1++55? 將操作符設計優(yōu)先級,乘除優(yōu)先級設置為2,加減優(yōu)先級設置為1。從操作符棧中彈出兩個操作符,假設為symbol1和symbol2,比較兩個操作付的優(yōu)先級,如果symbol1的優(yōu)先級大于等于symbol2的則執(zhí)行二,否則執(zhí)行三。二、從數(shù)字棧中彈出兩個數(shù)字,計算這兩個數(shù)字在操作符symbol1下的運算結(jié)果,結(jié)束后將結(jié)果壓入數(shù)字棧,將symbol2壓入操作符棧,最后返回一。1122×22×----÷22÷2211÷11÷+5++5+55三、從數(shù)字棧中彈出三個數(shù)字,計算后兩個數(shù)字在操作符symbol2下的運算結(jié)果,結(jié)束后將運算結(jié)果壓入棧,將剩下的第一個數(shù)字壓入棧,將操作符symbol1壓入站,最后返回一。22-2-2÷-2÷-21212+5++5+55下面給出對一個字符串進行處理,將數(shù)和操作符分別存入兩個棧的程序?qū)崿F(xiàn).??Stringn=newString("");??numStack=newNumStack();? symbolStack=newSymbolStack();? numStack1=newNumStack();??symbolStack1=newSymbolStack();??char[]mass=str。toCharArray(); ?for(intj=0;j<mass。length;j++) ?{???if(Character。isDigit(mass[j])||mass[j]==46)? ? ?n=n+mass[j]; ??else? {?? ?if(n.length()!=0) ???{?? ??numStack.push(n);???? n=newString("");? ? } ? ?symbolStack.push(mass[j]);? ?} ??if(j==mass.length-1&&n.length()!=0)???{ ?? numStack.push(n); ??n=newString("”);???}??}??while(numStack.countNum()〉0)??? ? ? ?? ? numStack1.push(numStack.pop()。getNum()); ?while(symbolStack。countSymbol()〉0)???symbolStack1。push(symbolStack.pop()。getSymbol()); ?上面的numStack1和symbolStack1也就是逆序后的棧,如下面所示。11×2×2--22÷1÷1++55??下面給出對兩個棧進行處理,從而得出計算結(jié)果的方法calculator.? publicBigDecimalcalculator(NumStacknumStack,SymbolStacksymbolStack)??{ ??if(numStack.countNum()==1)? ? returnnewBigDecimal(numStack.pop().getNum());??????if(symbolStack。countSymbol()==1)? ?{??? BigDecimalnum11=newBigDecimal(numStack.pop()。getNum());????BigDecimalnum22=newBigDecimal(numStack.pop().getNum());????Symbolsymbol11=symbolStack.pop();? ?charfuhao11=symbol11.getSymbol();?? ?switch(fuhao11)??? {????case'+':??? ?BigDecimalsum11=num11。add(num22);?????returnsum11;? ? case'-’:? ???BigDecimalsum22=num11.subtract(num22); ????returnsum22;????case'×':??? BigDecimalsum33=num11.multiply(num22); ?? ?returnsum33;????case’÷':??? ?BigDecimalsum44=num11.divide(num22,20,RoundingMode。HALF_UP);? ? returnsum44; ???}? ??returnnewBigDecimal(0.0);? ?}???else ?{????Symbolsymbol1=symbolStack.pop();????Symbolsymbol2=symbolStack.pop();?? ?charfuhao1=symbol1.getSymbol(); ? ?charfuhao2=symbol2.getSymbol();??? intsymbolFlag1=symbol1.getDegree(); ???intsymbolFlag2=symbol2。getDegree(); ???if(symbolFlag1>=symbolFlag2)? ??{? ??BigDecimalnum1=newBigDecimal(numStack。pop().getNum());?? ??BigDecimalnum2=newBigDecimal(numStack。pop().getNum());? ? ?switch(fuhao1)???? {???? case'+’:? ? ??BigDecimalsum=num1.add(num2);???? ?numStack.push(sum。toString()); ?? ? break;?????case’-’: ??? BigDecimalsum1=num1.subtract(num2);??????numStack.push(sum1.toString());??? ??break;?????case'×':??????BigDecimalsum3=num1。multiply(num2); ??? numStack。push(sum3.toString());??? ??break;?????case'÷’: ??? ?BigDecimalsum4=num1。divide(num2,20,RoundingMode。HALF_UP);??????numStack。push(sum4。toString()); ?????break;? ? ?} ?? ?symbolStack.push(fuhao2); ?? ?returncalculat(yī)or(numStack,symbolStack);??? }????else?? ?{?? ? BigDecimalnum1=newBigDecimal(numStack.pop().getNum()); ?? BigDecimalnum2=newBigDecimal(numStack.pop().getNum());?? ? BigDecimalnum3=newBigDecimal(numStack。pop().getNum());?????switch(fuhao2) ?? {?????case'+’: ?????BigDecimalsum=num2.add(num3); ?????numStack.push(sum.toString()); ?? ??break;???? case’-':?? ? BigDecimalsum1=num2。subtract(num3);? ? numStack.push(sum1.toString());???? ?break;?? ?case'×':???? ?BigDecimalsum3=num2.multiply(num3);;????? numStack。push(sum3。toString());???? ?break; ?? case'÷’:?? ???BigDecimalsum4=num2.divide(num3,20,RoundingMode.HALF_UP); ? ? numStack.push(sum4.toString());???? break;?????}? ?? numStack。push(num1.toString());??? ?symbolStack.push(fuhao1);?????returncalculator(numStack,symbolStack);????}? ?}?????}?2.5結(jié)果輸出的處理當計算得出來以后,需要將輸出結(jié)果顯示在其次個EditView中,因此需要對得出的結(jié)果進行處理,以便在EditView中能夠正確地輸出。處理函數(shù)的代碼如下所示:?publicStringoutprocess(Strings)??{???char[]mass=s。toCharArray();? ?Strings1=”";???Strings2=”";???intflag=0;???for(inti=0;i<mass.length;i++)?? {? if(mass[i]==46)???? flag=i;//得出小數(shù)點所在的位置 ? }? ?if(flag==0)//結(jié)果為整數(shù)時???{????if(mass.length>=80)?????return”error?。?//結(jié)果較大時,不能很好地顯示出來,顯示error????else????{if(mass.length>=20)//整數(shù)長度大于20時,以指數(shù)形式表示,太長則保留13位精度?? ? {?? ??inti;?? ?? s1=s1+mass[0]+’?!? ? ??if(mass[14]〉=5+'0')???????mass[13]++; ?????for(i=1;i〈=13;i++)????? ?s1=s1+mass[i];??? ??char[]mass1=s1。toCharArray();???? ?for(i=mass1.length—1;i>=0;i—-) ? ???{?? ?? ?if(mass1[i]!='0')?????? ?break;?? ???} ?????if(mass1[i]==46) ?? ???i--;??????for(intj=0;j<=i;j++)?????? s2=s2+mass1[j];??? ??s2=s2+’E'+(mass。length—1);??????returns2;???? } ??? else//其他情況不做處理,直接顯示結(jié)果? ????returns;?? ?}????? ?}? if(flag!=0&&mass。length<20)//結(jié)果為小數(shù),而且長度小于20時 ??{??? inti; ???for(i=mass。length—1;i>=0;i--)//小數(shù)點后面連續(xù)的0不顯示出來? ??{???? if(mass[i]!='0')??? ??break; ???}??? if(mass[i]==46)//如果小數(shù)點后全為0,則小數(shù)點也不顯示出來?????i--;? ?for(intj=0;j<=i;j++)?????s1=s1+mass[j]; ? ?returns1;? }?????? ?if(flag!=0&&mass.length>=20)//結(jié)果為小數(shù),長度大于等于20時 ??{ ???if(flag〉=18)?? return"error!";//如果小數(shù)點前面有17位,則結(jié)果不能顯示出來,顯示錯誤 ??else ? { ??inti; ?? ?if(mass[19]>=5+'0')//將第19位的數(shù)據(jù)進行四舍五入? ?? ?mass[18]++;?? ??for(i=0;i〈=18;i++)????? s1=s1+mass[i]; ?? ?char[]mass1=s1.toCharArray();?????for(i=mass1。length-1;i〉=0;i--)//小數(shù)點后面連續(xù)的0不顯示出來???? { ?????if(mass1[i]!='0')? ? ? break; ??? }?? ??if(mass1[i]==46)//如果小數(shù)點后全為0,則小數(shù)點也不顯示出來???? ?i—-; ????for(intj=0;j〈=i;j++)??? ??s2=s2+mass1[j]; ?? ?returns2;? ??}? ? ? } ? returns; ?}3.源代碼程序源代碼如下所示:packagearms.calculator;importjava。mat(yī)h.BigDecimal;importjava.math.RoundingMode;importandroid.app.Activity;importandroid.os.Bundle;importandroid.text.Editable;importandroid.text.Selection;importandroid。view.View;importandroid。view.View.OnClickListener;importandroid。widget.Button;importandroid。widget。EditText;classFlag{?privat(yī)einta0;?privateinta1;?privateinta2;?privateinta3; publicinta0()?{ returna0;?} publicinta1() { returna1;?}?publicinta2()?{ returna2;?}?publicinta3()?{?returna3; }?publicFlag(inta,intb,intc,intd)?{??a0=a;??a1=b;??a2=c;??a3=d;?}?publicFlagnext;}classFlagList{?privat(yī)eFlagfirst;?publicFlagList(inta,intb,intc,intd)?{?first=null; }?publicbooleanisEmpty()?{return(first==null);} publicvoidinsertFirst(inta,intb,intc,intd) {?????? ?? ?FlagnewFlag=newFlag(a,b,c,d);??newFlag.next=first; ?first=newFlag;?}?publicFlagdeleteFirst() { ?Flagtemp=first; first=first.next;??returntemp;?}}classFlagStack{?privateFlagListtheFlagList; privateintcount; publicFlagStack()?{??theFlagList=newFlagList(0,0,0,0);??count=0;?}?publicvoidpush(inta,intb,intc,intd) {??theFlagList.insertFirst(a,b,c,d);??count++;?}?publicFlagpop()?{??count=count-1; returntheFlagList。deleteFirst();? ?}?publicbooleanisEmpty()?{ ?return(theFlagList.isEmpty());?}?publicintcount() {??returncount;?}}classNum{?privateStrings=newString();?publicNum(Strings1)?{??s=s1; }?publicStringgetNum()?{? returns;?}?publicNumnext;}classNumList{?privat(yī)eNumfirstNum;?publicNumList()?{?firstNum=null; }?publicbooleanisEmpty() {return(firstNum==null);}?publicvoidinsertFirst(Strings1) {? ????? ???NumnewNum=newNum(s1);??newNum.next=firstNum;??firstNum=newNum;?}?publicNumdeleteFirst() {??Numtemp=firstNum;???firstNum=firstNum.next;??returntemp;?}}classNumStack{ privat(yī)eNumListtheNumList; privateintcountNum;?publicNumStack()?{??theNumList=newNumList();? countNum=0; } publicvoidpush(Strings1)?{??theNumList.insertFirst(s1);? countNum++;?}?publicNumpop()?{??countNum=countNum-1;??returntheNumList。deleteFirst();???}?publicbooleanisEmpty()?{??return(theNumList.isEmpty()); }?publicintcountNum() {??returncountNum;?}}classSymbol{?privatecharc;?privateintdegree1; publicSymbol(charc1)?{??c=c1;??if(c=='×’||c=='÷’)? degree1=2;??else ??degree1=1;?} publicintgetDegree()?{ ?returndegree1;?}?publicchargetSymbol()?{??returnc;?}?publicSymbolnext;}classSymbolList{?privat(yī)eSymbolfirstSymbol;?publicSymbolList()?{?firstSymbol=null;?}?publicbooleanisEmpty()?{return(firstSymbol==null);}?publicvoidinsertFirst(charc1) {??? ???????SymbolnewSymbol=newSymbol(c1);??newSymbol.next=firstSymbol;? firstSymbol=newSymbol; }?publicSymboldeleteFirst()?{??Symboltemp=firstSymbol;? ?firstSymbol=firstSymbol.next;??returntemp; }}classSymbolStack{?privat(yī)eSymbolListtheSymbolList;?privateintcountSymbol;?publicSymbolStack()?{??theSymbolList=newSymbolList();??countSymbol=0;?}?publicvoidpush(charc1)?{ theSymbolList.insertFirst(c1);??countSymbol++;?} publicSymbolpop()?{??countSymbol=countSymbol-1;??returntheSymbolList.deleteFirst();? ?}?publicbooleanisEmpty()?{??return(theSymbolList.isEmpty());?}?publicintcountSymbol() {??returncountSymbol;?}}publicclassCalculatorActivityextendsActivity{/**Calledwhentheactivityisfirstcreat(yī)ed。*/ privateEditTexttext;?privateEditTexttext1;?privateButton[]button=newButton[20];?privateStringstr="”;?privateintflag0=0;???//處理0的輸出為1則表示數(shù)字的開頭有一個0?privateintflag1=0;? //處理0的輸出每個數(shù)開頭的標志數(shù)值為0表示為數(shù)字開頭?privateintflag2=0;? ?//處理小數(shù)點?privateintflag3=0;???//處理運算符的輸出?privat(yī)eintflag4=0;//處理ON/OFF問題?privateintflag5=0;//處理等號問題 privateFlagStackflagstack=newFlagStack(); privateNumStacknumStack=newNumStack();?privat(yī)eNumStacknumStack1=newNumStack(); privateSymbolStacksymbolStack=newSymbolStack();?privateSymbolStacksymbolStack1=newSymbolStack();?privat(yī)eString[]fuhao=newString[4]; @OverridepublicvoidonCreate(BundlesavedInstanceStat(yī)e){super.onCreate(savedInstanceStat(yī)e);setContentView(R.layout.main);fuhao[0]=”+”;fuhao[1]="-";fuhao[2]="×";fuhao[3]=”÷”;text=(EditText)findViewById(R.id.editText);text1=(EditText)findViewById(R.id.editText1);button[0]=(Button)findViewById(R.id.buttom0);button[1]=(Button)findViewById(R.id。buttom1);button[2]=(Button)findViewById(R。id。buttom2);button[3]=(Button)findViewById(R.id.buttom3);button[4]=(Button)findViewById(R.id。buttom4);button[5]=(Button)findViewById(R.id.buttom5);button[6]=(Button)findViewById(R。id.buttom6);button[7]=(Button)findViewById(R。id.buttom7);button[8]=(Button)findViewById(R.id.buttom8);button[9]=(Button)findViewById(R.id。buttom9);button[10]=(Button)findViewById(R.id。buttom10);button[11]=(Button)findViewById(R.id.buttom11);button[12]=(Button)findViewById(R.id。buttom12);button[13]=(Button)findViewById(R。id.buttom13);button[14]=(Button)findViewById(R.id。buttom14);button[15]=(Button)findViewById(R。id。buttom15);button[16]=(Button)findViewById(R.id.buttom16);button[17]=(Button)findViewById(R.id.buttom17);button[18]=(Button)findViewById(R。id.buttom18);button[19]=(Button)findViewById(R.id。buttomback);for(inti=0;i〈=19;i++){?button[i].setOnClickListener(newButtonListener());?button[i].setEnabled(false);?}button[10].setEnabled(true);flag4=1;}classButtonListenerimplementsOnClickListener{??publicBigDecimalcalculat(yī)or(NumStacknumStack,SymbolStacksymbolStack)??{ ?if(numStack.countNum()==1)?? ?returnnewBigDecimal(numStack.pop().getNum()); ??? if(symbolStack.countSymbol()==1)?? {??? BigDecimalnum11=newBigDecimal(numStack.pop()。getNum());?? ?BigDecimalnum22=newBigDecimal(numStack.pop().getNum());??? Symbolsymbol11=symbolStack.pop();? ??charfuhao11=symbol11。getSymbol(); ???switch(fuhao11)? ?{?? case’+’:?????BigDecimalsum11=num11.add(num22);???? returnsum11; ??case'-':? ???BigDecimalsum22=num11.subtract(num22);? ???returnsum22;????case'×’:? ? ?BigDecimalsum33=num11.multiply(num22);?? ??returnsum33;????case'÷’:?? ??BigDecimalsum44=num11.divide(num22,20,RoundingMode.HALF_UP); ????returnsum44;????}? ? returnnewBigDecimal(0。0);?? } ??else? ?{? ??Symbolsymbol1=symbolStack.pop(); ?Symbolsymbol2=symbolStack.pop();?? charfuhao1=symbol1.getSymbol(); ?? charfuhao2=symbol2.getSymbol();????intsymbolFlag1=symbol1.getDegree();?? ?intsymbolFlag2=symbol2.getDegree();????if(symbolFlag1〉=symbolFlag2)????{?????BigDecimalnum1=newBigDecimal(numStack.pop()。getNum());???? BigDecimalnum2=newBigDecimal(numStack。pop().getNum());??? ?switch(fuhao1)? ?? {?????case’+':??? ??BigDecimalsum=num1.add(num2);?? ? numStack.push(sum.toString());? ??? break;?? ??case'-':? ?? ?BigDecimalsum1=num1.subtract(num2);?? ??numStack.push(sum1.toString()); ? ???break;? ?case'×':??????BigDecimalsum3=num1.multiply(num2);? ?? ?numStack.push(sum3。toString());????? break;? ???case'÷’:??? ??BigDecimalsum4=num1。divide(num2,20,RoundingMode.HALF_UP);??? ??numStack.push(sum4.toString());? ????break;? ? ?}?? ?symbolStack.push(fuhao2);?????returncalculat(yī)or(numStack,symbolStack); ?? }?? ?else?? ?{ ?? ?BigDecimalnum1=newBigDecimal(numStack。pop().getNum());?????BigDecimalnum2=newBigDecimal(numStack。pop()。getNum());?????BigDecimalnum3=newBigDecimal(numStack.pop().getNum());?????switch(fuhao2)?? ??{? ??case'+':? ? BigDecimalsum=num2.add(num3);??? ??numStack.push(sum.toString());? ????break; ????case'—':?? ? BigDecimalsum1=num2。subtract(num3);??? numStack.push(sum1。toString());???? ?break;???? case’×':??????BigDecimalsum3=num2.multiply(num3);;??????numStack.push(sum3.toString());? ? ??break;?????case’÷': ?? BigDecimalsum4=num2.divide(num3,20,RoundingMode.HALF_UP);??????numStack。push(sum4.toString());? ????break; ? ?} ? ??numStack。push(num1.toString());? ???symbolStack.push(fuhao1);?????returncalculator(numStack,symbolStack);? ? }? ?} ????}??publicStringoutprocess(Strings)??{???char[]mass=s。toCharArray();???Strings1="";?? Strings2="";???intflag=0;???for(inti=0;i<mass.length;i++)???{?? ?if(mass[i]==46)? ???flag=i;? ?}???if(flag==0)?? { ???if(mass.length>=80)? ???return"error?。? ???else? ??{? ???if(mass。length>=20)? ??{? ??inti; ?????s1=s1+mass[0]+’。';? ????if(mass[14]〉=5+'0’)? ?????mass[13]++;???? for(i=1;i〈=13;i++) ???? s1=s1+mass[i];??????char[]mass1=s1.toCharArray();??? ??for(i=mass1.length—1;i>=0;i--)??????{ ?? ???if(mass1[i]!='0')?? ?? ?break; ?? ??}? ?? ?if(mass1[i]==46) ??????i--;? ? ??for(intj=0;j<=i;j++)??? ? ?s2=s2+mass1[j]; ??? ?s2=s2+’E'+(mass.length-1);???? ?returns2;?? ?} ????else??????returns;??? }?? ????}???if(flag!=0&&mass.length<20)?? {?? ?inti;????for(i=mass。length—1;i>=0;i—-)????{?? ??if(mass[i]!=’0')??????break; ??} ?? if(mass[i]==46)? ???i——;????for(intj=0;j<=i;j++)??? ?s1=s1+mass[j];? returns1;?? }?? ?? ? if(flag!=0&&mass.length>=20)???{????if(flag>=18) ?? ?return"error!";?? else????{?????inti;? ? ?if(mass[19]〉=5+’0')? ??mass[18]++;?????for(i=0;i<=18;i++)??????s1=s1+mass[i];?? ??char[]mass1=s1.toCharArray();??? ?for(i=mass1。length—1;i>=0;i--)?????{ ????if(mass1[i]!=’0')?? ?? break;?????}??? if(mass1[i]==46)??? ??i—-; ???for(intj=0;j<=i;j++)??? ??s2=s2+mass1[j];?????returns2; ??}??? ???} ??returns;??}?@Override??publicvoidonClick(Viewv){ ??//TODOAuto-generatedmethodstub??if(flag5==1)? {???str="";?? ?text.setText(str);????flag0=0;? ? flag1=0; ??flag2=0;?? ?flag3=0;?? ?flag4=0;? ? FlagStackflagstack1=newFlagStack();??? flagstack=flagstack1;? ??text1.setText("");?? flag5=0;??} ??if((Button)v==button[0])? {?? ?flag3=0; ? ?if(flag1==1)????{? ? ?str=str+0;? ???text。setText(str); ?flagstack.push(flag0,flag1,flag2,flag3);? ??}??? if(flag0==0&&flag1==0)?? ?{??? ?str=str+0;? ??text。setText(str);?????flag0=1; ????flagstack.push(flag0,flag1,flag2,flag3); ? ?} ??} ?for(inti=1;i<=9;i++)???{??? if((Button)v==button[i])??? {?????if(flag1==0&&flag0==1)?? ?{ ? ??char[]a=str.toCharArray();? ? ?str="";???? for(intj=0;j<a。length-1;j++)??????{ ??? str=str+a[j];??????}??????if(flagstack。count()>0) ??????flagstack.pop();??? ?} ????str=str+i; ?? ?flag0=0;?????flag1=1;???? text.setText(str);???? flag3=0;?????flagstack.push(flag0,flag1,flag2,flag3); ??}???}???if((Button)v==button[10]) ??{ ? if(flag4==1)????{? ???str="0";??? text.setText(str);???? flag0=1;?????flag1=0;? ? ?flag2=0; ?? ?flag3=0;?? flag4=0;? ???for(inti=0;i<=19;i++)?????{??????button[i].setEn

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論