java计算器课程设计.docx

上传人:b****3 文档编号:4890302 上传时间:2022-12-11 格式:DOCX 页数:19 大小:243.70KB
下载 相关 举报
java计算器课程设计.docx_第1页
第1页 / 共19页
java计算器课程设计.docx_第2页
第2页 / 共19页
java计算器课程设计.docx_第3页
第3页 / 共19页
java计算器课程设计.docx_第4页
第4页 / 共19页
java计算器课程设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

java计算器课程设计.docx

《java计算器课程设计.docx》由会员分享,可在线阅读,更多相关《java计算器课程设计.docx(19页珍藏版)》请在冰豆网上搜索。

java计算器课程设计.docx

java计算器课程设计

课程设计说明书NO.1

Java简单计算器课程设计

1.功能描述

本计算器可以进行简单的四则运算(加、减、乘、除)但仅限于十进制下,还可以进行(八进制,十进制,十六进制)之间的相互转换,八进制最多可以输入19位数,十进制最多可以输入18位数,十六进制最多可以输入14位数,backspace表示退格,clear表示初始化,在window下直接运行(Jsp2003.bat)即可,界面为灰白对称。

2.方案论证

2.1概要设计

2.1.1自定义类说明

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

类名:

This_number_too_big

作用:

自定义的异常类,用来处理计算结果溢出

继承的父类:

Exception类

实现的接口:

没有

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

classThis_number_too_bigextendsException

{

}//自定义的一个结果溢出异常类

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

类名:

Jsp2003

作用:

主类

继承的父类:

Frame类

实现的接口:

ItemListener类,ActionListener类

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

classJsp2003extendsFrameimplementsItemListener,ActionListener

{

publicintnumber=0,length=18;

沈阳大学

课程设计说明书NO.2

//number是用来记录输入的数字个数,

//length是用来设置在不同进制下允许输入的最多数字位数,默认为十进制publiccharmark='n';

//设置运算符号为没有即为‘n’,它的值是‘+’‘-’‘*’‘/’

publicdoubledata=0;

//设置运算数据为零

publiccharch;

//用来临时存放所按按钮的第一个字符

publicbooleanRefresh=false;

//设置lab是否要在输入数据的时候刷新,初始为否

2.1.2主要方法说明:

//用来处理按了运算符后的计算-

publicvoidjs()throwsThis_number_too_big//指定由method抛出异常

{if(mark=='n')//没有运算符

{mark=ch;//,则设置运算符为刚刚输入的字符,

data=Double.parseDouble(lab.getText());//则设置运算数据为lab的值

Refresh=true;//则设置下一次输入的时候要刷新lab

}

else//如果采用的是连续运算(即没有使用‘=’号)则运行下面的语句

{switch(mark)//根据运算符计算结果,并把结果保存到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));//显示运算结果

mark=ch;//设置运算符为刚刚按下的运算符

Refresh=true;//则设置下一次输入的时候要刷新lab

number=lab.getText().length();//设置输入的字符个数

沈阳大学

课程设计说明书NO.3

//System.out.println(lab.getText());//用来调试用的

if(data>Double.MAX_VALUE)

//如果data超过double类型的最大值则抛出自定义的一个异常类

{thrownewThis_number_too_big();}

}

}//endjs()method

publicvoidenter()//处理输入字符

{if(Refresh==true)

//如果已经设置了运算符则在下一次输入数据的时候要把以前lab的内容清除掉

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

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

//如果lab的内容为0则,lab的内容将被所输入的字符代替,

//否则直接在lab的内容后面加上所输入的字符

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

else

if(number

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

}//endenter()method

//八进制或十六进制转换成十进制I

publicStringgoto_10(Strings,longl)

//参数s:

是要转换的字符串,由于输入的控制,保证了字符串的合法性;

//参数l:

使用来设置是将8进制还是16进制转换成10进制,它的有效值为8或16;

{Stringstr=s;//用来转换的字符串

longj=l;//表示进制

longlg=0,jing=1;//lg用来记录权乘和,jing用来记录位权

charcha;//临时记录要转换的字符

for(inti=1;i<=str.length();i++)

沈阳大学

课程设计说明书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;//位权升一级,为下次使用做好准备

}

returnLong.toString(lg);

}//endStringgoto_10()method

}

2.1.3系统流程图

沈阳大学

课程设计说明书NO.5

图1系统流程图

2.2详细设计

2.2.1具体设计

首先分析这个说要完成的任务,它的主要任务是完成十六进制、十进制、八进制和二进制之间的相互转化,需要包含负数,但不用考虑小数。

 其次,确定接口参数。

根据功能可知,它传递给外部的就是一个转后的数据,而外部除了需要传递给转化前的数据以外,是否还需要其他参数呢?

我们都知道,十进制的负数同样可以利用其他进制进行表示,例如二进制,转化方法是:

