1、摘 要计算器一般是指“电子计算器”,该名词由日文传入中国。计算器是能进行数学运算的手持机器,拥有集成电路芯片,结构简单,功能较弱,但由于它使用方便、操作简单、价格低廉,因而广泛运用于商业交易中,也是必备的办公用品。该程序是一个图形界面的简单的java计算器,使用人员能快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。可以进行简单的四则运算(加、减、乘、除,以及求倒数,求相反数),有退格功能, 归零表示初始化,界面颜色为灰白,该程序支持键盘操作。关键字 计算器 ,程序,运算,操作I目 录摘 要I1 绪论11.1 课程设计的目的11
2、.2 课程设计的任务与要求12 需求分析22.1 功能需求22.2 出错处理22.3 数据处理22.4 系统环境要求23 概要设计33.1 界面及功能描述33.2 简要的设计流程34 详细设计54.1 计算器界面的设置54.2 类层次中各个类的描述55 系统运行测试75.1 初始运行界面75.2 按键测试75.3 运算符重复输入测试75.4 被除数为0的测试75.5 backspace按键越界操作85.6 优先级程序计算85.7 输出测试86 总结10参考文献11附录(源代码)121攀枝花学院本科课程设计论文 绪 论1 绪论1.1 课程设计的目的计算器在我们的生活中常常会使用到,本次课程设计,
3、通过界面以及其中的逻辑处理,完成了四则运算的处理。通过awt包或者swing包中的界面设计部分对界面设计的细节可以有更多的了解。利用面向对象的思想,将各个组件的事件响应分别用不同的类表达出来。面向对象的思想从很大程度上可以让程序的思路更加清晰,而且可重用性很高。对于具有相同事件响应的组件则可以调用相同的类来处理事件。除此之外,利用栈的知识来解决运算符优先的问题也让我们对java中的栈有了更多的了解。1.2 课程设计的任务与要求a. 使用Java的awt包或Swing包的类库设计图形界面的计算器b 该计算器能够完成加减乘除的四则混合运算(注意运算优先级)c 使用图形界面中的事件委托机制来处理事件
4、响应2 需求分析2.1 功能需求用户能够完成四则混合运算+、-、*、/,并且计算器能够自动的识别运算符的优先级,根据输入的运算公式,自动计算出相应的结果。同时完成计算器中的backspace、ce按钮,能够完成消除或者删除的功能。2.2 出错处理当用户如果按下的是除零的操作,显示框将显示“被除数不能为0”。当用户如果连续多次按下运算符,计算器自动记忆第一次运算符,并且做防连续输入相同的运算符或者是不同的运算符。当用户在同一个数据中多次输入小数点,计算器能够自动判断小数点重复,自动只记忆第一个小数点。当用户在同一个数据中输入多个负号,计算器能够自动做重复检查,不显示多余的负号。当用户在使用bac
5、kspace功能删除越界数据时候,计算器自动做相应处理。2.3 数据处理在程序的起始,建立了两个栈,分别用来存储操作数和操作符。在计算器的核心运算代买中,运用这两个栈来实现算法中的优先级的处理,使用“#”号来标记目标计算公式的结束。目标计算公式通过计算器的键盘实现输入,当按下“=”号之后,计算器通过调用计算器核心函数来实现数据的处理。2.4 系统环境要求操作系统:WIN XP或更高版本开发语言:java开发工具:eclipse2攀枝花学院本科课程设计论文 概要设计3 概要设计3.1 界面及功能描述(1)界面布局。创建一个面板,先将所有按钮:所有数字键和运算符键等放在面板上,采用网格布局,具体设
6、计为4行,4列的网格,十六个格子。再添加一个1行4列的网格布局来放置三个功能键:归零,退格,输出。然后,对以上两个面板,采用BorderLayout布局,将按键面板放在计算机的中部,功能键面板放右上角,作为一个新的面板。最后,将文本框放在左上角,新面板放中央,采用边界布局管理器,做为界面的整体布局,这样界面布局就搞定了。(2)按退格键,将返回到前一次输入状态。(3)按归零键,输入的数字第一个数字为零。3.2 简要的设计流程创建窗口构造计算器界面结构对各个按钮添加事件监听器ActionListener以及事件处理输出显示区域功能键按钮(网)数字符号及运算符按钮(网)数字键按钮事件处理运算符键按钮
7、事件处理功能键按钮事件处理完成java源代码编写调试修改程序,完善模拟计算器功能(边)(边)图3.1 简要的设计流程图44 详细设计4.1 计算器界面的设置本程序的实现使用了swing和awt两个包,主题程序界面按键根据微软计算器的布置界面进行设置,采用比较人性化的常规按键排布。返回计算结果的“=”号键使用了两倍于普通按键面积的设计,使的击中的概率更加大。整体界面是采用了BorderLayout布局,通过4个panel进行布局的详细划分,panel3用来存储位于panel4左下角的GridLayout(1,2,4,4)布局,panel1、panel2、panel3分别用来表示BorderLay
8、out的上中下三个模块。Panel1中添加了一个Label display,display用来作为显示器,实时的显示输入和计算的数据。其中display需要设置为右对齐和只读属性。Panel2中添加数字输入键和基本操作符键,panel采用了GridLayout布局,将整个panel2平分为4*4个空间,其中,数字键采用了15磅字体和蓝色文字,操作符采用了15磅字体和红色文字,是的界面更加显眼和便于区分。Panel4中首先划分为GridLayout(1,2,4,4),在Panel4中,再次使用了GridLayout(1,2,4,4)将panel4的左侧一分为二,左边为panle3,这个的基础上程
9、序往panel3中添加了backspace和ce两个按键,在Panel4的右侧单元格中添加了“=”号按钮,这个时候的“=”号就是相当于两个普通按钮的长度和大小。整个程序界面的设计工作基本完成。4.2 类层次中各个类的描述本次课程设计一共分为了5个类,每个类都各自完成不同的功能。l class MyCalculator: 类MyCalculator是主类,含有main()函数,通过new CalFrame()来运行程序。l class CalFrame: 类CalFrame完成的功能是计算器界面的设计,并且将每个组件都添加事件响应。具体的事件响应操作将在其他的类中逐一实现。l class Han
10、dleWin:点击关闭windows窗口的控制类。l class HandleNum:字符串输入控制类。l Class HandleEqual:等号出发事件的响应机制类。类的属性包括:0-9的数字键JButton num1; JButton num2; JButton num3; JButton num4; JButton num5; JButton num6; JButton num7; JButton num8; JButton num9; JButton num0;+ - * / 四个控制按钮JButton plus;JButton minus; JButton mutiply; JBu
11、tton divide; . +/- 两个按钮JButton point; JButton sign;Backspace ce = 三个按钮JButton bs;JButton ce;JButton equal;将这些按钮按照一定的顺序添加到现实面板中。Panel p1,p2,p3,p4;/为了布局的方便,利用borderLayout,通过几个面板来添加Stack OPNT = new Stack ();/用来记录操作数的栈Stack OPTR = new Stack ();/用来记录操作符的栈,栈底压入“#”,取到了“#代表已到栈底boolean pointswitch = true;/小数
12、点开关boolean oprateswitch = false;/运算符开关boolean siginswitch = true;/ 正负号开关 方法:public void actionPerformed(ActionEvent e)当按下了控制按钮,根据搜索控制开关来确定能否继续添加,各个相应的处理机制。public double segmentation(String myString)字符串优先级计算代码的核心函数。public int compare(char ch1,char ch2)1值为ch1大于ch2;-1为ch1小于ch2;0为ch1等于ch2public double o
13、prate(double a,char b,double ce)通过参数b来判断加减乘除7攀枝花学院本科课程设计论文 系统运行测试5 系统运行测试5.1 初始运行界面图5.1初始运行界面5.2 按键测试图5.2 按键测试5.3 运算符重复输入测试图5.3 运算符重复输入测试5.4 被除数为0的测试图5.4 被除数为0的测试5.5 backspace按键越界操作图5.5 backspace按键越界操作5.6 优先级程序计算图5.6优先级程序计算5.7 输出测试图5.7 输出测试10攀枝花学院本科课程设计论文 总 结6 总结这个学期的java课程设计实现计算器功能的应用程序对我来说是一个不断学习,
14、逐步完善的过程。开始的时候拿到题目看到只有四则混合运算就理所当然的认为应该是非常简单的的一个程序而已。首先开始了程序的界面的设计,并且将一些简单的按钮的事件响应完成了,剩下了运算符优先级的问题以及数据的处理问题。于是在同学的帮助下利用正则表达式来完成输入字符串的切割,但是如果自己一个人单独做的话,对于题目中的数据处理的问题一时不知道该如何与正则表达式连接上。最后我还是选择用栈来处理。这个过程让我明白了学习知识的时候实践与理论之间是有很大的差异的。应用能力我还有待加强。于是我开始熟悉栈的使用。在以前的学习中接触过栈,这次的使用思想是一样的,只需要在了解一下java 中的相关一些函数便可。但实际在
15、写程序的过程中,由于有一些特殊情况的考虑与进出入栈的联系,还是碰到了一些问题。但在后来我慢慢的整理清楚思路以后,逻辑列清楚了,便将这些问题解决,逐步的将各项功能都完善。当然目前我的计算器也只是完成了四则混合运算,实际上还应该有很多功能可以添加入计算器的。本次java课程设计也让我明白只要我一步步去做,那么程序功能便会不断强大。在以后的学习中,多加强自己的动手实践能力。11攀枝花学院本科课程设计论文 参考文献参考文献1 朱福喜.Java语言程序设计(第二版).科学出版社2 陈国君等.Java程序设计基础(第二版).清华大学出版社3 Deitel.Java大学基础教程(第六版).电子工业出版社 4
16、 MaryCampione.Java语言导学(第四版).机械工业出版社5 Y.Daniel Liang.Java语言程序设计基础篇(第六版). 机械工业出版社6 Kathy Sierra.Head First Java(第二版).东南大学出版社7 宁书林等,java2技能百练,中国铁道出版社,20048 於东军等著,Java程序设计与应用开发, 清华大学出版社,200519附录(源代码)import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.util.regex.
17、Matcher;import java.util.regex.Pattern;public class MyCalculator public static void main(String args) new CalFrame();class CalFrame extends JFrame String opnt,optr; Stack OPNT = new Stack (); Stack OPTR = new Stack (); Label display; /显示 JButton num = new JButton10;/按键设计 JButton plus; JButton minus;
18、 JButton mutiply; JButton divide; JButton bs;JButton ce;JButton equal; JButton point; JButton sign;JButton lbracket; JButton rbracket; Panel p1,p2,p3,p4; String disp = ;/用户输入的表达式 String result = ;/用户输入的字符串 CalFrame() OPTR.push(#); for(int i=0;i=9;+i) numi = new JButton(String.valueOf(i); plus = new
19、JButton(+); plus.setForeground(Color.red); plus.setFont(new Font(Dialog,1,15); minus = new JButton(-); minus.setForeground(Color.red); minus.setFont(new Font(Dialog,1,15); mutiply = new JButton(*); mutiply.setForeground(Color.red); mutiply.setFont(new Font(Dialog,1,15); divide = new JButton(/); divi
20、de.setForeground(Color.red); divide.setFont(new Font(Dialog,1,15); equal = new JButton(=); equal.setForeground(Color.red); equal.setFont(new Font(Dialog,1,15); point = new JButton(.); point.setFont(new Font(Dialog,1,15); sign = new JButton(+/-); sign.setFont(new Font(Dialog,1,15); bs = new JButton(b
21、ackspace); bs.setForeground(Color.red); bs.setFont(new Font(Dialog,1,8); ce = new JButton(ce); ce.setFont(new Font(Dialog,1,15); p1 = new Panel(); p1.setLayout(new BorderLayout(); display = new Label(0.,Label.RIGHT); display.setBackground(Color.white); p1.add(display,BorderLayout.NORTH); p2 = new Pa
22、nel(); p2.setLayout(new GridLayout(4,4,4,4); p2.add(num7);p2.add(num8);p2.add(num9);p2.add(divide); p2.add(num4);p2.add(num5);p2.add(num6);p2.add(mutiply); p2.add(num1);p2.add(num2);p2.add(num3);p2.add(minus); p2.add(num0);p2.add(sign);p2.add(point);p2.add(plus); p3 = new Panel(new GridLayout(1,2,4,
23、4); p3.add(bs);p3.add(ce); p4 = new Panel(new GridLayout(1,2,4,4); p4.add(p3); p4.add(equal); setTitle(实现计算器功能的应用程序); setLayout(new BorderLayout(); add(p1,BorderLayout.NORTH); add(p2,BorderLayout.CENTER); add(p4,BorderLayout.SOUTH); setVisible(true); pack(); setResizable(false); setBounds(600,350,30
24、0,230); addWindowListener(new HandleWin(); for(int i=0;i=9;+i)numi.setForeground(Color.blue);numi.setFont(new Font(Dialog,1,15); numi.addActionListener(new HandleNum(this,i); plus.addActionListener(new HandleNum(this); minus.addActionListener(new HandleNum(this); mutiply.addActionListener(new Handle
25、Num(this); divide.addActionListener(new HandleNum(this); point.addActionListener(new HandleNum(this); sign.addActionListener(new HandleNum(this); bs.addActionListener(new HandleNum(this); ce.addActionListener(new HandleNum(this); equal.addActionListener (new HandleEqual(this); class HandleWin extend
26、s WindowAdapter/关闭计算器 public void windowClosing(WindowEvent e) (e.getWindow().dispose(); System.exit(0); boolean pointswitch = true;/小数点开关 boolean oprateswitch = false;/运算符开关 boolean siginswitch = true;/ class HandleNum implements ActionListener/字符串的输入 JFrame my_Num; int itemp = 0; HandleNum(JFrame
27、f,int a) my_Num = f; itemp = a; HandleNum(JFrame f) my_Num = f; public void actionPerformed(ActionEvent e)if(e.getSource()=numitemp)/输入数字字符oprateswitch = true;siginswitch = false;disp = disp + itemp;display.setText(disp);if(oprateswitch&e.getSource()=plus)/输入加号 pointswitch = true;oprateswitch = fals
28、e;siginswitch = true;disp = disp + +;display.setText(disp);if(oprateswitch&e.getSource()=minus)/输入减号pointswitch = true;oprateswitch = false;siginswitch = true;disp = disp + -;display.setText(disp);if(oprateswitch&e.getSource()=mutiply)/输入乘号pointswitch = true;oprateswitch = false;siginswitch = true;d
29、isp = disp + *;display.setText(disp);if(oprateswitch&e.getSource()=divide)/输入除号pointswitch = true;oprateswitch = false;siginswitch = true;disp = disp + /;display.setText(disp);if(oprateswitch&pointswitch=true&e.getSource()=point)/输入小数点pointswitch = false;oprateswitch = false;siginswitch = false;disp
30、 = disp + .;display.setText(disp);if(siginswitch&e.getSource()=sign)/输入负号disp = disp + ;display.setText(disp);if(e.getSource()=bs)/点击backspaceif(!disp.isEmpty()disp = disp.substring(0,disp.length()-1);if(disp.isEmpty()disp= ;display.setText(disp);if(e.getSource()=ce)/点击cedisp = ;display.setText(disp
31、); class HandleEqual implements ActionListener/ 等于号触发的事件 Frame my_Equal; HandleEqual(JFrame f) my_Equal = f; public void actionPerformed(ActionEvent e) if(e.getSource()=equal) disp = disp+#; disp = String.valueOf(segmentation(disp); display.setText(disp); disp = ; pointswitch = true;/小数点开关 oprateswi
32、tch = false;/运算符开关 siginswitch = true;/符号开关 public double segmentation(String myString)String reg = (?d+.?d*)|(-+*/()#); /分割表达式.Pattern p = Ppile(reg);Matcher m = p.matcher(myString);String find = ;double num = 0;double op1,op2;char op3;while(m.find()find = m.group();find = find.replace(,-);trynum =
33、 Double.valueOf(find);OPNT.push(num);catch(NumberFormatException nfe) /find为操作符 if(compare(OPTR.peek().charAt(0),find.charAt(0)=-1) OPTR.push(find); else while(compare(OPTR.peek().charAt(0),find.charAt(0)=1) op2=OPNT.pop(); op1=OPNT.pop(); op3=(OPTR.pop().charAt(0); OPNT.push(oprate(op1,op3,op2); if
34、(compare(OPTR.peek().charAt(0),find.charAt(0)=0) OPTR.pop(); continue; OPTR.push(find); if(compare(OPTR.peek().charAt(0),find.charAt(0)=2) if(OPNT.isEmpty() while(!OPNT.isEmpty() OPTR.pop(); OPTR.push(#); return 0; return OPNT.pop(); if(compare(OPTR.peek().charAt(0),find.charAt(0)=3) return 0; retur
35、n 0.0; public int compare(char ch1,char ch2)/1值为ch1大于ch2;-1为ch1小于ch2;0为ch1等于ch2switch(ch1)case +:if(ch2=+|ch2=-|ch2=#)return 1; else return -1; case -:if(ch2=+|ch2=-|ch2=#)return 1; else return -1; case *:return 1; case /:if(ch2=()return -1; else return 1; case #:if(ch2=#)return 2;else return -1;default :return 3; public double oprate(double a,char b,double ce)if(b=+)return a+ce;else if(b=-)return a-ce;else if(b=*)return a*ce;else return a/ce;