《Java 程序设计》
实验报告
题
目:
模拟计算器
专
业:
学
号:
姓
名:
指导教师:
成
绩:
二 00 年 十二 月 十一 日
1. 课程设计研究背景及意义
这次课程设计是通过 JAVA 编程来实现计算器的功能。以前,人们用
来计算的工具不管从方便的角度还是速度的角度来看都不及现代计算器,
计算器的发明是人类进步的有力证明。电子技术的不断发展使得计算器的
功能不断的完善。人们通过使用计算器来提高自己的工作效率,计算器是
高科技的产物,是以往任何时代都无法比拟的。在二十一世纪的今天,计
算器依然是人们重要的计算工具,所以,对计算器的研究的课程设计具有
重大意义。
本次课程设计题目主要应用到 JAVA 面向对象程序设计语言中 Swing 组
件和 GUI(图形用户界面)当中的一些知识,当然也用到 JAVA 中大部分基础
知识,如 JAVA 的基本控制结构、数组、输入与输出等等 。
2. 课程设计题目描述和要求
通过 JAVA 中的 Swing 组件来制作一个计算器的界面包括 0—9 的十个
数字按键,小数点键,+-*/开方百分比,倒数运算符键,=运行符键等。以
及实现计算器的一些基本的计算功能。这个模拟计算器能进行连加,连减,
连乘,连除,求二次平方根,求百分比,求倒数以及负数运算等操作。
要求界面逼真,按键布局美观,要求实现加、减、乘、除等基本计算
功能。
3. 课程设计报告内容
3.1 题目求解的理论依据及算法
解题原理:
(1)界面布局。创建一个面板,先将所有按钮:所有数字键和运算符键
等放在面板上,采用网格布局,具体设计为 4 行,5 列的网格,二十个格
子。再添加一个 1 行 3 列的网格布局来放置三个功能键:清零,检测,退
格键。然后,对以上两个面板,采用 BorderLayout 布局,将按键面板放在
计算机的中部,功能键面板放北部,作为一个新的面板。最后,将文本框
放在北部,新面板放中央,采用边界布局管理器,做为界面的整体布局,
这样界面布局就搞定了。
(2)输入数字、小数点、符号时按输入的顺序显示在单行文本框中,并
按右对齐方式显示,且不允许修改文本行中的内容。
(3)输入运算符时,说明前一个数已经输入完毕,保存第一个数
firstDigit,同时保存运算符,显示 firstDigit。
(4)输入第二个数,按等号,保存第二数,根据输入的运算符进行相应
的运算,文本行中显示运算结果 resultNum。
(5)按退格键 Backspace,将返回到前一次输入状态。
(6)按 Check 键,输入的数字第一个数字为零。
(7)按复位键键 Again,归零。
(8)第三、四步可以重复操作。
3.2 数据结构:
面板:数字等按键面板 calckeysPanel,功能键面板 calmsPanel,
组合面板 panel1,整体布局:top
第一个数 firstDigit,运算结果 resultNum,运算符 operator,文本
行组件 result
3.3 主要事件处理:
1,数字输入及小数点事件,输入后直接显示在广本行。
2,双目运算符输入事件:输入后,保存第一个数,同时保存运算符
3,单目运算符和等于符=输入事件:保存第二个数,取出原有数据和
运算符算出结果,并显示在文本行组件。
4,以上几类事件都归为行为类对象。ActionListener.
3.4 简要的设计流程:
创建窗口
构造计算器界面
结构
对各个按钮添加事件
监听器 ActionListener
以及事件处理
输出显示区域
功能键按钮(网)
(边)
(边)
数字符号及运算符按钮(网)
数 字 键 按 钮
运算符键按钮
功能键按钮
事件处理
事件处理
事件处理
完 成 java 源 代
码编写
调试修改程序,完善模拟
计算器功能
3.5、主要操作步骤(部分源程序代码)
1.导入包:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
2.建立类Calulator类:
public class Calulator extends JFram implements
ActionListener {
3.定义属性和方法并实例化:
private final String[] NBKEYS = { "7", "8", "9", "/",
"sqrt", "4", "5",
"6", "*", "%", "1", "2", "3", "-", "1/x", "+/-", "0",
".", "+", "=" };
private final String[] CMKEYS = { "Backspace", "CHCEK",
"AGAIN" };
private JTextField resultText = new JTextField("0");
private void init() {
;
resultText.setHorizontalAlignment(JTextField.RIGHT)
resultText.setEditable(false);
resultText.setBackground(Color.LIGHT_GRAY);
JPanel calckeysPanel = new JPanel();
calckeysPanel.setLayout(new GridLayout(4, 5, 3, 3));
for (int i = 0; i < NBKEYS.length; i++) {
keys[i] = new JButton(NBKEYS[i]);
calckeysPanel.add(keys[i]);
keys[i].setForeground(Color.BLACK);
}
JPanel calmsPanel = new JPanel();
calmsPanel.setLayout(new GridLayout(5, 1, 3, 3));
JPanel panel1 = new JPanel();
panel1.setLayout(new BorderLayout(3, 3));
panel1.add("North", commandsPanel);
panel1.add("Center", calckeysPanel);//
JPanel top = new JPanel();
top.setLayout(new BorderLayout());
top.add("Center", resultText);
4.整体布局:
getContentPane().setLayout(new BorderLayout(3, 5));
getContentPane().add("North", top);
getContentPane().add("Center", panel1);
getContentPane().add("West", calmsPanel);
5.为个按钮添加监听器:
keys[i].addActionListener(this);
for (int i = 0; i < NBKEYS.length; i++) {
}
for (int i = 0; i < CMKEYS.length; i++) {
}
cmkeys[i].addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
6.处理按钮事件:
private void handleBackspace() {
String text = resultText.getText();
int i = text.length();
if (i > 0) {
text = text.substring(0, i - 1);
if (text.length() == 0) {
resultText.setText("0");
firstDigit = true;
operator = "=";
resultText.setText(text);
} else {
}
}
}
private void handleNumber(String key) {
if (firstDigit) {
resultText.setText(key);
7.运算功能的实现:
} else if ((key.equals(".")) &&
(resultText.getText().indexOf(".") < 0)) {
resultText.setText(resultText.getText()
+ ".");
} else if (!key.equals(".")) {
resultText.setText(resultText.getText() + key);
}
firstDigit = false;
}
private void handleC() {
resultText.setText("0");
firstDigit = true;
operator = "=";
}
private void handleOperator(String key) {
if (operator.equals("/")) {
if (getNumberFromText() == 0.0) {
operateValidFlag = false;
resultText.setText("除数不能为零 ");
resultNum /= getNumberFromText();
} else {
}
if (resultNum == 0.0) {
} else if (operator.equals("1/x")) {
operateValidFlag = false;
resultText.setText("零没有倒数");
} else {
}
resultNum = 1 / resultNum;
resultNum -= getNumberFromText();
resultNum += getNumberFromText();
} else if (operator.equals("+")) {
} else if (operator.equals("-")) {
} else if (operator.equals("*")) {
resultNum *= getNumberFromText();
} else if (operator.equals("sqrt")) {
resultNum = Math.sqrt(resultNum);
} else if (operator.equals("%")) {
} else if (operator.equals("+/-")) {
} else if (operator.equals("=")) {
resultNum = getNumberFromText();
}
if (operateValidFlag) {
resultNum = resultNum * (-1);
resultNum = resultNum / 100;
}
8.输出运算结果:
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
} else {
}
resultText.setText(String.valueOf(t1));
resultText.setText(String.valueOf(resultNum));
private double getNumberFromText() {
double result = 0;
try {
result =
Double.valueOf(resultText.getText()).doubleValue();
} catch (NumberFormatException e) {
}
return result;
}
9.调用方法实现上述所有功能:
public static void main(String args[]) {
Calulator calculator1 = new Calulator();
calculator1.setVisible(true);
calculator1.setDefaultCloseOperation(JFrame.EXIT_ON
_CLOSE);
}
}
3.6 程序调试出错信息及解决方法
程序在调试过程中碰到很多的错误,譬如说事件监听器与事件源没有
关联、除数为零、数组下标越界等等。下面是缺返回值异常问题:
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved
compilation problem:
This method must return a result of type double
at 沈呈洁的计算器.Calulator.getNumberFromText(Calulator.java:174)
at 沈呈洁的计算器.Calulator.handleOperator(Calulator.java:155)
at 沈呈洁的计算器.Calulator.actionPerformed(Calulator.java:91)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown
Source)
解决方法:将语句 result =
Double.valueOf(resultText.getText()).doubleValue();进行异常处理,
try {
result =
Double.valueOf(resultText.getText()).doubleValue();
} catch (NumberFormatException e) {