科学计算器Java课程设计.docx
《科学计算器Java课程设计.docx》由会员分享,可在线阅读,更多相关《科学计算器Java课程设计.docx(72页珍藏版)》请在冰豆网上搜索。
科学计算器Java课程设计
《面向对象程序设计》
课程设计报告
题目:
科学计算器软件设计与实现
院(系):
信息科学与工程学院
专业班级:
计算机科学与技术1201班
********************************
学号:
***********
********************************
2014年12月29日至2015年1月9日
华中科技大学武昌分校制
面向对象程序设计课程设计任务书
一、设计(调查报告/论文)题目
科学计算器软件设计与实现
二、设计(调查报告/论文)主要内容
内容:
完成一个图形界面的计算器,可以在标准计算器和科学计算器之间切换,标准计算器的基本功能有:
加、减、乘、除基本算术运算;科学计算器的基本功能有:
三角函数、进制转换、对数、阶乘;一元二次方程界面可以求一元二次方程的解;勾股定理界面可以求直角三角形边长。
基本功能与要求:
1.标准计算器:
加、减、乘、除、求平方根;
2.科学计算器:
进制转换、求解三角函数、对数运算、阶乘;
3.一元二次方程:
求一元二次方程的解;
4.勾股定理:
求直角三角边长。
三、原始资料
1.《面向对象程序设计课程设计》指导书
2.耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
四、要求的设计(调查/论文)成果
1.课程设计报告
2.课程设计软件
五、进程安排
布置任务,查找资料、需求分析1天
总体设计1天
详细设计1.5天
编制源程序实现3.5天
测试与修改1天
撰写课设报告2天
六、主要参考资料
[1]张广彬.Java课程设计案例精编(第二版).北京:
清华大学出版社,2011.
[2]耿祥义.Java课程设计(第二版).北京:
清华大学出版社,2008.
[3]耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
[4]邹林达.陈国君Java2程序设计基础.北京:
清华大学出版社,2010.
[5]邹林达.Java2程序设计基础实验指导.北京:
清华大学,2010.
指导教师(签名):
20年月日
1需求与总体设计
1.1需求分析
1.刚启动计算器时的状态:
开始计算按键开始键"ON"清零:
计算刚启动时,或者任何时候键入了清零键,计算器所处的状态。
2.一个操作数:
输入了一个操作数时计算器所处的状态,如键入“2”后的状态,此时操作数为“2”,或者依次键入“3”、“8”后的状态,此时操作数为“38”。
3.运算结果:
键入了“=”键后计算器所处的状态,如依次键入“3+5=”之后计算器的状态。
在此状态如果输入数字,输入的数字将作为第一个操作数,开始一次新的计算。
4.一个操作数和一个两元符号:
输入了一个操作数和加减乘除中的一个键后计算器的状态,如依次输入“2+”或“31×5=÷”之后计算器的状态。
5.操作数两元符操作数:
输入了一个操作数、一个加减乘除符号和另一个操作数后计算器所处的状态,如依次键入“30÷4”或“3+5=÷5”后计算器的状态。
6.操作数两元符运算结果:
输入了一个操作数、一个加减乘除符号和另一个操作数后紧接着键入开方键计算器所处的状态。
7.错误:
执行非法计算后所处的状态,如执行÷0计算或者对负数的开方计算后的状态。
比如6/0后计算的结果是“0不能做除数”。
1.2总体设计思路
对于此计算器程序,首先要设计其GUI界面,总体界面有一个文本框,18个按钮,总体界面用BorderLayout布局。
文本框放置在最NORTH,然后0到9以及+,-,*,/的按钮放置到一个面板Panel中,添加到整体布局的CENTER,界面设计完成。
布局设计好后再添加按钮事件。
对于此程序要考虑到点击加、减、乘、除按钮时是否有点击数字按钮,如果是第一次点击数字按钮或者是点击数字按钮前点击了加、减、乘、除按钮则直接把数字按钮的数值设置到文本框中,否则则应把文本框中的内容加上你所点击按钮的数值设置到文本框中。
这是计算器中的一种:
简单计算器,本项目用到了Java中的GUI界面和swing组件以及awt布局,所以简单易用,它能完成如下的几个小功能:
点击按钮中的数字键和运算符键就能进行简单的加、乘、乘、除求模四则运算。
1.3功能图
1.4类图
2详细设计
2.1详细设计思路
1)流程图,如图6。
图6流程图
2)设置窗体
窗体名称biaozhun继承JFrame类和ActionListener接口,并实现publicvoid
actionPerformed(ActionEvente){}方法。
3)定义菜单、菜单条、菜单项、按钮、文本框、容器,设置为private类型。
4)定义变量doublememoryd;//使用内存中存储的数字;DecimalFormatdf;//保留小数位数。
5)使用privateJButtongetJButton()方法添加按钮并给按钮命名,使用
setFont(newFont("楷体",Font.BOLD,30));setForeground(newColor
(250,0,0));方法设置按钮的字体和字体颜色。
6)设置数字按钮1到9并添加监控,使其在发生鼠标事件时改变按钮颜色
addMouseListener(newMouseListener(){
publicvoidactionPerformed(MouseEvente){
jButton.setForeground(newColor(0,100,0));}
publicvoidmouseClicked(MouseEvente){
jButton.setForeground(newColor(0,150,100));}
publicvoidmouseEntered(MouseEvente){
jButton.setForeground(newColor(0,0,250));}
publicvoidmouseExited(MouseEvente){
jButton.setForeground(newColor(250,0,0));}
publicvoidmousePressed(MouseEvente){
jButton.setForeground(newColor(0,250,0));}
publicvoidmouseReleased(MouseEvente){
jButton.setForeground(newColor(250,250,0));}});
7)开根号运算,定义jButton2=newJButton("sqrt");对其设置监控,调用Math.sqrt()方法来实现开根号运算,并在文本框中输出结果,
jButton2.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
doublea=Double.parseDouble(jTextField.getText());
doubleb;
if(a<0){jTextField.setText("负数不能开平方");}
else{b=Math.sqrt(a);jTextField.setText(Double.toString(b));}}});
8)设置百分比按钮,jButton7=newJButton("%");使用变量i1来存放从文本框中读出的数据并转换成double类型,定义double类型变量z1,z1=i1/100实现求百分比运算,在使用jTextField.setText(Double.toString(z1))使其在文本框中输出结果
jButton7.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
doublei1=Double.parseDouble(jTextField.getText());
doublez1=i1/100;
jTextField.setText(Double.toString(z1));}});
9)设置求倒数运算,jButton14=newJButton("1/x");定义double变量c用来存放从文本框中读出的数据,设置if……else语句来判断当c==0时在文本框中输出“除数不能等于0”,否则就输出结果
jButton14.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
doublec=Double.parseDouble(jTextField.getText());
doubled;
if(c==0){jTextField.setText("除数不能等于0");
}else{d=1/c;jTextField.setText(Double.toString(d));}}});
10)定义相反数按钮,jButton16=newJButton("+/-");通过使用
0-Double.parseDouble(jTextField.getText().trim());使文本框中的数据变成其相反数
jButton16.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
doublei2=0-Double.parseDouble(jTextField.getText().trim());
jTextField.setText(Double.toString(i2));}});
11)等于号按钮,jButton19.setText("=");通过使用switch……case语句来控制,Operator变量在定义+、-、*、/按钮时对其赋值
jButton19.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
doubledatatwo;
datatwo=Double.parseDouble(str);
switch(Operator){
case'+':
dataone+=datatwo;break;
case'-':
dataone-=datatwo;break;
case'*':
dataone*=datatwo;break;
case'/':
dataone/=datatwo;break;
default:
break;}
str=Double.toString(dataone);
jTextField.setText(str);}});
12)定义文本框textMemory,用来显示进行MS、M+操作时显示M用,使用
textMemory.setEditable(false);方法使textMemory文本框变成不可编辑。
13)定义文本框jTextField,用来显示运算结果
jTextField.addKeyListener(newKeyAdapter(){
publicvoidkeyTyped(KeyEvente){
if(e.getKeyChar()>='0'&&e.getKeyChar()<='9'){
str+=e.getKeyChar();
jTextField.setText(str);
}elseif(e.getKeyChar()==KeyEvent.VK_BACK_SPACE){
str=str.substring(0,str.length()-1);
jTextField.setText(str);
}elseif(e.getKeyChar()==KeyEvent.VK_ESCAPE){
str="";
jTextField.setText(str);}}});
14)定义jButton20、jButton21、jButton22、jButton23分别为MC、MR、MS、
M+,并且对按钮添加监听,计算器内部有一个存贮器,假设将其称为“寄数器”。
MS是将当前窗口数据写入“寄数器”,M+是将当前窗口数据与“寄数器”内的数据相加后再存入“寄数器”,MR是读出“寄数器”内的数据到窗口,MC是清除“寄数器”内的数据,使其为0。
按钮实现方法在publicvoidactionPerformed
(ActionEvente)中实现,
publicvoidactionPerformed(ActionEvente){
Objecttemp=e.getSource();
if(temp==jButton20){
memoryd=memoryi=0;
textMemory.setText("ZY");
textMemory.setFont(newFont("华文行楷",Font.BOLD,30));}
//'MS'的操作,将当前文本框内容保存入内存,显示'M'
if(temp==jButton22){//textMemory显示m的文本框
booleanisDot=false;
textMemory.setText("M");
textMemory.setFont(newFont("楷体",Font.BOLD,30));
for(inti=0;iif('.'==jTextField.getText().charAt(i)){
isDot=true;
break;}
//如果是double,则存入memoryd(double存储器)
if(isDot==true){
memoryd=Double.parseDouble(jTextField.getText());
memoryi=0;//保证存储器中存放最新的值}
//如果是int,则存入memoryi(int存储器)
else{
memoryi=Integer.parseInt(jTextField.getText());
memoryd=0;//保证存储器中存放最新的值}}
//'MR'的操作,将存储器中的信息输出
if(temp==jButton21){if(memoryd!
=0)
jTextField.setText(Double.toString(memoryd));
if(memoryi!
=0)
jTextField.setText(Integer.toString(memoryi));}
//'M+'的功能,将当前文本框里的数据和存储器中数据相加后,再存入存储器
if(temp==jButton23){
textMemory.setText("M");
textMemory.setFont(newFont("楷体",Font.BOLD,30));
booleanisDot=false;
for(inti=0;iif('.'==jTextField.getText().charAt(i)){
isDot=true;break;}
if(memoryi!
=0){//存储中是一个int型数
if(isDot==false)//被加数是一个int型数
memoryi+=Integer.parseInt(jTextField.getText());
else{
//被加数是一个double型数,则将int存储器中数传入double存储器与当前数相加,int存储器清零
memoryd=memoryi+Double.parseDouble(jTextField.getText());
memoryi=0;}}
else
memoryd+=Double.parseDouble(jTextField.getText());}
15)设置退格按钮backspace,为jButton24添加监控ActionListener,通过引用全局变量str,str为string类型的变量
jButton24.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(str.length()!
=0){str=str.substring(0,str.length()-1);
jTextField.setText(str);}}});
16)设置清空按钮C,添加监控,在单击C时通过改变全局变量str的值来实现功能,单击时就将str的值赋为空,文本框jTextField通过调用setText将
str的值输出。
jButton26.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
str="";jTextField.setText(str);}});
17)添加菜单条jJMenuBar,在jJMenuBar中通过add来添加获取菜单的方法
getJMenu,以此将菜单添加到菜单条中。
菜单分别为编辑、查看、帮助。
这三个菜单分别在其对应的getJMenu()方法中定义,编辑菜单下定义了菜单项复制和黏贴,查看菜单下定义了标准型、科学型、勾股定理、解一元二次方程四个菜单项,标准型通过jMenuItem4.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
df=newDecimalFormat("#.###############");//保留15位小数
biaozhun.this.setBounds(400,200,600,590);
biaozhun.this.setJMenuBar(getJJMenuBar());
biaozhun.this.setContentPane(getJContentPane1());//将jContentPane1面板添加到jFrame框架上
biaozhun.this.setTitle("计算器");
Imageimage=biaozhun.this.getToolkit().getImage("计算器图标.jpg");
biaozhun.this.setIconImage(image);
biaozhun.this.setVisible(true);
jTextField.addActionListener(this);}});方法来实现窗体之间切换。
setBounds()方法实现窗体的显示位置和窗体大小,setVisible()将其设置为
true使其变为可见。
使用相同的方法实现窗体之间相互切换,其中标准型和科学型在同一个窗体中,通过改变窗体大小和窗体添加控件来实现标准型和科学型两种计算器所需要的按钮。
勾股定理、解一元二次方程通过改变setVisible()的值为true和false来实现窗体切换。
帮助菜单下添加帮助主题和关于计算器选项,当单击帮助主题时就打开系统中关于计算器的帮助文件,单击关于计算器时就会打开一个窗体显示关于计算器的内容,当单击确定按钮时就会关闭关于计算器窗体。
18)定义JPanel类型的变量jPanel、jContentPane,在容器jPanel中添加标准计算器的右下角的按钮,jContentPane中添加退格、清除、MS、MR、MC、M+按钮,jPanel在方法getJPanel()中,jContentPane在方法getJContentPane()中,窗体通过this.setJMenuBar(getJJMenuBar());this.setContentPane
(getJContentPane());将控件添加到窗体中。
19)定义进制转换按钮,jButton31、jButton34、jButton37、jButton40分别为十六进制、十进制、八进制、二进制,通过调用Integer.toHexString(n)十六进制、Integer.toOctalString(n)八进制、Integer.toBinaryString(n)二进制来实现进制之间的相互转换。
20)定义三角函数sin、cos、tan但是在使用需要先调用弧度按钮,将相应的角度转换成弧度以后在使用三角函数对应的按钮才可以实现求三角函数的值。
求弧度方法在定义弧度按钮时实现,string.valueOf(i/180*Math.PI)求对应的弧度sin、cos、tan使用math中的方法。
21)定义阶乘按钮jButton42,实现求阶乘方法,
jButton42.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
doublei=Double.parseDouble(jTextField.getText());
if((i%2==0)||(i%2==1)){//判断为整数进行阶乘操作
intj=(int)i;//强制类型转换
intresult=1;for(intk=1;k<=j;k++)result*=k;
jTextField.setText(String.valueOf(result));}}});
22)定义pi按钮,直接调用Math.PI,通过jTextField.setText(String.valueOf
(Math.PI));在窗体中显示pi值。
23)定义log10按钮,用来求log以10为底的对数值,当对数值i大于0时就调用Math.log10(i)来输出结果,当i小于0时就在文本框中显示负数不能求对数!
。
jButton45.addActionListener(newActionListener(){
publicvoid