java計算器課程設(shè)計_第1頁
java計算器課程設(shè)計_第2頁
java計算器課程設(shè)計_第3頁
java計算器課程設(shè)計_第4頁
java計算器課程設(shè)計_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

word文檔可自由復(fù)制編輯課程設(shè)計說明書NO.1Java簡單計算器課程設(shè)計1.功能描述本計算器可以進行簡單的四則運算(加、減、乘、除)但僅限于十進制下,還可以進行(八進制,十進制,十六進制)之間的相互轉(zhuǎn)換,八進制最多可以輸入19位數(shù),十進制最多可以輸入18位數(shù),十六進制最多可以輸入14位數(shù),backspace表示退格,clear表示初始化,在window下直接運行(Jsp2003.bat)即可,界面為灰白對稱。2.方案論證2.1概要設(shè)計2.1.1自定義類說明

**********************************************************

類名:This_number_too_big

作用:自定義的異常類,用來處理計算結(jié)果溢出

繼承的父類:Exception類

實現(xiàn)的接口:沒有

**********************************************************

classThis_number_too_bigextendsException

{

}//自定義的一個結(jié)果溢出異常類

**********************************************************

類名:Jsp2003

作用:主類

繼承的父類:Frame類

實現(xiàn)的接口:ItemListener類,ActionListener類

**********************************************************

classJsp2003extendsFrameimplementsItemListener,ActionListener

{

publicintnumber=0,length=18;沈陽大學(xué)課程設(shè)計說明書NO.2//number是用來記錄輸入的數(shù)字個數(shù),

//length是用來設(shè)置在不同進制下允許輸入的最多數(shù)字位數(shù),默認(rèn)為十進制publiccharmark='n';

//設(shè)置運算符號為沒有即為‘n’,它的值是‘+’‘-’‘*’‘/’

publicdoubledata=0;

//設(shè)置運算數(shù)據(jù)為零

publiccharch;

//用來臨時存放所按按鈕的第一個字符

publicbooleanRefresh=false;

//設(shè)置lab是否要在輸入數(shù)據(jù)的時候刷新,初始為否

2.1.2主要方法說明://用來處理按了運算符后的計算-

publicvoidjs()throwsThis_number_too_big//指定由method拋出異常

{if(mark=='n')//沒有運算符

{mark=ch;//,則設(shè)置運算符為剛剛輸入的字符,

data=Double.parseDouble(lab.getText());//則設(shè)置運算數(shù)據(jù)為lab的值

Refresh=true;//則設(shè)置下一次輸入的時候要刷新lab

}

else//如果采用的是連續(xù)運算(即沒有使用‘=’號)則運行下面的語句

{switch(mark)//根據(jù)運算符計算結(jié)果,并把結(jié)果保存到data

{case'+':data+=Double.parseDouble(lab.getText());break;

case'-':data-=Double.parseDouble(lab.getText());break;

case'*':data*=Double.parseDouble(lab.getText());break;

case'/':data/=Double.parseDouble(lab.getText());break;}

lab.setText(Double.toString(data));//顯示運算結(jié)果

mark=ch;//設(shè)置運算符為剛剛按下的運算符

Refresh=true;//則設(shè)置下一次輸入的時候要刷新lab

number=lab.getText().length();//設(shè)置輸入的字符個數(shù)沈陽大學(xué)課程設(shè)計說明書NO.3//System.out.println(lab.getText());//用來調(diào)試用的

if(data>Double.MAX_VALUE)

//如果data超過double類型的最大值則拋出自定義的一個異常類

{thrownewThis_number_too_big();}

}

}//endjs()method

publicvoidenter()//處理輸入字符

{if(Refresh==true)

//如果已經(jīng)設(shè)置了運算符則在下一次輸入數(shù)據(jù)的時候要把以前l(fā)ab的內(nèi)容清除掉

{lab.setText("0");number=0;Refresh=false;}

if(lab.getText().charAt(0)=='0'&&lab.getText().length()==1)

//如果lab的內(nèi)容為0則,lab的內(nèi)容將被所輸入的字符代替,

//否則直接在lab的內(nèi)容后面加上所輸入的字符

{lab.setText(Character.toString(ch));number++;}

else

if(number<length)

{number++;lab.setText(lab.getText()+ch);}

}//endenter()method

//八進制或十六進制轉(zhuǎn)換成十進制I

publicStringgoto_10(Strings,longl)

//參數(shù)s:是要轉(zhuǎn)換的字符串,由于輸入的控制,保證了字符串的合法性;

//參數(shù)l:使用來設(shè)置是將8進制還是16進制轉(zhuǎn)換成10進制,它的有效值為8或16;

{Stringstr=s;//用來轉(zhuǎn)換的字符串

longj=l;//表示進制

longlg=0,jing=1;//lg用來記錄權(quán)乘和,jing用來記錄位權(quán)

charcha;//臨時記錄要轉(zhuǎn)換的字符

for(inti=1;i<=str.length();i++)沈陽大學(xué)課程設(shè)計說明書NO.4{cha=str.charAt(str.length()-i);

switch(cha)

{case'1':lg=lg+1*jing;break;

case'2':lg=lg+2*jing;break;

case'3':lg=lg+3*jing;break;

case'4':lg=lg+4*jing;break;

case'5':lg=lg+5*jing;break;

case'6':lg=lg+6*jing;break;

case'7':lg=lg+7*jing;break;

case'8':lg=lg+8*jing;break;

case'9':lg=lg+9*jing;break;

case'A':lg=lg+10*jing;break;

case'B':lg=lg+11*jing;break;

case'C':lg=lg+12*jing;break;

case'D':lg=lg+13*jing;break;

case'E':lg=lg+14*jing;break;

case'F':lg=lg+15*jing;break;}

jing*=j;//位權(quán)升一級,為下次使用做好準(zhǔn)備

}

returnLong.toString(lg);

}//endStringgoto_10()method

}2.1.3系統(tǒng)流程圖沈陽大學(xué)課程設(shè)計說明書NO.5圖1系統(tǒng)流程圖2.2詳細(xì)設(shè)計2.2.1具體設(shè)計首先分析這個說要完成的任務(wù),它的主要任務(wù)是完成十六進制、十進制、八進制和二進制之間的相互轉(zhuǎn)化,需要包含負(fù)數(shù),但不用考慮小數(shù)。

