成绩: __________

Java程序设计
工程实践

——简易计算器的设计

院、 系 计算机与软件学院 专业 信息安全
姓 名
指导教师

2022年 6 月 11 日

目录:
一、 设计简介 2
1、 设计背景 2
2、 开发工具及环境 2
(1)开发工具及介绍 2
(2)开发环境 2
二、 相关工作 2
1、设计基础 2
2、功能需求 2
3、系统设计 3
三、 设计原理 3
1、包和类的说明 3
2、简易计算器的源代码清单 3
四、 实现结果 6
1、程序界面 6
2、测试用例 7
3、运行结果 7
五、 设计心得 9

一、 设计简介
1、 设计背景
伴随着日益升高的物质生活水平以及日常生活中对基本的计算需求的提高。如今,网络快速发展,对算力的需求日益增大,计算的效率和性能和人们的生活紧密相关。对此,使用Java语言开发出一个为人们生活带来便利的计算器,以期带来对数据计算的提高。该系统实现了对数的加、减、乘、除的运算。
2、 开发工具及环境
(1)开发工具及介绍
Visual Studio Code(简称“VS Code” )是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器, [2] 可在桌面上运行,并且可用于Windows,macOS和Linux。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java,Python,PHP,Go)和运行时(例如.NET和Unity)扩展的生态系统。
(2)开发环境:window10系统、Visual Studio Code1.67.2、JDK17.0.2。
二、 相关工作
1、设计基础
使用Java Swing的GUI图形用户界面编程设计编写一个简易的计算器,加入事件监听器可以通过鼠标输入参加运算的数值和运算符,达到四则运算的目的。
2、功能需求
图形化用户界面,设计的简易计算器,用户通过鼠标依次输入参与计算的数值和运算符,进行四则运算,具体如下:
(1) 鼠标单击“计算器”上的数字按钮(0、1、2、3、4、5、6、7、8、9)累次可以设置参与运算的数值
(2) 鼠标单击“计算器”上的运算符按钮(+、-、*、/)选择运算符同时,保存之前的数,并情况输入栏,以便后续输入。
(3) 鼠标单击“计算器”上的“=”按钮,输出运算的结果。
(4) 鼠标单击“计算器”上的“clear”按钮,可以清除输入框内的数字。
3、系统设计
一个简易的计算器,主要由界面组件、组件事件监听器以及处理程序组成,如图2-1。实现其功能具体可分如下几个步骤:
(1) 创建Java项目(此版本为17.0.2的JDK)
(2) 创建框架、面板以及初始化
(3) 创建UI组件,并将其添加到相应面板中
(4) 注册监听器、添加事件响应逻辑
(5) 计算逻辑实现

三、 设计原理
1、包和类的说明
package start;\保存主要功能实现代码的包
package util;\保存常量的包
public class Const\自定义保存常量的类
public class calculator \自定义实现计算器主要功能的类
2、简易计算器的源代码清单
①导入组件

package start;import javax.swing.*;import util.Const;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;

②创建Const类的部分代码

