java简易计算器课程
目 录
1设计目的………………………………………………………………………2 2 设计题目及要求……………………………………………………3 3设计算法分析………………………………………………………………4
3.1 模块调用层次图………………………………………………………4
3.2 核心算法描述………………………………………………………5
3.3 系统特点………………………………………………………7 4程序代码………………………………………………………………………8 5调试情况……………………………………………………………………16 6结论……………………………………………………………………………18 参考文献 ………………………………………………………………19
简易计算器
1.设计目的
本课程设计的目的就是要通过一次集中的强化训练,使学生能及时巩固已学的知识,补充未学的但又必要的内容。进行课程设计目的在于加深对程序设计基础中基础理论和基本知
识的理解,促进理论与实践的结合,进一步提高程序设计的能力。具体目的如下:
1(使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2(培养学生综合运用所学知识独立完成课题的能力。
3(培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4(提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5(培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6(对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头
达能力进行考核。
- 1 -
2.设计题目及要求
【1】设计题目
简易计算器
【2】设计要求
1)独自一人完成课程设计,不得抄袭。
2)应用自己所学课程知识完成对计算器的基本任务。 3)查阅相关资料,学习和掌握项目中涉及的新知识,提高自学能力。 4)通过应用java程序编写计算器来提升自己对简单的图形界面有一定的掌握和了解。
5)设计的简易计算器应能够实现,,×?求倒数等基本运算功能,类似于Windows中的计算器。
6)设计一个简单,亲和图形界面(GUI)的计算机应用程序
- 2 -
3.设计算法分析
3.1 模块调用层次图
【1】变量描述
数组:
1 JButton b[] = new JButton[10];
创建按钮类型的数组,为数字键0-9这 10个按钮。
全局变量:
JFrame frame; 1
创建一个jFrame类型的
,为frame,用来存放需要显示的一些东西。
2 JTextField show;
创建一个JtextField类型的展示框,为show。上面用来显示输出或计算的结果。
3 double sum = 0, getValue;
创建一个类型为双精度的变量,其初始值为0.返回计算后得到的值。
4 JDialog about;
创建一个类型为Jdialog的对话框abhout,其显示的该计算器的一些关于内容。
5 final int slength = 30;
创建一个为类型为整形的slength,其值为30,意味该计算器显示的有效长度最大值
为30,超过30的话,计算器将不能够全部显示。
6 JButton bc, c, ce, ab, jia, jian, cheng, chu, equ, point, sqrt, ds, bfh,zf;
创建类型为Jbuttond的按钮退格,清空,复位,关于,加,减,乘,除,等号,
小数点,2次方根,倒数,百分号,正负号,当按下这些按钮的话,便会触发相
应的监听器,根据这些监听器的设置,执行对应的程序。
7 int i = 0, j = 0, p = 0, l, action;
创建类型为整形的初始化书i、j、p。这几个按钮在算法初始化时实现。
8 Panel dispMain = new Panel()
创建类型为panel的面板dispMain,用来存放另一些控件。
:
1 public void disp()
创建无值函数disp(),用来存放界面所需要展示的元素,包括有面板,按钮,
弹出对话框,显示框等。
- 3 -
2 public void actionPerformed(ActionEvent e)
创建无值函数actionPerformed(ActionEvent e),其允许的输入值类型为
ActionEvent e,在里面编写的是加减陈除等一些算法。 3 public void setSum()
创建无值函数setSum(),显示出经过算法计算出的结果,4 public void windowClosing(WindowEvent e)
创建无值函数windowClosing(WindowEvent e),当显示程序界面右上角的x时,
将关闭程序。
5 public static void main(String args[])
创建静态无值函数main主函数,用来调用以上所示的函数。
【2】程序流程
1 系统模块调用层次图
Main()
disp()
setSum() actionPerformed(windowClosing(Win ActionEvent e)
dowEvent e)
3.2核心算法描述
- 4 -
通过该步骤可实现累加功能:
setSum();
j++;
p = 0;
i = 0;
action = ,
判断最后一个操作数的类型:
else if (e.getSource() == equ) { // 等号,运算最后一个操作数
switch (action) {
case 1:
show.setText(String.valueOf(sum += getValue));
break;
case 2:
show.setText(String.valueOf(sum -= getValue));
break;
case 3:
show.setText(String.valueOf(sum *= getValue));
break;
case 4:
show.setText(String.valueOf(sum /= getValue));
break;
}
设定数字按钮的触发算法:
for (l = 0; l < 10; l++) { // 0~9数字键触发
if (e.getSource() == b[l]) {
if (i == 0)
show.setText("");
String s = show.getText();
if (s.length() < slength)
show.setText(show.getText() + e.getActionCommand());
if (e.getSource() == b[0] && getValue == 0 && p == 0)
show.setText("0");
if (e.getSource() != b[0] && getValue == 0 && p == 0)
show.setText(e.getActionCommand());
i++;// i 用来标记数字键触发的状态
设定计算器关闭的方法:
public void windowClosing(WindowEvent e) {
if (e.getSource() == about)
about.setVisible(false);
- 5 -
else if (e.getSource() == frame)
System.exit(0);
为按钮绑定监听器:
about.addWindowListener(this);
3.3 系统特点:
该计算器基本运算没有问题,清零、正负号、求倒数、退格功能都能很【1】
好的实现,总体能完成一个计算器的基本功能,但仍有许多地方需要改进,比如小数点的实现所存在的一些问题,虽然在基本的运算过程当中不会造成太大影响,但这依然不能认为是一个很好的计算器,同时,在另一方面,该计算器还没能很好的实现连续计算的功能,必须每次按下等号按钮计算出结果后才能用产生的结果接着进行下一次的计算,改进的方法是在运算符上同时注册Result类,让运算符同时拥有计算结果的功能.
【2】由于简易计算器属于一个题,所以关于计算器的全部都是由自己完成.
- 6 -
4. 程序代码
【1】程序代码
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.SwingConstants;
public class Calculator extends WindowAdapter implements ActionListener {
JFrame frame;
JTextField show;
JButton bc, c, ce, ab, jia, jian, cheng, chu, equ, point, sqrt, ds, bfh,
zf;
// 按钮 退格,清空,复位,关于,加,减,乘,除,等号,小数点,2次方根,倒数,
百分号,正负号
JButton b[] = new JButton[10]; // 按钮数组,数字键0,9
double sum = 0, getValue;
int i = 0, j = 0, p = 0, l, action;
JDialog about;
final int slength = 30; // 设置结果显示有效长度
public void disp() {
frame = new JFrame();
frame.setTitle("xx"); 的个人计算器
frame.setSize(360, 230);
frame.setLocation(380, 260);
- 7 -
frame.setBackground(Color.LIGHT_GRAY);
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
frame.setResizable(false);
//disTopbackcecabout 计算器模块,包括数字显示文本框、,,,按钮
show = new JTextField(31);
show.setText("0");
show.setHorizontalAlignment(SwingConstants.RIGHT);
show.setEditable(false);
frame.add(show);
Panel dispTop = new Panel();
frame.add(dispTop);
dispTop.setLayout(new GridLayout(1, 4, 3, 3));
bc = new JButton(" Back ");
bc.setForeground(Color.BLUE);
dispTop.add(bc);
ce = new JButton(" CE ");
ce.setForeground(Color.BLUE);
dispTop.add(ce);
c = new JButton(" C ");
c.setForeground(Color.BLUE);
dispTop.add(c);
//广告按钮,显示计算器制作者
ab = new JButton(" About ");
ab.setForeground(Color.BLUE);
dispTop.add(ab);
about = new JDialog(frame, "关于计算器", true);
Label ct = new Label("本 计 算 器 由 xx 制 作", 1);
ct.setForeground(Color.RED);
about.add(ct, "Center");
about.setSize(200, 100);
about.setLocation(500, 300);
- 8 -
//主要按钮显示面板包括disLeft和disRight
Panel dispMain = new Panel();
frame.add(dispMain);
dispMain.setLayout(new GridLayout(1, 2, 10, 10));
//disLeft面板,包括0-9、+/-、。这十二个按钮
Panel dispLeft = new Panel();
dispMain.add(dispLeft);
dispLeft.setLayout(new GridLayout(4, 3, 3, 3));
Panel dispRight = new Panel();
//disRight面板,包括+、-、*、/、sqrt、%、1/x、=这个人几个按钮
dispMain.add(dispRight);
dispRight.setLayout(new GridLayout(4, 2, 3, 3));
//新建0-9这是个按钮,并将其添加到disLeft中
for (l = 9; l >= 0; l--) {
b[l] = new JButton(String.valueOf(l));
dispLeft.add(b[l]);
b[l].addActionListener(this);
}
//新建其余按钮,并分别将其添加到各自的面板中
jia = new JButton("+");
jia.setForeground(Color.RED);
jian = new JButton("-");
jian.setForeground(Color.RED);
cheng = new JButton("*");
cheng.setForeground(Color.RED);
chu = new JButton("/");
chu.setForeground(Color.RED);
equ = new JButton("=");
equ.setForeground(Color.RED);
point = new JButton(".");
zf = new JButton(" +/- ");
- 9 -
sqrt = new JButton("sqrt");
bfh = new JButton("%");
ds = new JButton("1/x");
dispRight.add(chu);
dispRight.add(sqrt);
dispRight.add(cheng);
dispRight.add(bfh);
dispRight.add(jian);
dispRight.add(ds);
dispRight.add(jia);
dispRight.add(equ);
dispLeft.add(zf);
dispLeft.add(point);
//为各个按钮绑定 监听器
about.addWindowListener(this);
bc.addActionListener(this);
ce.addActionListener(this);
c.addActionListener(this);
ab.addActionListener(this);
jia.addActionListener(this);
jian.addActionListener(this);
cheng.addActionListener(this);
chu.addActionListener(this);
equ.addActionListener(this);
point.addActionListener(this);
zf.addActionListener(this);
sqrt.addActionListener(this);
bfh.addActionListener(this);
ds.addActionListener(this);
frame.addWindowListener(this);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
getValue = Double.valueOf(show.getText()).doubleValue();
if (e.getSource() == jia) { // 加运算,可连加
- 10 -
if (j == 0) {
sum = getValue;
} else if (action == 1) {
sum += getValue;
}
setSum();
j++;
p = 0;
i = 0;
action = 1;
} else if (e.getSource() == jian) { // 减运算,可连减
if (j == 0) {
sum = getValue;
} else if (action == 2) {
sum -= getValue;
}
setSum();
j++;
p = 0;
i = 0;
action = 2;
} else if (e.getSource() == cheng) { // 乘运算,可连乘
if (j == 0) {
sum = getValue;
} else if (action == 3) {
sum *= getValue;
}
setSum();
j++;
p = 0;
i = 0;
action = 3;
} else if (e.getSource() == chu) { // 除运算,可连除
if (j == 0)
sum = getValue;
else if (action == 4) {
- 11 -
sum /= getValue;
}
setSum();
j++;
p = 0;
i = 0;
action = 4;
} else if (e.getSource() == equ) { // 等号,运算最后一个操作数
switch (action) {
case 1:
show.setText(String.valueOf(sum += getValue));
break;
case 2:
show.setText(String.valueOf(sum -= getValue));
break;
case 3:
show.setText(String.valueOf(sum *= getValue));
break;
case 4:
show.setText(String.valueOf(sum /= getValue));
break;
}
setSum();
i = 0;
j = 0;
action = 0;
} else if (e.getSource() == point) { // 小数点,只能按一个小数点
if (p == 0)
show.setText(show.getText() + e.getActionCommand());
p = 1;
} else if (e.getSource() == c || e.getSource() == ce) { // 清空与复位
i = 0;
j = 0;
p = 0;
sum = 0;
action = 0;
- 12 -
show.setText("0");
} else if (e.getSource() == bc) { // 退格
String s = show.getText();
if (s.length() > 1) {
show.setText("");
for (l = 0; l < s.length() - 1; l++) { // 按一下,删除尾部一位
char a = s.charAt(l);
show.setText(show.getText() + a);
}
} else
show.setText("0");
} else if (e.getSource() == ab) { // 关于
about.setVisible(true);
} else if (e.getSource() == sqrt) { // 开2次方根
sum = Math.sqrt(getValue);
setSum();
i = 0;
} else if (e.getSource() == ds) { // 求倒数
sum = 1 / getValue;
setSum();
i = 0;
} else if (e.getSource() == bfh) { // 百分号
sum = getValue / 100;
setSum();
i = 0;
} else if (e.getSource() == zf) { // 正负号切换,正号不显示
String s = show.getText();
char a = s.charAt(0);
if (a == '-') {
show.setText("");
for (l = 1; l < s.length(); l++) { // 去掉负号
show.setText(show.getText() + s.charAt(l));
}
} else if (getValue != 0) { // 加上负号
show.setText("-" + s);
}
- 13 -
}
for (l = 0; l < 10; l++) { // 0~9数字键触发
if (e.getSource() == b[l]) {
if (i == 0)
show.setText("");
String s = show.getText();
if (s.length() < slength)
show.setText(show.getText() + e.getActionCommand());
if (e.getSource() == b[0] && getValue == 0 && p == 0)
show.setText("0");
if (e.getSource() != b[0] && getValue == 0 && p == 0)
show.setText(e.getActionCommand());
i++;// i用来标记数字键触发的状态
}
}
}
public void setSum() { // 把计算结果显示出来
show.setText(String.valueOf(sum));
String s = show.getText();
char a = s.charAt((s.length() - 1));
char b = s.charAt((s.length() - 2));
if (a == '0' && b == '.') { // 如果是整数,则去掉后面的小数点和0
show.setText(String.valueOf(Math.round(sum)));
}
}
public void windowClosing(WindowEvent e) {
if (e.getSource() == about)
about.setVisible(false);
else if (e.getSource() == frame)
System.exit(0);
}
public static void main(String args[]) {
new Calculator().disp();
}
}
- 14 -
【2】程序执行结果
由于计算器的结果是根据输入值而确定的,当输出不一样的值会都得不同的结果,故程序实行结果将在调制中进行从而得出。
【3】结果的讨论
5.调试情况
1)按钮测试:只要测试程序界面显示是否正常,按钮是否能够正确使用
程序整个界面如图所示:
经过测试,按钮、显示框显示正常,无错位无延迟。
测试about弹出对话框,显示正常,结果如图所示:
2)运算测试:主要测试计算器运算功能
测试用例:
1加法测试:8222+1500.2,结果为9722.2。结果正确,结果如图所示:
2减法测试:0.58-2.891,结果为-2.311。结果正确,结果如图所示:
3乘法测试:458*(-156.22),结果为-71548.46。结果正确,结果如图所示:
0*-7.234,结果为0 。结果正确,结果如图所示:
4 除法测试:7.2/0,结果为infinity。结果正确,结果如图所示:
0/88,结果为0。结果正确,结果如图所示:
- 15 -
100/15.3,结果为6.54。结果正确,结果如图所示:
6.结论
本次课程设计到此算是告一段落了,经过这次的学习,我学到了很多东西,在此基础上更加巩固了自己对java的认识与了解。
在做本项目是时候,会遇到很多小问题,比如说,在整个运算过程中要如何确保输入的计算数据哪个是第一个计算数据的,哪个是第二个计算数据的,同时也要区分运算符,因为该计算器程序应用的都是利用字符串来完成计算的,而且不能重复输出运算符,更不能将运算符错误的存储在了第一个计算数据的数值中,也得考虑到万一不小心重复点击了运算符按钮会不会造成第一个计算数据的重新赋值等等问题,最后想到利用布尔类型来很好的控制运算符的应用~
由于时间仓促,该程序还有些不足之处,1)该程序未添加异常处理事件,在异常发生的时候,不能够对程序进行处理,但是当该程序发生异常如溢出是,会爱文本显示框内显示infinity字符,提示不可操作或操作错误。2)人机交互界面还是稍有欠缺的,相信日后或有所改进的。
此次课程设计让我更了解熟悉了Java中的图形用户界面和它的编程方式。在完成课题的过程中也不断充实了自己,学习到了很多以前没有学习到的知识,收获很大。最大的收获就是对大学学习的总结和培养了解决困难的信心和能力,使我对所学知识能够融会贯通,又不断丰富了新知识。Java计算器设计使得我们对所学的专业课有了更为深刻的认识,使得知识得到了巩固和提高。
在接下来的时间里,我觉得我要更加努力的往深一层次的方面看齐,了解更多有关java的知识,对java有更深一步的了解,我会一步一步的走下去~
- 16 -
参考文献
[1] 丁振凡. Java语言实用教程(第2版)[M]. 北京邮电大学出版社. 2008.1
[2] 丁振凡. Java语言实用教程实验指导(第2版)[M]. 北京邮电大学出版社. 2008.1
[3] 杨树林等. Java语言最新实用案例教程(第2版)[M]. 清华大学出版社. 2010.7
[4] 张帆等. Java范例开发大全. 清华大学出版社. 2009.8
- 17 -
- 18 -