其次,確定接口參數(shù)。根據(jù)功能可知,它傳遞給外部的就是一個轉(zhuǎn)后的數(shù)據(jù),而外部除了需要傳遞給轉(zhuǎn)化前的數(shù)據(jù)以外,是否還需要其他參數(shù)呢?我們都知道,十進制的負(fù)數(shù)同樣可以利用其他進制進行表示,例如二進制,轉(zhuǎn)化方法是:求十進制數(shù)的絕對值對應(yīng)的二進制數(shù),最高位為1;然后對二進制逐位求反,最高位除外;接著最低一位加1,需要進位的話依次進位,最高位除外。如今的問題就擺在了我們面前,我們?nèi)绾沃肋@個數(shù)的最高位是第幾位呢,也許有人會說,那就用轉(zhuǎn)化后的前面再加上一位,好,即使這樣可以成立,那么-1轉(zhuǎn)化后就是11,3轉(zhuǎn)化后也為11,現(xiàn)在如果需要現(xiàn)在的把這個數(shù)二進制數(shù)再轉(zhuǎn)化為十進制,那么我們?nèi)绾沃涝瓉淼氖钦龜?shù)還是負(fù)數(shù)呢,如果要轉(zhuǎn)化為十六進制,八進制又當(dāng)如何呢?經(jīng)過以上的分析發(fā)現(xiàn),還應(yīng)該有另外一個參數(shù)沈陽大學(xué)課程設(shè)計說明書NO.6——二進制時的寬度,只有這樣才能知道誰是最高位,因此就稱這個參數(shù)為位寬。

