《Java实训》设计报告
计算器
计算器
一、项目需求
编写一个实现计算器应用程序
(1)单击“计算器”上的数字按钮(0~9)可以设置参与计算的运算数。
(2)单击“计算器”上的运算符按钮(+、-、*、/)可以选择运算符号
(3)单击“计算器”上的“=”按钮显示计算结果。
(4)单击“计算器”上的“sqrt” 按钮对一个数进行开根号。
(5)单击“计算器”上的“1/x” 按钮对一个数进行求倒。
(6)加减乘除运算也可以是正负数、小数。
(7)单击“计算器”上的“Backspace” 按钮如果输错了数还能退格。
(8)单击“计算器”上的“CE” 按钮清除当前显示的数,不影响已经输入的数。
(9)单击“计算器”上的“ C” 按钮清除当前的计算,开始新的计算。
(10)单击“计算器”上的“MC”按钮是清除储存数据。
(11)单击“计算器”上的“MR”按钮是读取储存的数据。
(12)单击“计算器”上的“MS”按钮是将计算器所显示的数存入存储器中,存储器中原有的数据被冲走。
(13)单击“计算器”上的“M+”是将显示的数据加到存储器中,与已存入的数据相加。
二、总体设计
在设计计算器时,可以编写1个Java源文件:calculator.java。计算器除了上述1个Java源文件所给出的类外,还需要Java系统提供的一些重要类。
下面是Java源文件的总体设计。
calculator类负责创建计算器的主窗口,计算器从该类开始执行。calculator类有以下几种类型的对象,分别是:Panel、TextField、Button对象。
三、详细设计
1、calculator类
(1)效果图
图2 calculator创建的窗口效果图
(2)数据和方法
Calculator类是java.awt.event包中WindowAdapter的一个子类,并实现了ActionListener接口。
1)成员变量
Button是创建的“数字按钮”对象,改对象创建了个个数字按钮。Button中的“数字按钮”含有的数字依次为0~9。每个“数字按钮”都注册有ActionEvent事件监听器。
TextField是创建的数字输入的文本框,用来输入和计算数显示结果用的。
Panel 是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板面板的默认布局管理器是 FlowLayout 布局管理器。
2)方法
public static void main(String args[])方法是计算器程序运行的入口方法。
public Calculator() 是构造方法,负责完成窗口的初始化。
public void windowClosing(WindowEvent e):当继承WindowAdapter类时,通过该方法实现窗体上的关闭按钮。
public void display():实现图形窗口的显示。
public void actionPerformed(ActionEvent e):当ActionListener接口被实现时,必须要实现的事件方法。
(3)代码
import java.awt.*;
import java.awt.event.*;
public class Calculation extends WindowAdapter implements ActionListener
{
double dResult=0;
double dNowInput=0;
double dMemory;
int n=0; //记载小数位数
int nOperation=1; // 记录运算符类型
int nBitsNum=0; //记录总共输入的位数
boolean alreadyHaveDot=false; //已经有小数点?
boolean keyAvailable=true;
boolean alreadyClickedEqueal=false; //是否按下过"="?
boolean isTempNowInput=false; //是否在计算出结果后直接按运算符将结果赋给了当前输入值?
Frame f;
Panel p1,p2,p3,p4,p5,p6;
TextField tf1,tf2;
Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;
Button bDiv,bSqrt,bMulti,bMinus,bPercent,bPlus,bReciprocal,bEqual,bDot,bNegative;
Button bBackspace,bCE,bC,bMR,bMS,bMC,bM;
public void display()
{
f=new Frame("计算器");
f.setSize(280,213);
f.setLocation(200,200);
f.setBackground(Color.LIGHT_GRAY);
f.setResizable(false);
f.setLayout(new BorderLayout(3,3));
p1=new Panel(new GridLayout(1,3,5,5)); //用于存放backspace,ce,c三键
p2=new Panel(new GridLayout(4,5,5,5)); //用于存放数字区及附近共20键, 此处间隙设置可能不合理,以后调整
p3=new Panel(new GridLayout(5,1,5,5)); //用于存放MC,MR,MS,M+键及显示M状态文本框,此处间隙设置可能不合理,以后调整
p4=new Panel(new FlowLayout()); //用于存放p1,p2
p5=new Panel(new FlowLayout());
p6=new Panel(new FlowLayout());
p4.add(p1);
p4.add(p2);
tf1=new TextField(35); //存放显示区
tf1.setText("0.");
tf1.setEditable(false);
p5.add(tf1);
f.add(p5,BorderLayout.NORTH);
f.add(p4,BorderLayout.CENTER);
f.add(p3,BorderLayout.WEST);
b1=new Button("1");
b2=new Button("2");
b3=new Button("3");
b4=new Button("4");
b5=new Button("5");
b6=new Button("6");
b7=new Button("7");
b8=new Button("8");
b9=new Button("9");
b0=new Button("0");
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
b6.addActionListener(this);
b7.addActionListener(this);
b8.addActionListener(this);
b9.addActionListener(this);
b0.addActionListener(this);
bDiv=new Button("/");
bSqrt=new Button("sqrt");
bMulti=new Button("*");
bMinus=new Button("-");
bPercent=new Button("%");
bPlus=new Button("+");
bReciprocal=new Button("1/x");
bEqual=new Button("=");
bDot=new Button(".");
bNegative=new Button("+/-");
bDiv.addActionListener(this);
bSqrt.addActionListener(this);
bMulti.addActionListener(this);
bMinus.addActionListener(this);
bPercent.addActionListener(this);
bPlus.addActionListener(this);
bReciprocal.addActionListener(this);
bEqual.addActionListener(this);
bDot.addActionListener(this);
bNegative.addActionListener(this);
p2.add(b7);
p2.add(b8);
p2.add(b9);
p2.add(bDiv);
p2.add(bSqrt);
p2.add(b4);
p2.add(b5);
p2.add(b6);
p2.add(bMulti);
p2.add(bPercent);
p2.add(b1);
p2.add(b2);
p2.add(b3);
p2.add(bMinus);
p2.add(bReciprocal);
p2.add(b0);
p2.add(bNegative);
p2.add(bDot);
p2.add(bPlus);
p2.add(bEqual);
bBackspace=new Button("Backspace");
bCE=new Button("CE");
bC=new Button("C");
bBackspace.addActionListener(this);
bCE.addActionListener(this);
bC.addActionListener(this);
p1.add(bBackspace);
p1.add(bCE);
p1.add(bC);
tf2=new TextField(2);
tf2.setEnabled(false);
tf2.setBackground(Color.LIGHT_GRAY);
bMC=new Button("MC");
bMR=new Button("MR");
bMS=new Button("MS");
bM=new Button("M+");
bMC.addActionListener(this);
bMR.addActionListener(this);
bMS.addActionListener(this);
bM.addActionListener(this);
p6.add(tf2);
p3.add(p6);
p3.add(bMC);
p3.add(bMR);
p3.add(bMS);
p3.add(bM);
f.setVisible(true);
f.addWindowListener(this);
}
public void actionPerformed(ActionEvent e)
{
//key 0 to 9
if(this.keyAvailable && e.getActionCommand().length()==1 && e.getActionCommand().compareTo("0")>=0 && e.getActionCommand().compareTo("9")<=0)
{
if(this.isTempNowInput)
{
this.dNowInput=0;
this.isTempNowInput=false;
}
this.nBitsNum++;
if(this.alreadyHaveDot==false)
this.dNowInput=this.dNowInput*10+Double.parseDouble(e.getActionCommand());
else
{
double temp=Double.parseDouble(e.getActionCommand());
for(int i=this.n;i<0;i++)
{
temp*=0.1;
}
this.dNowInput+=temp;
this.n--;
}
this.tf1.setText(Double.toString(this.dNowInput));
}
// key dot
if(this.keyAvailable && e.getActionCommand()==".")
{
if(this.alreadyHaveDot==false)
{
this.nBitsNum++;
this.alreadyHaveDot=true;
this.n=-1;
}
}
//key "+","-","*","/"
if(this.keyAvailable && e.getActionCommand()=="+" || e.getActionCommand()=="-" || e.getActionCommand()=="*" || e.getActionCommand()=="/")
{
if(this.alreadyClickedEqueal)
{
this.dNowInput=this.dResult;
this.isTempNowInput=true;
}
else
{
switch(this.nOperation)
{
case 1: this.dResult+=this.dNowInput; break;
case 2: this.dResult-=this.dNowInput; break;
case 3: this.dResult*=this.dNowInput; break;
case 4:
{
if(this.dNowInput==0)
{
tf1.setText("除数不能为零");
this.keyAvailable=false;
}
else this.dResult=this.dResult/this.dNowInput;
}
}
if(this.keyAvailable)tf1.setText(Double.toString(this.dResult));
this.dNowInput=0;
}
if(e.getActionCommand()=="+")
{
this.nOperation=1;
}
if(e.getActionCommand()=="-")
{
this.nOperation=2;
}
if(e.getActionCommand()=="*")
{
this.nOperation=3;
}
if(e.getActionCommand()=="/")
{
this.nOperation=4;
}
this.nBitsNum=0;
this.alreadyClickedEqueal=false;
}
// key "+/-"
if(this.keyAvailable && e.getActionCommand()=="+/-")
{
this.dNowInput=0-this.dNowInput;
tf1.setText(Double.toString(this.dNowInput));
}
// key "C"
if(e.getActionCommand()=="C")
{
this.nBitsNum=0;
this.dResult=0;
this.dNowInput=0;
this.alreadyHaveDot=false;
this.n=0;
this.nOperation=1;
this.keyAvailable=true;
this.alreadyClickedEqueal=false;
tf1.setText("0.");
}
// key "CE"
if(e.getActionCommand()=="CE")
{
this.nBitsNum=0;
this.dNowInput=0;
this.alreadyHaveDot=false;
this.n=0;
this.nOperation=1;
this.keyAvailable=true;
tf1.setText("0.");
}
// key "sqrt"
if(this.keyAvailable && e.getActionCommand()=="sqrt")
{
if(this.alreadyClickedEqueal)
{
if(this.dResult>=0)
{
this.dResult=Math.sqrt(this.dResult);
tf1.setText(Double.toString(this.dResult));
}
else
{
tf1.setText("函数输入无效");
this.keyAvailable=false;
}
}
else
{
if(this.dNowInput>=0)
{
this.dNowInput=Math.sqrt(this.dNowInput);
tf1.setText(Double.toString(this.dNowInput));
}
else
{
tf1.setText("函数输入无效");
this.keyAvailable=false;
}
}
}
// key "1/x"
if(this.keyAvailable && e.getActionCommand()=="1/x")
{
if(this.dNowInput==0)
{
tf1.setText("除数不能为零");
this.keyAvailable=false;
}
else
{
this.dNowInput=1/this.dNowInput;
tf1.setText(Double.toString(this.dNowInput));
}
}
// key "="
if(this.keyAvailable && e.getActionCommand()=="=")
{
this.alreadyClickedEqueal=true;
switch(this.nOperation)
{
case 1: this.dResult+=this.dNowInput; break;
case 2: this.dResult-=this.dNowInput; break;
case 3: this.dResult*=this.dNowInput; break;
case 4:
{
if(this.dNowInput==0)
{
tf1.setText("除数不能为零");
this.keyAvailable=false;
}
else this.dResult=this.dResult/this.dNowInput;
}
}
if(this.keyAvailable)tf1.setText(Double.toString(this.dResult));
}
// key "MS"
if(this.keyAvailable && e.getActionCommand()=="MS")
{
this.dMemory=this.dNowInput;
if(this.dMemory!=0)
tf2.setText("M");
}
// key "MC"
if(this.keyAvailable && e.getActionCommand()=="MC")
{
this.dMemory=0;
tf2.setText("");
}
// key "MR"
if(this.keyAvailable && e.getActionCommand()=="MR")
{
this.dNowInput=this.dMemory;
tf1.setText(Double.toString(this.dNowInput));
}
// key "M+"
if(this.keyAvailable && e.getActionCommand()=="M+")
{
this.dMemory+=this.dNowInput;
if(this.dMemory!=0)
tf2.setText("M");
else tf2.setText("");
}
// key "%"
if(this.keyAvailable && e.getActionCommand()=="%")
{
this.dNowInput=(this.dResult*this.dNowInput)/100;
tf1.setText(Double.toString(this.dNowInput));
}
// key "Backspace"
if(this.keyAvailable && e.getActionCommand()=="Backspace")
{
if(!this.alreadyClickedEqueal){
if(this.dNowInput!=0)
{
if(this.alreadyHaveDot)
{
if(this.n==-1)
{
this.alreadyHaveDot=false;
this.n=0;
}
else
{
String str,str1;
str=tf1.getText();
str1=str.substring(0,this.nBitsNum-1);
this.nBitsNum--;
this.n++;
this.dNowInput=Double.parseDouble(str1);
tf1.setText(Double.toString(this.dNowInput));
}
}
else
{
int temp;
temp=(int)(this.dNowInput/10);
this.dNowInput=(double)temp;
tf1.setText(Double.toString(this.dNowInput));
}
}
}
}
}
public static void main(String args[])
{
Calculation cal=new Calculation();
cal.display();
}
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
四、项目总结
计算器功能具体设计如下:
1 加(+)法:对两个数进行求和计算也就是求a与b的和 如3+3=6。
2 减(-)法:对两个数进行求余计算也就是求a与 b的余数 如 6-3=3。
3 乘(*)法:对两个数进行相乘计算也就是求a与b 的乘积 如3x3=9。
4 除(/)法:对两个数进行除法计算也就是求 a与 b的除值 如 4/2=2。
5 开根号(sqrt):对一个数进行开根号也就是求a开根号的值 如 16 sqrt=4。
6 求倒数(1/x):对一个数进行求倒也就是求a的倒数 如 1/5=0.5。
7 加减乘除运算也可以是正负数、小数。
8 如果输错了数还能退格。
9 CE :清除当前显示的数,不影响已经输入的数。
10 C :清除当前的计算,开始新的计算。
11 MC:清除储存数据。
12 MR:读取储存的数据。
13 MS:将计算器所显示的数存入存储器中,存储器中原有的数据被冲走。
14 M+:将显示的数据加到存储器中,与已存入的数据相加
程序还没有完善后续还将完成以下功能:
① 不能实现进制数之间的相互转换,比如:二进制转换为十进制等等。
② 计算器中的%功能还未实现。
③ cos余弦, sin正弦, tan正切, log常用对数, n!阶乘, ln自然对数
五、心得体会
经过一个星期的我的计算器的课程设计,我在老师的指导下,顺利完成该课程设计。通过该课程设计,了解常用类的属性和方法,我发现在用常用类的时候,经常会把类里面的方法和自定义的方法搞混。通过实训我更加认识到了Java强大的功能,丰富了我的知识,提高运用java语言解决实际问题的能,让我收获颇多。
首先,让我加深了对Java语言的理论知识的理解;
其次,让我更加熟练的掌握了Java语言的设计能力并且有了实践经验;
再次,在设计过程中,学到了老师没有在课堂上没有教授的知识;
最后,加强了我对Java语言的学习兴趣和好感。
石家庄学院习报告王荣传20xx0502027数学与信息科学系信息与计算科学专业本科一班崔永刚讲师姓名:学号:院系:专业:班级:指导…
Java程序设计实训报告实训名称图书管理系统实训专业计算机应用技术班级学号090443220姓名高宇国指导教师侯丽敏20xx年12…
摘要随着自动化技术的不断发展电子产业对工艺生产的要求越来越高本次实训主要熟悉手工焊锡的常用工具的使用及其与修理手工电烙铁的焊接技术…
辽宁建筑职业学院Java高级应用实训报告课题名称婚庆公司网站专业软件技术班级xxxxxxxxxx学号姓名xxxx指导教师xxx二O…
PINGDINGSHANUNIVERSITYJava专业实训项目报告题目超市管理系统院系软件学院专业年级10级软件工程java工程…
实训报告书课程:Java项目实训专业班级:学生姓名:学号:指导教师:完成日期:重庆电子工程职业学院软件学院目录目录........…
JavaWeb实习报告一、实习目的与任务为了锻炼我们的实践动手能力,提高我们分析问题、解决问题的能力,培养我们的工作意识和团队合作…
辽宁建筑职业学院Java高级应用实训报告课题名称婚庆公司网站专业软件技术班级xxxxxxxxxx学号姓名xxxx指导教师xxx二O…
徐州工程学院管理学院实验报告实验课程名称数据结构与算法实验地点经济管理教学实验中心20xx年3月至20xx年6月专业信息管理与信息…
Java程序设计实训报告实训名称图书管理系统实训专业计算机应用技术班级学号090443220姓名高宇国指导教师侯丽敏20xx年12…
毕业实习实习名称:实习时间:学生姓名:学院名称:专业名称:班级名称:学号:指导教师:20xx03/04-20xx04/05董莹电子…