1、. . .保存计算过程的计算器1.课程设计的目的随着计算机技术的飞速发展,人们已经不能满足于采用人工进行大量的计算,计算器快速的计算速度和稳定的准确率很好的满足了用户的需要,保存计算过程的计算器更是能够让用户随时随地的查找以前的计算过程。保存计算过程的计算器正是在这样的市场需求之下研发的,目的旨在帮助用户快速准确的得到计算结果。掌握Java语言编程的基础知识并能熟练运用,熟悉类声明与对象的使用,理解委托时间处理模型,了解Java语言的图形用户界面的设计知识,运用JCreator编写简单计算器程序,并实现其功能 。2.设计方案论证2.1需求分析设计一个图形界面的带保存过程的计算器应用程序,完成简
2、单的算术过程。设计的计算器应用程序除了普通的计算功能外,还有n次方、算术平方根、正弦函数、对数、随机取值、退格、清零等功能。程序主要是设计一个计算器的界面,并练习使用事件监听器处理数据的输入,并完成相关计算。用户可以利用鼠标点击数值或操作符按键完成计算的输入,计算的过程将被显示在窗口右边的文本框中,另外使用程序自带的保存功能将计算过程保存到想要的地方。2.2设计思路本应用程序继承自框架类Frame,此程序不使用布局管理器,将单行输入显示文本框、各个按钮功能、计算过程显示区加入到同一个面板内,直接添加到各自区域。同时注册按钮时间监听器。如:b0 = new JButton;b0.addActio
3、nListenernew ActionListener事件监听器中的事件处理方法void actionPerformed,完成主要事件的按钮事件的处理。事件处理分以下几种情况:数字按钮事件1,2,3,9,0、运算符按钮事件+,-, *,/、正负号按钮事件、小数点按钮事件.、等号按钮事件=、n次方按钮事件xy、算术平方根按钮事件、正弦函数按钮事件sin、对数函数按钮事件log、随机取值按钮事件R、PI按钮事件、退格按钮事件、清零按钮事件C、保存复制清除按钮事件保存,复制,清除。2.3设计方法将数字键与其他键分别进行监听,一个单行文本框用来显示输入的数据,str用来存放每次录入的数据,数据与字符录
4、入都通过按键来触发事件,单行文本框设置为不可编辑、下沉。然后对所有的button进行监听,当按到+,-,*,/按钮时,将之前输入的数字存储到s中,输入的运算符通过变量operatorchar来储存,当再输入数字后遇到=时,便将运算符后的数字存储到变量s2里,接着调用+,-,*,/运算函数进行运算,将结果用s1保存起来,并显示 在单行文本框中。退格按钮事件只需将输入的数据字符型重新编辑后,把最后一个数字消去再重新显示出来,清空按钮即是将所有变量初始化。求n次方、开方、正弦函数和对数函数可调用系统Math类的静态方法t1,随机取值设定当事件发生时100以内的正数随机出现。2.4功能模块设计按下数字
5、键在文本框上会显示数字,这是计算器最基本的功能;在任何时候按下+-键,计算器文本框上的数字置相反数;右边一个文本框显示计算过程,上面一个文本框显示输入的数字;当按下的运算符号时前面已经按下过运算符号时,右边一个文本框显示上一个运算符号以及两个数之间的运算结果;按下清除C键,数据被全部清除;点击右侧保存按钮,可保存计算过程。基本运算模块功能1加法两个数据相加操作,可以为正负数、小数。2减法两个数据相减操作,可以为正负数、小数。3乘法两个数据相乘操作,可以为正负数、小数。4除法两个数据相除操作,可以为正负数、小数。2.4.2特殊运算模块功能1n次方求一个自然数m的n次方。2算术平方根求一个非负整数
6、的算术平方根。3正弦函数求一个自然数的正弦值。4对数函数求一个正数以10为底的对数。5随机函数随机出现一个0100以内的整数。2.4.3保存计算过程模块1保存:选择保存位置、输入保存文件名称及格式,确定完成保存。2复制:复制运算过程区域内容。3清除:清除运算过程区域所有内容。系统结构图,如图1所示。计算器标题栏文本框按键计算过程区计算器文本框0-9、+、-、*、/、=、. 、C、xy、sin、log、R计算过程保存区域保存复制清除选择保存位置、输入保存名称格式确定完成保存图1 系统结构图主要程序运算过程流程图,如图2所示。开始初始化数据退格数字否删除输入的数是否运算符输出数字结束进行计算是否等
7、号是是输出结果否清除否初始化变量图2 运算过程流程图3.设计结果与分析编写Java程序,开发环境为JCreator,程序包含jisuan.java和jisq.java两个java源文件。其中,jisuan.java为程序的主类,jisq.java内包含程序主界面设计、各类算法设计以及保存计算过程等部分。程序经过检查修改无误后运行得到如下运行结果。1计算器程序主界面,如图3所示。图3 计算器主界面2各种运算界面,如图4所示。图4 运算界面3计算器显示框清零操作,如图5所示。图5 清零操作4保存计算过程,如图6所示。图6 保存计算过程5查看保存后文件,如图7所示。图7 保存文件6点击清除按钮,清除
8、计算过程区内容,清除内容后,界面返回程序主界面,计算过程显示区重新显示新的计算过程。当输入数据有误时,程序会运行出错。1当程序进行除法运算除数为零时,程序运行错误,如图8所示。图8 除数为零错误2当程序进行求算术平方根运算根号下为负数时,程序运行错误,如图9所示。图9 根号下为负数错误3当程序进行对数运算底数为非正数时,程序运行错误,如图10所示。图10 底数为非正数错误4.设计体会在这两周的Java课程设计中,我学到了很多很多,感受也是颇多。越来越发现实践的重要性。首先在做这次课程设计的时候,遇到了很多问题,这些问题让我改掉了自己暴躁的性格,学会了有耐心,耐心的去琢磨枯燥的代码,耐心的去敲代
9、码,耐心的去调试代码,修改错误其中最大的问题的如何保存已经输入的数字或者符号进行运算,如何显示运算过程,经过多次研究和查询发现有很多种保存运算过程的方法,可以运用链表进行存储和提取数据,也可以用栈。另外,此次课程设计让我更了解熟悉了Java中的图形用户界面和它的编程方式。在完成课题的过程中也不断充实了自己,学习到了很多以前没有学习到的知识,收获很大。最大的收获是在完成过程中培养的解决问题的能力。在做课程设计时必然会遇到困难,会有不会的东西,重要的不是现在会不会,而是遇到问题知道如何找到解决的途径。还使我对所学知识能够融会贯通,又不断丰富了新知识。Java计算器设计使得我对所学的专业课有了更为深
10、刻的认识,使得知识得到了巩固和提高。这两周磨平了尖锐的棱角,让我变的更加成熟,同时,更加加深对知识的理解和印象。在学习的过程中,我发现了许多简便方法,例如检查错误,尝试新方法,调试不懂语句的作用但是,这也是在深刻的教训中学到的,慢慢发现自己的Java语言学的还不够好,理解的还不够深,知道的还少,有的甚至都没见过,所以,我的学习还有待于加强,并且要继续努力学习,吾生也有涯,而知也无涯,所以应该树立良好的学习理念,更何况现代信息技术高速发展,不学习就会落后,就会被社会所淘汰,因此要时刻提醒自己学习,学习新的科学技术。5.参考文献1刘升华.JAVA从入门到实践M. 北京:清华大学出版社 20092王
11、晓东.算法设计与分析M. 北京:清华大学出版社 20033艾力江.Java2范例入门与提高M. 北京:清华大学出版社20034陈国君. Java2设计基础M. 北京:清华大学出版社 20095饶一梅.Java语言程序设计M. 北京:人民邮电出版社 2009附录jisuan.java/jisuan.javaimport javax.swing.*;public class jisuan public static void main jisq ji = new jisq;jisq.java/ jisq.javaimport java.awt.*;import java.awt.event.*;i
12、mport java.io.*;import java.text.*;import java.util.*;import javax.swing.*;import javax.swing.border.*;public class jisq extends JFrame implements ActionListener JPanel pane = new JPanel;String s, s1, s2;double t, t1, t2 = 0;JTextField fiel, show;JTextArea area;JButton b0, b1, b2, add, b3, b4, b5, b
13、6, b7, b8, b9, sub, mul, dele, equ, dev;JButton sqrt, pow, random, sin, p, log, zf, tui, save, clear, copy, point;public jisq init;this.setBounds;this.setTitle;this.setVisible;this.setResizable;this.setDefaultCloseOperation;void init pane.setLayout;this.add;area = new JTextArea; JScrollPane scrollPa
14、ne = new JScrollPane; scrollPane.setBounds;area.setEditable;pane.add;fiel = new JTextField;fiel.setBounds;fiel.setEditable;fiel.setFontnew Font;/ 显示框中的数字大小和颜色fiel.setHorizontalAlignment;/ 文字右对齐fiel.setBackground;/ 设置背景颜色fiel.setBordernew SoftBevelBorder;pane.add;show = new JTextField;show.setBounds;
15、show.setEditable;show.setFontnew Font;/ 显示框中的数字大小、颜色show.setHorizontalAlignment;/ 文字居中pane.add;b0 = new JButton;b0.setBounds;pane.add;b0.addActionListenernew ActionListener / 匿名类实例做监视器public void actionPerformed if e.getSource = b0 fiel.setTextfiel.getText + 0;show.setTextfiel.getText;b1 = new JButt
16、on;b1.setBounds;pane.add;b1.addActionListener;b2 = new JButton;b2.setBounds;pane.add;b2.addActionListener;add = new JButton;add.setForeground;add.setBounds;pane.add;add.addActionListener;b3 = new JButton;b3.setBounds;pane.add;b3.addActionListener;b4 = new JButton;b4.setBounds;pane.add;b4.addActionLi
17、stener;b5 = new JButton;b5.setBounds;pane.add;b5.addActionListener;sub = new JButton;sub.setForeground;sub.setBounds;pane.add;sub.addActionListener;b6 = new JButton;b6.setBounds;pane.add;b6.addActionListener;b7 = new JButton;b7.setBounds;pane.add;b7.addActionListener;b8 = new JButton;b8.setBounds;pa
18、ne.add;b8.addActionListener;mul = new JButton;mul.setForeground;mul.setBounds;pane.add;mul.addActionListener;b9 = new JButton;b9.setBounds;pane.add;b9.addActionListener;dele = new JButton;dele.setForeground;dele.setBounds;pane.add;dele.addActionListener;equ = new JButton;equ.setBounds;pane.add;equ.a
19、ddActionListener;dev = new JButton;dev.setForeground;dev.setBounds;pane.add;dev.addActionListener;point = new JButton;point.setBounds;pane.add;point.addActionListener;p = new JButton;p.setBounds;pane.add;p.addActionListener;zf = new JButton;zf.setBounds;pane.add;zf.addActionListener;tui = new JButto
20、n;tui.setBounds;pane.add;tui.addActionListener;sqrt = new JButton;sqrt.setBounds;pane.add;sqrt.addActionListener;pow = new JButton;pow.setBounds;pane.add;pow.addActionListener;random = new JButton;random.setBounds;pane.add;random.addActionListener;sin = new JButton;sin.setBounds;pane.add;sin.addActi
21、onListener;log = new JButton;log.setBounds;pane.add;log.addActionListener;save = new JButton;save.setForeground;save.setBounds;pane.add;save.addActionListener;copy = new JButton;copy.setForeground;copy.setBounds;pane.add;copy.addActionListener;clear = new JButton;clear.setForeground;clear.setBounds;
22、pane.add;clear.addActionListener;save.setToolTipText; copy.setToolTipText; clear.setToolTipText;public void actionPerformed String str = e.getActionCommand;if str.equals fiel.setTextfiel.getText + 1;show.setTextfiel.getText; else if str.equals fiel.setTextfiel.getText + 2;show.setTextfiel.getText; e
23、lse if str.equals fiel.setTextfiel.getText + 3;show.setTextfiel.getText; else if str.equals fiel.setTextfiel.getText + 4;show.setTextfiel.getText; else if str.equals fiel.setTextfiel.getText + 5;show.setTextfiel.getText; else if str.equals fiel.setTextfiel.getText + 6;show.setTextfiel.getText; else
24、if str.equals fiel.setTextfiel.getText + 7;show.setTextfiel.getText; else if str.equals fiel.setText fiel.getText +8;show.setTextfiel.getText; else if str.equals fiel.setTextfiel.getText + 9;show.setTextfiel.getText;else if str.equals area.setText;else if str.equals fiel.setTextfiel.getText + .;show
25、.setTextfiel.getText; else if str.equals fiel.setText;show.setText; if str.equals area.copy; if str.equals area.setText; if str.equals JFileChooser chooser = new JFileChooser; int state = chooser.showSaveDialog; File file = chooser.getSelectedFile; if try String content = area.getText; StringReader
26、read = new StringReader; BufferedReader in = new BufferedReader; FileWriter outOne = new FileWriter; BufferedWriter out = new BufferedWriter; String str1 = null; while str1 = in.readLine != null out.write; out.newLine; in.close; out.close; catch else if str.equals StringBuffer s = new StringBufferfi
27、el.getText;if s.length 0 fiel.setTexts.deletes.length - 1, s.length.toString; else if str.equals t = Math.PI;fiel.setText;show.setTextfiel.getText;area.append + =+fiel.getText+ n; else if str.equals s = fiel.getText;s1 =+;fiel.setText;show.setText; else if str.equals s = fiel.getText;s1 = /;fiel.set
28、Text;show.setText; else if str.equals s = fiel.getText;s1 = -;fiel.setText;show.setText; else if str.equals s = fiel.getText;s1 = *;fiel.setText;show.setText; else if str.equals s = fiel.getText;t1 = Double.parseDouble;t = Math.sqrt;fiel.setText; String process = sqrt = + t; show.setText; area.appen
29、d; else if str.equals s = fiel.getText;t = -Double.parseDouble;if fiel.setText;show.setTextfiel.getText;else if str.equals s = fiel.getText;t1 = Math.PI / 180.0 * Double.parseDouble;t = Math.sin;fiel.setText; String process = sin = + t; show.setText; area.append; else if str.equals s = fiel.getText;
30、t1 = Double.parseDouble;t = Math.log10;fiel.setText; String process = log = + t; show.setText; area.append; else if str.equals s = fiel.getText;fiel.setText;s1 = xy;show.setText; else if str.equals int m = Math.random * 100 / 3;fiel.setText;show.setTextfiel.getText; else if str.equals s2 = fiel.getText;t1 = Double.parseDouble;t2 = Double.parseDouble;if s1 = t = t1 + t2; else if s1 = t = t1 - t2; else if s1 = t = t1 * t2; else if s1 = t = t1 / t2; else if t = Math.pow; fiel.setText;String process=s+ + s1 + + s2+ = + t;show.setText;area.append;18 / 18