最后,設(shè)計類。根據(jù)第二步的分析,因為位寬對每一個方法都是一樣,所以可能把它作為類的成員變量,而另外兩個參數(shù)轉(zhuǎn)化前的值和轉(zhuǎn)化后的值就分別作為輸入?yún)?shù)和返回值。而類對外的接口只有各個轉(zhuǎn)化的方法,因此這幾個方法設(shè)計為public權(quán)限,而其它所有的輔助方法都為private權(quán)限。位寬通過構(gòu)造函數(shù)傳遞,外部不能直接訪問和修改,設(shè)置也設(shè)置為private權(quán)限。為了減少計算量,所有的轉(zhuǎn)化都以二進制為中介。例如十六進制到十進制,是十六進制→二進制→十進制。2.2.2主要模塊說明[1]把文本框和清空按鈕加在第一個板上

p1.add(text1);p1.add(bclear);

bclear.addActionListener(this);

for(inti=0;i<10;i++)

{

b[i]=newButton(Integer.toString(i));

}

bpoint=newButton(".");

beq=newButton("=");

[2]把所有數(shù)字按鈕和"."及"="加在第二個板上

for(inti=0;i<10;i++){

p2.add(b[i]);

b[i].addActionListener(this);

}

p2.add(bpoint);p2.add(beq);

bpoint.addActionListener(this);beq.addActionListener(this);

[3]把運算符號按鈕加在第三個板上

badd=newButton("+");

bsbb=newButton("-");

bmult=newButton("*");沈陽大學(xué)課程設(shè)計說明書NO.7bdiv=newButton("/");

p3.add(badd);

p3.add(bsbb);

p3.add(bmult);

p3.add(bdiv);

badd.addActionListener(this);

bsbb.addActionListener(this);

bmult.addActionListener(this);

bdiv.addActionListener(this);

add(p1);add(p2);add(p3);add(newLabel(""));

}

publicvoidactionPerformed(ActionEvente)

