java计算器.docx
《java计算器.docx》由会员分享,可在线阅读,更多相关《java计算器.docx(64页珍藏版)》请在冰豆网上搜索。
java计算器
目录:
摘要……………………………………………………………………3.
实训题目………………………………………………………………3
实验环境………………………………………………………………3
进度安排………………………………………………………………3
设计步骤………………………………………………………………3
设计功能模块图…………………………………………………………3
布局界面………………………………………………………………4
按键功能………………………………………………………………5
数字按钮的实现…………………………………………………………5
操作符的实现……………………………………………………………5
记忆功能按钮的实现……………………………………………………6
撤销清除按钮的实现……………………………………………………6
小数点的优化…………………………………………………………7
测试……………………………………………………………………7
功能完善………………………………………………………………11
实验心得………………………………………………………………12
参考文献………………………………………………………………12
摘要:
本计算器可以进行十进制下的四则运算(加、减、乘、除)、开根号、百分号、求倒数,还可以实现数值的符号转换及计算器有关内存操作。
Backspace表示退格,CE表示将当前文本框内数据清除,C表示文本框内数据清除,同时var,answer清0。
此外还提供了“编辑”、“帮助”两个菜单项,使用者可通过使用菜单项实现某些功能。
一、实验题目
计算器
二、实验环境:
中金B601机房
三、进度安排
星期一
需求分析,阅读相应的参考程序
星期二
编写布局和界面
星期三
编写按键和功能代码
星期四
小数点功能及测试
星期五
综合调试,撰写课程设计报告
四、设计步骤
1、设计功能模块图:
2、布局界面
1)、利用JavaGUI布局,使用其中的Swing和AWT;
Awt是Java提供的用来建立和设置Java的图形用户界面的基本工具。
AWT由Java中的java.awt包提供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类又被称为组件。
Swing用来创建图形界面。
导入Swing;如:
importjavax.swing.JButton;
设计窗体,窗体名称Calculator2继承ActionListener接口。
JFrameframe//JFrame是带有标题和边框的顶层窗口。
可以使用frame=newJFrame("计算器")设置计算器的标题栏;
JTextFieldtextAnswer;//JTextField是一个轻量级组件,它允许编辑单行文本。
程序中使用textAnswer=newJTextField(15);
textAnswer.setText("");
textAnswer.setEditable(false);
textAnswer.setBackground(newColor(255,255,255))
设置输入框的属性。
JPanelpanel,panel1,panel2,panel3;//JPanel是一般轻量级容器。
程序中使用:
panel=newJPanel();
frame.getContentPane().add(panel);
panel1=newJPanel();
panel2=newJPanel();
panel.setLayout(newBorderLayout());
传入一个布局对象作为参数来创建一个面板,该面板采用的是布局是BorderLayout布局,也就是默认的,是上下左右中布局的。
JMenuBarmainMenu;//菜单栏的实现。
将JMenu对象添加到菜单栏以构造菜单。
程序中使用panel.add(mainMenu,BorderLayout.NORTH);将菜单栏添加到面板并设置菜单栏的位置。
JTextFieldtextMemory;//JTextField是一个轻量级组件,它允许编辑单行文本。
JLabellabelMemSpace;//JLabel用于短文本字符串或图像或二者的显示区。
标签不对输入事件作出反应。
JButtonbuttonBk,buttonCe,buttonC;//JButton"push"按钮的实现。
通过Action可配置按钮,并进行一定程度的控制。
使用button=newJButton("");button.setForeground(newColor(255,0,0));的方法设置各个按钮显示的名称和按钮的颜色。
例如:
buttonBk=newJButton("Backspace");
buttonBk.setForeground(newColor(255,0,0));
JMenueditMenu,helpMenu;//JMenu菜单的该实现是一个包含JMenuItem的弹出窗口,用户选择JMenuBar上的项时会显示该JMenuItem。
JMenuItemcopyItem,pasteItem,tItem,sItem,numberGroup,topHelp,aboutCal;//菜单中的项的实现。
菜单项本质上是位于列表中的按钮。
当用户选择“按钮”时,则执行与菜单项关联的操作。
DecimalFormatdf;//设置数据输出精度
booleanclickable;//控制当前能否按键
doublememoryd;//使用内存中存储的数字
doublevard,answerd;//用来保存double型数据的中间值(vard)和最后结果(answerd)
shortkey=-1,prekey=-1;//key用来保存当前进行何种运算,prekey用来保存前次进行何种运算
Stringcopy;//做复制用
JTextAreahelp;//帮助
五、按键功能
1、数字按钮功能的实现
主要支持的数字:
0、1、2、3、4、5、6、7、8、9,如图1所示:
图1计算器主界面
2、操作符的实现:
主要支持的操作符有:
+、-、*、/、%、sqrt。
支持错误提示。
要求提供图形化操作界面。
例如'-'操作:
if(temp==buttonSub){
switch(prekey){
case0:
answerd+=Double.parseDouble(textAnswer.getText());
break;
case1:
answerd-=Double.parseDouble(textAnswer.getText());
break;
case2:
answerd*=Double.parseDouble(textAnswer.getText());
break;
case3:
if(Double.parseDouble(textAnswer.getText())==0){
textAnswer.setText("除数不能为零");
clickable=false;
}else
answerd/=Double.parseDouble(textAnswer.getText());
break;
default:
answerd=Double.parseDouble(textAnswer.getText());
}
textAnswer.setText("");
prekey=key=1;
}
3、记忆功能按钮的实现:
具备记忆数据,取记忆,清记忆,复制,粘贴等功能。
'MC'的操作,将内存清0
‘MR'的操作,将存储器中的信息输出
'M+'的功能,将当前文本框里的数据和存储器中数据相加后,再存入存储器
'MS'的操作,将当前文本框内容保存入内存,显示'M',如图2所示:
如图2'MS'的操作
以下是'MS'的操作的代码:
if(temp==buttonMS&&clickable==true){
booleanisDot=false;
textMemory.setText("M");
for(inti=0;iif('.'==textAnswer.getText().charAt(i)){
isDot=true;
break;
}
//如果是double,则存入memoryd(double存储器)
if(isDot==true){
memoryd=Double.parseDouble(textAnswer.getText());
memoryi=0;//保证存储器中存放最新的值
}
//如果是int,则存入memoryi(int存储器)
else{
memoryi=Integer.parseInt(textAnswer.getText());
memoryd=0;//保证存储器中存放最新的值
}
}
4)、撤销清除按钮的实现
按下'Backspace'键,利用循环将当前字符串中的最后一个字母删除;
按下'CE'按钮,将当前文本框内数据清除;
按下'C'按钮,文本框内数据清除,同时var,answer清0,代码如下所示:
if(temp==buttonC){
vard=answerd=0;
textAnswer.setText("");
clickable=true;
}
六、小数点的优化
本程序为了使进行含小数点的操作时,为了避免异常,所以进行了小数点的优化。
//按下"."按钮时,判断当前文本框内字符串中含不含".",如果已含,则不允许再插入"."代码如下:
if(temp==buttonDot&&clickable==true){
booleanisDot=false;
if(textAnswer.getText().length()==0)
isDot=true;
for(inti=0;iif('.'==textAnswer.getText().charAt(i)){
isDot=true;
break;
}
if(isDot==false)
textAnswer.setText(textAnswer.getText()+".");
}
if((temp==buttonAdd||temp==buttonSub||temp==buttonMul||temp==buttonDiv)
&&clickable==true){
七、测试
1)、连续输入运算符
输入中如果有操作非法,比如按下两次'+',捕获异常,如图3所示:
catch(Exceptione){
textAnswer.setText("操作非法");
clickable=false;
}
图3非法操作捕获异常
2)、负数不能开根号,当输入负数要求开根号时,会提示异常,如图4所示:
图4负数开根号
代码如下所示:
//开根号运算,其中包括负数不能为开根号的代码:
if(temp==buttonSqrt&&clickable==true){
Strings=textAnswer.getText();
if(s.charAt(0)=='-'){
textAnswer.setText("负数不能开根号");
clickable=false;
}
else
textAnswer.setText(Double.toString(java.lang.Math.sqrt(Double.
parseDouble(textAnswer.getText()))));
}
3)、除数不能为0,当输入除数为0时,会提示异常,如图5所示:
图5输入除数为0
'/'操作的代码如下,其中包括除数不能为0的代码:
if(temp==buttonDiv){
switch(prekey){
case0:
answerd+=Double.parseDouble(textAnswer.getText());
break;
case1:
answerd-=Double.parseDouble(textAnswer.getText());
break;
case2:
answerd*=Double.parseDouble(textAnswer.getText());
break;
case3:
if(Double.parseDouble(textAnswer.getText())==0){
textAnswer.setText("除数不能为零");
clickable=false;
}
else
answerd/=Double.parseDouble(textAnswer.getText());
break;
default:
answerd=Double.parseDouble(textAnswer.getText());
}
textAnswer.setText("");
prekey=key=3;
}
4)、零不能求倒数,当输入0要求求倒数时,会提示异常,如图6所示:
图60求倒数
//倒数运算,其中包含0不能求倒数的代码:
if(temp==buttonDao&&clickable==true){
if(textAnswer.getText().charAt(0)=='0'&&
textAnswer.getText().length()==1){
textAnswer.setText("零不能求倒数");
clickable=false;
}
else{
booleanisDec=true;
inti,j,k;
Strings=Double.toString(1/Double.parseDouble(textAnswer.getText()));
for(i=0;iif(s.charAt(i)=='.')
break;
for(j=i+1;jif(s.charAt(j)!
='0'){
isDec=false;
break;
}
if(isDec==true){
Stringstemp="";
for(k=0;k
stemp+=s.charAt(k);
textAnswer.setText(stemp);
}
else
textAnswer.setText(s);
}
}
5)、程序正常的响应按钮事件,输入的数值长度受变量length的限定,进行混合四则运算的时候,结果如果不是很大,可以正常显示,当结果太大的时候,有可能超出可能表示的最大值,(结果溢出),本次设计精度采用doublefloat,能满足一般使用。
八、功能完善
我在本计算器的功能中又添加了菜单栏的功能,在菜单栏中添加“编辑”、“帮助”两个按钮,当按下这两个按钮时会出现对应的下拉菜单。
在“编辑”的下拉菜单中又有两个功能,分别是“复制”和“粘贴”。
如图7所示;在帮助的下拉菜单中我设置了两个选项:
包括“帮助主题”和“关于本计算器”的功能选项。
如图8所示:
图7菜单栏编辑选项
图8菜单栏帮助选项
菜单栏“帮助”选项中的“帮助主题”中的内容,如图9所示:
图9帮助主题
“帮助主题”的代码如下所示:
topHelp=newJMenuItem("帮助主题(H)");
topHelp.addActionListener(this);
help=newJTextArea(5,20);
scrollHelp=newJScrollPane(help);
help.setEditable(false);
help.append("执行简单计算\n");
help.append("1.输入计算的第一个数字。
\n");
help.append("2.单击“+”执行加、“-”执行减、“*”执行乘或“/”执行除。
\n");
help.append("3.输入计算的下一个数字。
\n");
help.append("4.输入所有剩余的运算符和数字。
\n");
help.append("5.单击“=”。
\n");
九、实验心得
通过了这几天的课程设计,对于我这个编程新手来说,还的确有些困难.不过有志者事竟成。
首先,我需要了解一些基本的术语。
程序是计算机执行的一系列的指令。
这些指令说明了计算机要做什么,究竟是用文字处理、电子表格、玩游戏还是其他用途。
然后,我还要去图书馆查阅资料,找一些与这次课设有关的内容作参考,以便能更方便的完成课设的内容。
另外,我还去网上查阅了一些资料,充实一下自己,一切都准备好了,我就可以完成我的计算器程序设计报告了。
在这次编程中,更加深我对事件监听,各方法的实现功能,还有布局方式及常用的GUI标准组件有了更深刻的认识.
我完成了这次JAVA课程设计,让我懂得在设计的过程中最好能自己解决问题,这样可以增强自己解决问题的能力,同时增强记忆.。
不过这只是我学习路上的驿站。
我相信我在未来的学习中会记住从本次课程设计中所学到的东西,并将它用到未来的学习工作中去。
十、参考文献
[1]耿祥义,《VA大学实用教程实验指导》,子工业出版社2005-03
[2]郑莉,Java语言程序设计,清华大学出版社2006-04
[3]王克宏,《JAVA语言入门》,清华大学出版社1996
[4]徐谡,Java应用与开发案例教程,清华大学出版社
[5]王克宏,《JAVA语言Applet编程技术》清华大学出版社199
附录:
packagecalculator;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjava.text.DecimalFormat;
publicclassCalculatorimplementsActionListener{//导入动作监听接口
//设计面板中的单位
JFrameframe;
JTextFieldtextAnswer;
JPanelpanel,panel1,panel2,panel3;
JMenuBarmainMenu;
JTextFieldtextMemory;
JLabellabelMemSpace;//labelMemSpace单纯做摆设,控制面板的形状
JButtonbuttonBk,buttonCe,buttonC;
JButtonbutton[];
JButtonbuttonMC,buttonMR,buttonMS,buttonMAdd;
JButtonbuttonDot,buttonAddAndSub,buttonAdd,buttonSub,buttonMul,
buttonDiv,buttonMod;
JButtonbuttonSqrt,buttonDao,buttonEqual;
JMenueditMenu,viewMenu,helpMenu;
JMenuItemcopyItem,pasteItem,tItem,sItem,numberGroup,topHelp,aboutCal;
DecimalFormatdf;//设置数据输出精度
booleanclickable;//控制当前能否按键
doublememoryd;//使用内存中存储的数字
intmemoryi;
doublevard,answerd;//用来保存double型数据的中间值(vard)和最后结果(answerd)
shortkey=-1,prekey=-1;//key用来保存当前进行何种运算,prekey用来保存前次进行何种运算
Stringcopy;//做复制用
JTextAreahelp;//帮助
JScrollPanescrollHelp;
//构造函数
publicCalculator(){
clickable=true;
answerd=0;
frame=newJFrame("计算器");
df=newDecimalFormat("0.##############");//设置数据输出精度(对于double型值)
textAnswer=newJTextField(15);
textAnswer.setText("");
textAnswer.setEditable(false);
textAnswer.setBackground(newColor(255,255,255));
panel=newJPanel();
frame.getContentPane().add(panel);
panel1=newJPanel();
panel2=newJPanel();
panel.setLayout(newBorderLayout());
//设计整个面板
mainMenu=newJMenuBar();
editMenu=newJMenu("编辑(E)");
helpMenu=newJMenu("帮助(H)");
copyItem=newJMenuItem("复制(C)Ctrl+C");
copyItem.addActionListener(this);
pasteItem=newJMenuItem("粘贴(V)Ctrl+V");
pasteItem.addActionListener(this);
editMenu.add(copyItem);
editMenu.add(pasteItem);
topHelp=newJMenuItem("帮助主题(H)");
to