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