public class Const {public static final int FRAME_W = 300;//得到窗体中心点public static final int FRAME_H = 300;public static final int SCREEN_W = Toolkit.getDefaultToolkit().getScreenSize().width;public static final int SCREEN_H = Toolkit.getDefaultToolkit().getScreenSize().height;public static final int Frame_X = (SCREEN_W-FRAME_W)/2;public static final int Frame_Y = (SCREEN_H-FRAME_H)/2;public static final String TITLE = "计算器";}
 ③calculator类中的部分代码
public class calculator extends JFrame implements ActionListener{/**********************北面的控件***********************/private JPanel jp_north = new JPanel();private JTextField input_text = new JTextField();private JButton c_Btn = new JButton("Clear"); /**********************中间的控件***********************/ private JPanel jp_center = new JPanel(); public calculator() throws HeadlessException{//显示窗体this.init();this.addNorthComponent();this.addCenterButton();}//初始化的方法public void init(){this.setTitle(Const.TITLE);this.setSize(Const.FRAME_W, Const.FRAME_H);this.setLayout(new BorderLayout());this.setResizable(false);this.setLocation(Const.Frame_X,Const.Frame_Y);//设置框架在屏幕的位置this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭键}//主方法public static void main(String[] args) {calculator Calculator = new calculator();Calculator.setVisible(true);}}
④添加控件和按钮的代码
//添加北面的控件public void addNorthComponent(){this.input_text.setPreferredSize(new Dimension(200,30));//设置文本框大小jp_north.add(input_text);//加文本框this.c_Btn.setForeground(Color.RED);//设置按钮颜色jp_north.add(c_Btn);//加按钮c_Btn.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){input_text.setText("");}});this.add(jp_north,BorderLayout.NORTH);//将面板加到框架北侧}//添加中间按钮public void addCenterButton(){String btn_text = "123+456-789*0.=/";String regex = "[\\+\\-*/.=]";//正则表达式this.jp_center.setLayout(new GridLayout(4,4));//4*4的布局for(int i=0;i<16;i++){//在面板中加按钮String tmp= btn_text.substring(i,i+1);JButton btn = new JButton();btn.setText(tmp);//给按钮加文字if(tmp.matches(regex)){//如果正则匹配btn.setFont(new Font("粗体",Font.BOLD,20));btn.setForeground(Color.RED);}btn.addActionListener(this);//添加按钮监听器jp_center.add(btn);}this.add(jp_center,BorderLayout.CENTER);//将面板加载框架布局的中间位置}
⑤添加事件监听器和逻辑运算代码
private String firstInput = null;private String operator = null;//给按钮添加监听事件public void actionPerformed(ActionEvent e){String clickStr = e.getActionCommand();if(".0123456789".indexOf(clickStr)!=-1){//数字输入this.input_text.setText(input_text.getText() + clickStr);this.input_text.setHorizontalAlignment(JTextField.RIGHT);}else if(clickStr.matches("[\\+\\-*/]{1}")){//运算符输入operator = clickStr;firstInput = this.input_text.getText();this.input_text.setText("");}else if(clickStr.equals("=")){//等号输入Double a = Double.valueOf(firstInput);Double b = Double.valueOf(this.input_text.getText());Double res = null;switch (operator){//运算主体case "+":res = a + b;break;case "-":res = a - b;break;case "*":res = a * b;break;case "/":if(b!=0){res = a/b;}else{this.input_text.setText("除数不能为0!请清空!");}break;}this.input_text.setText(res.toString());}}

四、 实现结果
1、程序界面
简易计算器运行界面,如图3-1所示。

图3-1 计算器运行界面
2、测试用例
(1)清除当前输入的数值,例如:计算7+23,输出结果为30.0。
(2)清除当前输入的数值,例如:计算7-23,输出结果为-16.0。
(3)清除当前输入的数值,例如:计算7*23,输出结果为161.0。
(4)清除当前输入的数值,例如:计算7/23,输出结果为0.30434782608695654。
3、运行结果
(1)输入7和23,进行加法运算,如图3-2、图3-3和图3-4所示。下面只输出结果。

图3-2 输入 7

图 3-3 输入 23

图3-4 结果显示为 30.0

(2)输入7和23,进行减法运算,如图3-5所示。

图3-5 “7-23”结果显示为 -16.0

(3)输入7和23,进行乘法运算,如图3-6所示

图3-6 “7*3”结果显示为161.9

(4)输入7和23,进行除法运算,如图3-7所示。

图3-7“7/23”结果显示为0.30434782608695654
五、 设计心得
从我的角度出发,课设的目的在于使学生养成综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生在实际场景下能力的具体训练和考察过程。伴随着科学技术的快速发展,当今计算机的应用在生活中可以说是处处都有。
在课程设计过程中我遇到许多的问题,通过网上的查询,和同学的热心帮助,最终我成功的完成了这次课程设计。在这其中我充分理解了Java面对对象的特性,并体会到Java与C\C++语言的不同之处。只有多动手,经常编写程序,才能发现我们学习上的缺陷和自己的不足,并在实践中解决这些问题,不断提高自己转化知识的能力。通过本课程的设计,我了解到理论与实践的结合非常重要,简单的理论知识远远不够,只有将所获得的理论知识与实践相结合,从理论中得出结论,才能真正服务于社会,发展我的实践技能和能力。 这次编写的程序大部分功能是通过调用各包中的方法和类来实现的,这也让我充分理解了包和类之间的关系。
由于这次编写的程序是我初次使用Java编写,会遇到很多小问题,比如说:如何保存输入的数字和下一个数进行加、减、乘、除运算。此次课程设计让我们更了解Java中的图形用户界面和它的编程方式。在完成课题的过程中,查阅了很多关于Java语言开发的资料,不断地充实了自己,学习到了很多以前没有学习到的知识,收获颇多。Java 计算器设计使得我们对所学的课程有了更为深刻的认识,使得知识得到了巩固和提高。
今后,我将会继续努力;我相信,只要有信心,有毅力,人永远不会被打败!
完整源码

package util;import java.awt.*;public class Const {public static final int FRAME_W = 300;//得到窗体中心点public static final int FRAME_H = 300;public static final int SCREEN_W = Toolkit.getDefaultToolkit().getScreenSize().width;public static final int SCREEN_H = Toolkit.getDefaultToolkit().getScreenSize().height;public static final int Frame_X = (SCREEN_W-FRAME_W)/2;public static final int Frame_Y = (SCREEN_H-FRAME_H)/2;public static final String TITLE = "计算器";}
package start;import javax.swing.*;import util.Const;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class calculator extends JFrame implements ActionListener{/**********************北面的控件***********************/private JPanel jp_north = new JPanel();private JTextField input_text = new JTextField();private JButton c_Btn = new JButton("Clear"); /**********************中间的控件***********************/ private JPanel jp_center = new JPanel(); public calculator() throws HeadlessException{//显示窗体this.init();this.addNorthComponent();this.addCenterButton();}//初始化的方法public void init(){this.setTitle(Const.TITLE);this.setSize(Const.FRAME_W, Const.FRAME_H);this.setLayout(new BorderLayout());this.setResizable(false);this.setLocation(Const.Frame_X,Const.Frame_Y);//设置框架在屏幕的位置this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭键}//添加北面的控件public void addNorthComponent(){this.input_text.setPreferredSize(new Dimension(200,30));//设置文本框大小jp_north.add(input_text);//加文本框this.c_Btn.setForeground(Color.RED);//设置按钮颜色jp_north.add(c_Btn);//加按钮c_Btn.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){input_text.setText("");}});this.add(jp_north,BorderLayout.NORTH);//将面板加到框架北侧}//添加中间按钮public void addCenterButton(){String btn_text = "123+456-789*0.=/";String regex = "[\\+\\-*/.=]";//正则表达式this.jp_center.setLayout(new GridLayout(4,4));//4*4的布局for(int i=0;i<16;i++){//在面板中加按钮String tmp= btn_text.substring(i,i+1);JButton btn = new JButton();btn.setText(tmp);//给按钮加文字if(tmp.matches(regex)){//如果正则匹配btn.setFont(new Font("粗体",Font.BOLD,20));btn.setForeground(Color.RED);}btn.addActionListener(this);//添加按钮监听器jp_center.add(btn);}this.add(jp_center,BorderLayout.CENTER);//将面板加载框架布局的中间位置}private String firstInput = null;private String operator = null;//给按钮添加监听事件public void actionPerformed(ActionEvent e){String clickStr = e.getActionCommand();if(".0123456789".indexOf(clickStr)!=-1){//数字输入this.input_text.setText(input_text.getText() + clickStr);this.input_text.setHorizontalAlignment(JTextField.RIGHT);}else if(clickStr.matches("[\\+\\-*/]{1}")){//运算符输入operator = clickStr;firstInput = this.input_text.getText();this.input_text.setText("");}else if(clickStr.equals("=")){//等号输入Double a = Double.valueOf(firstInput);Double b = Double.valueOf(this.input_text.getText());Double res = null;switch (operator){//运算主体case "+":res = a + b;break;case "-":res = a - b;break;case "*":res = a * b;break;case "/":if(b!=0){res = a/b;}else{this.input_text.setText("除数不能为0!请清空!");}break;}this.input_text.setText(res.toString());}}//主方法public static void main(String[] args) {calculator Calculator = new calculator();Calculator.setVisible(true);}}