资源描述
华东交通大学课程设计
课程设计题目:计算器设计
课 程: Java程序设计
题 目: 计算器设计
年 级: 级
专 业: 信息一班
学 号:
姓 名:
组 员:
指导老师:
课程设计(论文)任务书
基础 学 院 信息和计算科学 专 业 —1 班
一、课程设计(论文)题目 计算器设计
二、课程设计(论文)工作自 年 6 月23日起至 年6月 27日止。
三、课程设计(论文) 地点: 计算机中心
四、课程设计(论文)内容要求:
1.本课程设计目标
(1)使学生掌握系统各功效模块基础工作原理;
(2)掌握Java基础编程原理和基础编程方法;
(3)使学生学会系统调试;
(4)培养学生分析、处理问题能力;
(5)提升学生软件文档写作能力和团体合作精神。
2.课程设计任务及要求
1)基础要求:
(1)分析系统各功效模块工作原理;
(2)提出系统设计方案;
(3)对所进行编程、调试、修改。
2)创新要求:
在基础要求达成后,可进行创新设计,如:用虚函数,文件流,重载流插入运算符等。
3)课程设计论文编写要求
(1)要根据书稿规格打印誊写设计论文;
(2)论文包含目录、摘要、正文、总结等;
(3)毕业论文装订按学校统一要求完成。
4)答辩和评分标准:
(1)达成课程设计目标和要求,程序可读性很好,并调试正确,60分;
(2)能正确回复老师所提问题,可增加10分;
(3)课程设计汇报书写规范整齐,可增加10分;
(4)心得体会认真总结,可增加10分;
(5)程序有创新性,可增加10分;
成绩评定实施优异、良好、中等、及格和不及格五个等级。不及格者需重做。
5)参考文件:
(1)丁振凡.《J ava语言程序设计》 清华大学出版社
(2)丁振凡.《J ava语言程序设计试验指导和习题解析》清华大学出版社
(3)http:/ /
6)课程设计进度安排
内容 天数 地点
总体需求和分析构思及搜集资料 1 图书馆
各模块编程实现,调试和修改 3 机房
撰写论文和答辩 1 图书馆,机房
学生署名:
年6 月18 日
课程设计(论文)评审意见
(1)态度评价(20分):优( )、良( )、中( )、通常( )、差( );
(2)任务难度(20分):优( )、良( )、中( )、通常( )、差( );
(3)设计分析(20分):优( )、良( )、中( )、通常( )、差( );
(4)创新性评价(20分):优( )、良( )、中( )、通常( )、差( );
(5)回复问题(20分):优( )、良( )、中( )、通常( )、差( );
(6)论文格式规范性及考勤是否降等级:是( )、否( )
评阅人署名: 职称: 教授
年6 月25日
目 录
第1章 系统概要 - 1 -
1.1系统介绍 - 1 -
1.2 基础功效要求 - 1 -
第2章 设计思绪和算法 - 2 -
2.1 应用基础工作步骤 - 2 -
2.2 类设计 - 3 -
2.3 应用界面设计 - 3 -
2.4 事件处理原理、具体设计 - 3 -
2.5 算法考虑 - 4 -
第3章 源程序代码 - 5 -
第4章 运行结果及分析 - 15 -
第5章 心得体会 - 17 -
5.1系统需要完善地方 - 17 -
5.2课程设计感想 - 17 -
参考文件 - 17 -
第1章 系统概要
1.1系统介绍
编写一个简易计算器,实现Windows计算器关键功效。
此次课程设计就是利用java语言来编写简单计算器应用程序,模拟Windows计算器功效,能进行加、减、乘、除四则算术运算和求倒数、求平方根等简单函数运算,且有小数点、清零和存放等功效。
1.2基础功效要求
经过计算器设计,掌握Java编程基础知识点。
(1)掌握基于AWT图形用户界面设计,如常见布局设计,容器中面板、按钮、文本框等组件添加和布局。
(2)掌握图形界面事件处理方法,注册动作事件监听者。
(3)掌握各类功效实现思绪,及程序表示。熟悉实例变量、类变量和局部变量差异。
(4)掌握方法封装和调用。尽可能将反复用到一段功效设计为方法。
(5)掌握if和switch等语句使用。
(6)掌握怎样给按钮设置颜色及给页面背景设计颜色。
(7)掌握java中“对象”和“类”知识,类设计及组员控制访问
第2章 设计思绪和算法
2.1 应用基础工作步骤
1. 打开命令提醒符和记事本;
2. 输入源程序代码;
3. 保留并运行源程序;
4. 运行,检验是否有误;
5. 修改错误并再次运行;
6. 测试计算器工作情况。
2.2 类设计
此次计算器设计,关键用到是GUI编程相关方法。所以我们所用到类和方法关键有:
主类:Calculation类
继承父类为WindowAdapter类,实现了ActionListener接口,定义了一个窗体f和多个面板,按钮和文本框。
(1)方法名:display方法
作用:构建计算器主界面
在方法display中,定义了窗体标题,设置了窗体大小并经过setVisible(true)方法使窗体可见,setBackground()方法设置背景颜色,setResizable(false)方法使窗体大小不可变。用setLayout()方法给容器指定按BorderLayout布局排列部件:
经过容器add()方法将面板放置在North区域:f.add(p5,BorderLayout.NORTH),经过add方法用来向面板中加入部件。
添加GUI部件并给各个部件各自不一样标识,创建中间面板时,如面板p1,p1=new Panel(new GridLayout(1,3,5,5)),设置为GridLayout布局,再用add方法把按钮全部加进去,按(1,3,5,5)方法排列
经过按钮对象addActionListener方法为其注册事件监听处理者。
(2)方法名:actionPerformed方法
作用:设置各个GUI部件事件处理
在 actionPerformed方法中,分别设置了不一样按钮操作事件,当不一样按钮单击发生动作时自动调用实施对应动作,从而实现计算器多个运算功效。
经过e.getActionCommand()取得按钮事件对象命令名,再在if语句中依据操作命令符按情况分别处理事件,进行对应运算。经过setText()方法将结果转化为数字串写入文本输入框中。
事件监听器中事件处理方法void actionPerformed(ActionEvent e)完成关键按钮事件处理。事件处理分以下多个情况:数字按钮事件(“0”,“1”,“2”,“3”···“8”,“9”),小数点按钮事件(“.”),运算符按钮处理事件(“+”,“-”,“*”,“/”),正负号按钮事件(“+/-”),退格按钮事件(“Backspace”),清除按钮事件(“C”),等号按钮事件(“=”),存放按钮事件(“MS”,“MC”,“MR” ,“M+”)等。
(3)方法名:main方法
在该方法中,经过new运算符创建一个类Calculation对象Cal,经过调用display()方法。
(4)方法名:windowClosing方法
在该方法中,在处理窗体“关闭”事件监听者采取继承WindowsAdapter方法。
2.3 应用界面设计
参考了windows计算器布局,我们把总体界面采取BorderLayout布局,文本框所在面板p5在最上方(North区域),存放按钮及显示M状态文本框所在面板p3在最左边(West区域),而Backspace,CE,C所在面板p1和数字按钮、运算符按钮等所在面板p2放置在面板p4中,面板p4统一分布在中央(Center区域),同时面板中又按GridLayout布局分布多行多列。具体以下图所表示。
2.4 事件处理原理、具体设计
首先,对计算器整体布局构思清楚,将整个计算器分成多行多列组成单元,使得整个计算器布局愈加合理、有序。采取网格块布局,整体分为6行,第一行为输入及显示框,第二行为退格键和清零键,下面几行分别为数字按钮和运算符按钮,和MC,MR,MS,M+等存放按钮。
第二,设计依次添加GUI部件。
第三,为各个部件注册监听者,考虑到数字键,运算符,等于,小数点,求平方根等不一样和程序调理清楚,我们分别为其设置了不一样监听者。
第四,设置对应各类算法。
第五,设置主程序和退出方法。
在编写完源程序代码后,进行运行,发觉错误并更正。
最终,测试制作计算器运行情况即计算能力。
动作事件各方关系,结合代码大致以下图所表示:
2.5 算法考虑
在 actionPerformed方法中,分别设置了不一样按钮操作事件,当不一样按钮单击发生动作时自动调用实施对应动作,从而实现计算器多个运算功效。
数字按钮和其它按钮作为事件源全部注册了监听者,且监听者符合ActionListener接口要求。数据和运算符键入经过点击按钮来触发事件,在按下“=”按钮时经过调用之前按下对应运算符所表示运算函数进行运算,将所结果保留在dResult中,并显示在文本框内。求平方根、求倒数等运算时,调用了Math类方法进行运算。当输入小数时,将小数点拼接到数字串中。按下清除按钮时,变量初始化。
第3章 源程序代码
//用JAVA编写简易计算器程序(模拟Windows计算器)
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);
}
}
第4章 运行结果及分析
图1所表示,以下就是我们设计出计算器运行界面截图,这一计算器采取是BorderLayout布局,能够实现十进制下正负数加法、减法、乘法、除法四则运算和求平方根、百分号、求倒数、清零、退格等简单操作。Backspace表示退格,CE表示将目前文本框内数据清空,C表示文本框内数据清除。对应按钮上名称代表了对应数字或运算,最终经过“=”按钮将运算结果显示在第一行文本框内,整体上说设计还成功。
图4-1 计算器界面
我们发觉了程序能够正确地进行运算,并显示出正确结果,同时发觉该计算器可进行通常语法分析,比如假如除数为零,计算结果显示“除数不能为零”。
比如假如对超出八位数据进行操作,计算结果用科学表示法表示。
比如假如对非负数进行求平方根,计算结果显示“函数输入无效”。
不过也发觉了计算器对于类似5+6*3运算不能判定运算次序。
图4-2所表示,5+6*3计算器计算结果为33,而正确结果应为23。
图4-2 5+6*3运算结果
第5章 心得体会
5.1系统需要完善地方
1.在第四章提到不能对类似5+6*3运算判定运算次序。
2.程序比较长,还能够进行简化。
3.对于运算方法等方面仍能够进行部分改善。
4.这界面还可设有菜单操作(包含:“编辑”,“查看”,“帮助”三个菜单项)
5.2 课程设计感想
本计算器模拟Windows计算器界面和功效,因为时间仓促和能力有限等问题,只能实现以上功效。此次课程设计到此算是告一段落了,经过这次学习,我学到了很多东西,在此基础上愈加巩固了自己对java认识和了解。
在做本项目是时候,会碰到很多小问题,比如说,在整个运算过程中要怎样确保输入计算数据哪个是第一个计算数据,哪个是第二个计算数据,同时也要区分运算符,因为该计算器程序应用全部是利用字符串来完成计算,而且不能反复输出运算符,更不能
展开阅读全文