求十进制数的绝对值对应的二进制数,最高位为1;然后对二进制逐位求反,最高位除外;接着最低一位加1,需要进位的话依次进位,最高位除外。

如今的问题就摆在了我们面前,我们如何知道这个数的最高位是第几位呢,也许有人会说,那就用转化后的前面再加上一位,好,即使这样可以成立,那么-1转化后就是11,3转化后也为11,现在如果需要现在的把这个数二进制数再转化为十进制,那么我们如何知道原来的是正数还是负数呢,如果要转化为十六进制,八进制又当如何呢?

经过以上的分析发现,还应该有另外一个参数

沈阳大学

课程设计说明书NO.6

——二进制时的宽度,只有这样才能知道谁是最高位,因此就称这个参数为位宽。

 最后,设计类。

根据第二步的分析,因为位宽对每一个方法都是一样,所以可能把它作为类的成员变量,而另外两个参数转化前的值和转化后的值就分别作为输入参数和返回值。

而类对外的接口只有各个转化的方法,因此这几个方法设计为public权限,而其它所有的辅助方法都为private权限。

位宽通过构造函数传递,外部不能直接访问和修改,设置也设置为private权限。

为了减少计算量,所有的转化都以二进制为中介。

例如十六进制到十进制,是十六进制→二进制→十进制。

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]把所有数字按钮和"."及"="加在第二个板上

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("*");

沈阳大学

课程设计说明书NO.7

bdiv=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]判断运算符号,并作上标记

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

x=Double.parseDouble(s);

flag=1;

text1.setText("");

s="";

}

沈阳大学

课程设计说明书NO.8

if(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]清空并标志为0

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

text1.setText("");

s="";

flag=0;

}

[6]运算

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

switch(flag){

沈阳大学

课程设计说明书NO.9

case1:

{

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("除数不能为0!

");break;}

x=x/Double.parseDouble(s);

Strings=String.valueOf(x);

text1.setText(s);break;

}

3.运行结果

3.1程序运行效果截图

沈阳大学

课程设计说明书NO.10

图2计算器运行效果图

图3加法运算效果图

图4减法运算效果图

沈阳大学

课程设计说明书NO.11

图5乘法运算效果图

图6除法运算效果图

沈阳大学

课程设计说明书NO.12

3.2程序测试分析

3.2.1程序运行情况:

程序正常的响应按钮事件,输入的数值长度受变量length的限定,进行混合四则运算的时候,结果如果不是很大,可以正常显示,但如果结果很大,就可能采用科学记数方式,这样带来了进制转换时的麻烦,需要特殊的处理科学记数里的E,当结果太大的时候,有可能超出可能表示的最大值,(结果溢出),这个时候就要对结果进行必要的异常处理,我在输出结果的方法内设置if语句,如果结果大于某一个值就抛出一个This_number_too_big类型的类,再使用try-catch,捕捉输出结果的方法抛出的异常对象。

然后进行,重制归零的处理。

3.2.2程序异常处理:

当结果超出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");

}//如果出现异常则初始化效果如同clear键

4.总结

通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。

这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。

它还让我学会了在网上查阅那些无限的资料。

通过对此课题的开发,使我对用JBuilder9.0开发系统有了一个比较清楚的认识,体会到理论和实践的重要性。

由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高。

对于文中出现的不足和系统中出现的问题敬请老师指导。

5.参考文献

1.朱战立,沈伟.Java程序设计实用教程[M].北京:

电子工业出版社,2005.01:

59-98

2.李诚等.Java2简明教程[M],第2版.北京:

清华大学出版社,2004.08:

165-201

沈阳大学

课程设计说明书NO.13

3.耿祥义.Java课程设计[M].北京:

清华大学出版社,2004.02:

53-78

6.附录:

源代码

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

importjava.util.Vector;

publicclassTuo

{

Stringstr1="0";//运算数1初值一定为0为了程序的安全

Stringstr2="0";//运算数2

Stringfh="+";//运算符

Stringjg="";//结果

//状态开关重要

intk1=1;//开关1用于选择输入方向将要写入str2或str2

intk2=1;//开关2符号键次数k2>1说明进行的是2+3-9+8这样的多符号运算

intk3=1;//开关3str1是否可以被清0==1时可以!

=1时不能被清0

intk4=1;//开关4str2同上

intk5=1;//开关5控制小数点可否被录入==1时可以!

=1输入的小数点被丢掉

JButtonjicunqi;//寄存器记录是否连续按下符号键

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");

沈阳大学

课程设计说明书NO.14

JButtonbutton4=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);

沈阳大学

课程设计说明书NO.15

pan.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();//为什么要多此一句呢?

因为我不会设置按钮的大小

pan3.setLayout(newFlowLayout());

pan3.add(clear_Button);

//clear_Button.setSize(10,10);//设置清零按钮的大小吗的不好使!

frame.setLocation(300,200);//主窗口出现在位置

frame.setResizable(false);//不能调大小

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

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

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1