{

for(inti=0;i<10;i++){

if(e.getSource()==b[i]||e.getSource()==bpoint){

s=s+e.getActionCommand();

text1.setText(s);

break;

}

}

[4]判斷運算符號,并作上標(biāo)記

if(e.getSource()==badd){

x=Double.parseDouble(s);

flag=1;

text1.setText("");

s="";

}沈陽大學(xué)課程設(shè)計說明書NO.8if(e.getSource()==bsbb){

x=Double.parseDouble(s);

flag=2;

text1.setText("");

s="";

}

if(e.getSource()==bmult){

x=Double.parseDouble(s);

flag=3;

text1.setText("");

s="";

}

if(e.getSource()==bdiv){

x=Double.parseDouble(s);

flag=4;

text1.setText("");

s="";

}

[5]清空并標(biāo)志為0

if(e.getSource()==bclear){

text1.setText("");

s="";

flag=0;

}

[6]運算

if(e.getSource()==beq){

switch(flag){沈陽大學(xué)課程設(shè)計說明書NO.9case1:

{

x=Double.parseDouble(s)+x;

Strings=String.valueOf(x);

text1.setText(s);break;

}

case2:

{

x=x-Double.parseDouble(s);

Strings=String.valueOf(x);

text1.setText(s);break;

}

case3:

{x=Double.parseDouble(s)*x;

Strings=String.valueOf(x);

text1.setText(s);break;

}

case4:

{

if(Double.parseDouble(s)==0){text1.setText("除數(shù)不能為0!");break;}

x=x/Double.parseDouble(s);

Strings=String.valueOf(x);

text1.setText(s);break;

}3.運行結(jié)果3.1程序運行效果截圖沈陽大學(xué)課程設(shè)計說明書NO.10圖2計算器運行效果圖圖3加法運算效果圖圖4減法運算效果圖沈陽大學(xué)課程設(shè)計說明書NO.11圖5乘法運算效果圖圖6除法運算效果圖沈陽大學(xué)課程設(shè)計說明書NO.123.2程序測試分析3.2.1程序正常的響應(yīng)按鈕事件,輸入的數(shù)值長度受變量length的限定,進行混合四則運算的時候,結(jié)果如果不是很大,可以正常顯示,但如果結(jié)果很大,就可能采用科學(xué)記數(shù)方式,這樣帶來了進制轉(zhuǎn)換時的麻煩,需要特殊的處理科學(xué)記數(shù)里的E,當(dāng)結(jié)果太大的時候,有可能超出可能表示的最大值,(結(jié)果溢出),這個時候就要對結(jié)果進行必要的異常處理,我在輸出結(jié)果的方法內(nèi)設(shè)置if語句,如果結(jié)果大于某一個值就拋出一個This_number_too_big類型的類,再使用try-catch,捕捉輸出結(jié)果的方法拋出的異常對象。然后進行,重制歸零的處理。3.2.2程序異常處理:當(dāng)結(jié)果超出Double.MAX_VALUE時,將拋出一個This_number_too_big類的異常對象,這個是我自定義的一個異常類它繼承自Exception類,然后使用try-catch去捕捉這個異常,異常的處理如下:

try

{js();}

catch(This_number_too_bige)

{

lab.setText("0");

number=0;

mark='n';

Refresh=false;

System.out.println("Thenumberistoobig");

}//如果出現(xiàn)異常則初始化效果如同clear鍵4.總結(jié)通過此次課程設(shè)計,將我本學(xué)期所學(xué)的JAVA知識得到鞏固和應(yīng)用,在設(shè)計的過程中我遇到了很到問題,不過在老師和同學(xué)們的幫助和自己的思考下還是很好的完成了。這此課程設(shè)計還讓我懂得了寫程序不能閉門造車,要努力拓寬知識面,開闊視野,拓展思維。它還讓我學(xué)會了在網(wǎng)上查閱那些無限的資料。通過對此課題的開發(fā),使我對用JBuilder9.0開發(fā)系統(tǒng)有了一個比較清楚的認(rèn)識,體會到理論和實踐的重要性。由于自己的分析設(shè)計和程序經(jīng)驗不足,該系統(tǒng)設(shè)計和實現(xiàn)過程中,還有許多沒有完善的地方,比如用戶界面設(shè)計不夠美觀,異常出錯處理比較差等多方面問題,這些都有待進一步完善和提高。對于文中出現(xiàn)的不足和系統(tǒng)中出現(xiàn)的問題敬請老師指導(dǎo)。5.參考文獻(xiàn)1.朱戰(zhàn)立,沈偉.Java程序設(shè)計實用教程[M].北京:電子工業(yè)出版社,2005.01:59-982.李誠等.Java2簡明教程[M],第2版.北京:清華大學(xué)出版社,2004.08:165-201沈陽大學(xué)課程設(shè)計說明書NO.133.耿祥義.Java課程設(shè)計[M].北京:清華大學(xué)出版社,2004.02:53-786.附錄:源代碼importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

importjava.util.Vector;

publicclassTuo

{

Stringstr1="0";//運算數(shù)1初值一定為0為了程序的安全

Stringstr2="0";//運算數(shù)2

Stringfh="+";//運算符

Stringjg="";//結(jié)果

//狀態(tài)開關(guān)重要

intk1=1;//開關(guān)1用于選擇輸入方向?qū)⒁獙懭雜tr2或str2

intk2=1;//開關(guān)2符號鍵次數(shù)k2>1說明進行的是2+3-9+8這樣的多符號運算

intk3=1;//開關(guān)3str1是否可以被清0==1時可以!=1時不能被清0

intk4=1;//開關(guān)4str2同上

intk5=1;//開關(guān)5控制小數(shù)點可否被錄入==1時可以!=1輸入的小數(shù)點被丟掉

JButtonjicunqi;//寄存器記錄是否連續(xù)按下符號鍵

Vectorvt=newVector(20,10);

JFrameframe=newJFrame("計算器");

JTextFieldjg_TextField=newJTextField(jg,20);//20列

JButtonclear_Button=newJButton("清除");

JButtonbutton0=newJButton("0");

JButtonbutton1=newJButton("1");

JButtonbutton2=newJButton("2");

JButtonbutton3=newJButton("3");沈陽大學(xué)課程設(shè)計說明書NO.14JButtonbutton4=newJButton("4");

JButtonbutton5=newJButton("5");

JButtonbutton6=newJButton("6");

JButtonbutton7=newJButton("7");

JButtonbutton8=newJButton("8");

JButtonbutton9=newJButton("9");

JButtonbutton_Dian=newJButton(".");

JButtonbutton_jia=newJButton("+");

JButtonbutton_jian=newJButton("-");

JButtonbutton_cheng=newJButton("*");

JButtonbutton_chu=newJButton("/");

JButtonbutton_dy=newJButton("=");

////////////////////////////////////////////////////////////////////////

publicstaticvoidmain(String[]args)

{

Tuotuo=newTuo();

}

/////////////////////////////////////////////////////////////////////////

Tuo()

{

button0.setMnemonic(KeyEvent.VK_0);//等效鍵

//其它等效鍵略,

jg_TextField.setHorizontalAlignment(JTextField.RIGHT);//文本框右對齊

JPanelpan=newJPanel();

pan.setLayout(newGridLayout(4,4,5,5));//四行四列邊距為5像素

pan.add(button7);

pan.add(button8);沈陽大學(xué)課程設(shè)計說明書NO.15pan.add(button9);

pan.add(button_chu);

pan.add(button4);

pan.add(button5);

pan.add(button6);

pan.add(button_cheng);

pan.add(button1);

pan.add(button2);

pan.add(button3);

pan.add(button_jian);

pan.add(button0);

pan.add(button_Dian);

pan.add(button_dy);

pan.add(button_jia);

pan.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));//pan對象的邊距

JPanelpan2=newJPanel();

pan2.add(jg_TextField);

JPanelpan3=newJPanel();//為什么要多此一句呢?因為我不會設(shè)置按鈕的大小

pan3.setLayout(newFlowLayout());

pan3.add(clear_Button);

//clear_Button.setSize(10,10);//設(shè)置清零按鈕的大小嗎的不好使?。?/p>

frame.setLocation(300,200);//主窗口出現(xiàn)在位置

frame.setResizable(false);//不能調(diào)大小

frame.getContentPane().setLayout(newBorderLayout());

frame.getContentPane().add(pan2,BorderLayout.NORTH);

frame.getContentPane().add(pan,BorderLayout.CENTER);

frame.getContentPane().add(pan3,BorderLayout.SOUTH);沈陽大學(xué)課程設(shè)計說明書NO.16frame.pack();

frame.setVisible(true);

//以上是控件和布局

//下面是事件處理程序

//---------------數(shù)字鍵----------------

classJianTingimplementsActionListener

{

publicvoidactionPerformed(ActionEvente)

{

Stringss=((JButton)e.getSource()).getText();

jicunqi=(JButton)e.getSource();

vt.add(jicunqi);

if(k1==1)

{

if(k3==1)

{

str1="";

k5=1;//還原開關(guān)k5狀態(tài)

}

str1=str1+ss;

//k2=1;

k3=k3+1;

//System.out.println(str1);

jg_TextField.setText(str1);//顯示

}

elseif(k1==2)

{

if(k4==1)沈陽大學(xué)課程設(shè)計說明書NO.17{

str2="";

k5=1;//還原開關(guān)k5狀態(tài)

}

str2=str2+ss;

//k2=2;

k4=k4+1;

///////////////測試////////////////

jg_TextField.setText(str2);

}

}

}

//--------符號-----------

classJianTing_fhimplementsActionListener

{

publicvoidactionPerformed(ActionEvente)

{

Stringss2=((JButton)e.getSource()).getText();

jicunqi=(JButton)e.getSource();

vt.add(jicunqi);

if(k2==1)

{

k1=2;//開關(guān)k1為1時,向數(shù)1寫為2時,向數(shù)2寫

k5=1;

fh=ss2;

k2=k2+1;//按符號鍵的次數(shù)

}沈陽大學(xué)課程設(shè)計說明書NO.18else{

inta=vt.size();

JButtonc=(JButton)vt.get(a-2);

if(!(c.getText().equals("+"))&&!(c.getText().equals("-"))&&!(c.getText().equals("*"))&&!(c.getText().equals("/")))

//if(!(vt.get(a-2).getText().equals("-"))||!(vt.get(a-2).getText().equals("+"))||!(vt.get(a-2).getText().equals("*"))||!(vt.get(a-2).getText().equals("/")))

{yuns();

str1=jg;

k1=2;//開關(guān)k1為1時,向數(shù)1寫為2時,向數(shù)2寫

k5=1;

k4=1;

fh=ss2;

}k2=k2+1;

}

}

}

//--------清除-------

classJianTing_clearimplementsActionListener

{

publicvoidactionPerformed(ActionEvente)

{

jicunqi=(JButton)e.getSource();

vt.add(jicunqi);

k5=1;

k2=1;

k1=1;

k3=1;沈陽大學(xué)課程設(shè)計說明書NO.19k4=1;

str1="0";

str2="0";

fh="";

jg="";

jg_TextField.setText(jg);

vt.clear();

}

}

//----------------等于---------------------

classJianTing_dyimplementsActionListener

{

publicvoidactionPerformed(ActionEvente)

{

jicunqi=(JButton)e.getSource();

vt.add(jicunqi);

yuns();

k1=1;//還原開關(guān)k1狀態(tài)

//str1=jg;

k2=1;

k3=1;//還原開關(guān)k3狀態(tài)

k4=1;//還原開關(guān)k4狀態(tài)

str1=jg;//為7+5=12+5=17這種計算做準(zhǔn)備

}

}

//----------------小數(shù)點---------------------

classJianTing_xiaosimplementsActionListener沈陽大學(xué)課程設(shè)計說明書NO.20{

publicvoidactionPerformed(ActionEvente)

{

jicunqi=(JButton)e.getSource();

vt.add(jicunqi);

if(k5==1)

{

Stringss2=((JButton)e.getSource()).getText();

if(k1==1)

{

if(k3==1)

{

str1="";

k5=1;//還原開關(guān)k5狀態(tài)

}

str1=str1+ss2;

//k2=1;

k3=k3+1;

//System.out.println(str1);

jg_TextField.setText(str1);//顯示

}

elseif(k1==2)

{

if(k4==1)

{

str2="";

k5=1;//還原開關(guān)k5狀態(tài)

沈陽大學(xué)課程設(shè)計說明書NO.21}

str2=str2+ss2;

//k2=2;

k4=k4+1;

///////////////測試////////////////

jg_TextField.setText(str2);

}

}

k5=k5+1;//

}

}

//注冊監(jiān)聽器

JianTing_dyjt_dy=newJianTing_dy();

JianTingjt=newJianTing();//臨聽數(shù)字鍵

JianTing_fhjt_fh=newJianTing_fh();//臨聽符號鍵

JianTing_clearjt_c=newJianTing_clear();//清除鍵

JianTing_xiaosjt_xs=newJianTing_xiaos();//小數(shù)點鍵

button7.addActionListener(jt);

button8.addActionListener(jt);

button9.addActionListener(jt);

button_chu.addActionListener(jt_fh);

button4.addActionListener(jt);

button5.addActionListener(jt);

button6.addActionListener(jt);

button_cheng.addActionListener(jt_fh);

button1.addActionListener(jt);沈陽大學(xué)課程設(shè)計說明書NO.22button2.addActionListener(

溫馨提示

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

最新文檔

評論

0/150

提交評論