java毕业课程设计计算器报告书模版软件工程文档格式.docx
《java毕业课程设计计算器报告书模版软件工程文档格式.docx》由会员分享,可在线阅读,更多相关《java毕业课程设计计算器报告书模版软件工程文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
![java毕业课程设计计算器报告书模版软件工程文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/28/59d1195a-67eb-444e-b04f-49d382cc818b/59d1195a-67eb-444e-b04f-49d382cc818b1.gif)
设计一个图形界面(GUI)的计算器应用程序,完成简单的算术运算、设计的计算器应用程序可以完成加法、减法、乘法、除法和取余运算。
用鼠标单击相应的数字键和运算符号键,然后单击=按钮,窗口上方的文本框将会显示计算出来的结果,要将文本编辑框清零,可单击清零按钮。
二、需求分析
1、状态定义
2、1,刚启动计算器时的状态:
开始计算按键开始键"
ON"
3、2.清零:
计算刚启动时,或者任何时候键入了清零键,计算器所处的状态。
4、2.一个操作数:
输入了一个操作数时计算器所处的状态,如键入“2”后的状态,此时操作数为“2”,或者依次键入“3”、“8”后的状态,此时操作数为“38”。
5、3.运算结果:
键入了“=”键后计算器所处的状态,如依次键入“3+5=”之后计算器的状态。
在此状态如果输入数字,输入的数字将作为第一个操作数,开始一次新的计算。
6、4.一个操作数和一个两元符号:
输入了一个操作数和加减乘除中的一个键后计算器的状态,如依次输入“2+”或“31×
5=÷
”之后计算器的状态。
7、5.操作数两元符操作数:
输入了一个操作数、一个加减乘除符号和另一个操作数后计算器所处的状态,如依次键入“30÷
4”或“3+5=÷
5”后计算器的状态。
8、6.操作数两元符运算结果:
输入了一个操作数、一个加减乘除符号和另一个操作数后紧接着键入开方键计算器所处的状态。
9、7.错误:
执行非法计算后所处的状态,如执行÷
0计算或者对负数的开方计算后的状态。
比如60后计算的结果是“0不能做除数”。
10、二、本计算器具有以下功能:
用表说明
状态
操作
计算器响应
结果状态
清零
键入数字键,如1
显示键入的数字,操作数=键入的数字
一个操作数
键入减号键
相当于键入了-0,但负号不显示,只显示0。
键入除减号键和数字键以外的键
忽略键入的键,仍保留清零状态
键入数字键
显示新操作数,新操作数=当前操作数*10+键入的数字
键入回退键
显示新操作数,新操作数=当前操作数除以10取整
清屏键
显示0,但操作数不变
键入清零(任何状态下,键入清零键都会到清零状态下,以下的状态不再重复)
键入加减乘除中任意键
仍显示操作数,跳转到状态“一个操作数和一个两元符号”
一个操作数和一个两元符号
键入开方键
对操作数执行开方运算,显示运算结果
运算结果
键入=键
显示操作数,如果操作数为负数,显示负号和操作数,如“-32”
键入%
忽略,不做任何处理
键入加减乘除之一
用新操作符替换原操作符,如当前是“30+”,接着键入“÷
”则变为“30÷
”
键入=
如果操作符为加法,则加0,显示结果;
如果操作符为减法,显示为负数;
如果操作符为乘法,显示为第一个操作数相乘,如键入12*=,结果为144;
如果键入为除法,结果为1。
第一个操作数回退一位,操作符保持不变,如:
123+,键入回退键后显示12,操作符仍然为+
执行开方操作,操作符保持不变;
例如:
当前是“9+”,键入开方键则显示3。
键入数字键、小数点
键入的为第二个操作数,例如:
当前是“9+”,键入8,显示为8
操作数2元操作符操作数
结果作为一个操作数,例如:
当前是“45”,键入*,显示仍然是45,操作符是*,将执行乘法。
键入数字和小数点
清除结果,键入的数值作为新的操作数;
例如当前是“16开方”后的运算结果,显示是“4”;
键入56,显示“56”。
键入%、=键
显示结果。
如:
当前是“16+开方”后的运算结果,键入=,显示的结果为20。
执行16+16开方的运算;
当前显示的结果9,或者任意其它值,输入%,运算结果显示“0”。
运算结果再执行开方运算
结果回退一位,如当前显示“123”,键入回退键,显示“12”。
先执行前面的计算,显示结果并记下下一个操作符;
起始状态键入的是12*6,然后键入+,则显示72
例如输入:
12+3%,结果0.36;
12-3%,结果0.36;
12*3%,结果0.36;
12÷
3%,结果0.36;
一律按照乘法计算。
执行运算,得出结果。
例如当前是键入了“1+2”,再键入“=”,显示“3”。
键入数字键、回退键、小数点键
等待键入第二个操作数完毕
开方键
第二个操作数开方
操作数2元操作符运算结果
操作符为除号,第二个操作数为0;
负数开方
不正确的运算
错误
键入数字键、小数点键
忽略开方步骤,直接进行操作数与键入数字进行操作符的运算。
4+9开方32结果为36;
5-9开方65结果为-60。
计算结果。
12+9开方=,先计算9开方=3,再12+3=15;
12*64开方=,结果96。
12+9开方,再键入%结果0.36;
12-9开方,再键入%结果0.36;
12*9开方,再键入%结果0.36;
9开方,再键入%结果0.36;
得到运算结果,并记忆操作符;
例如12+9开方,键入+得到15+。
键入开方、回退键
运算结果再次执行开方或者回退
清零以外的任何键
忽略,计算器不做任何响应
清零键
三、设计思路
本应用程序继承自框架类(Frame),此程序使用Frame布局管理器GridBagLayout,将单行文本框加入到0行0列,包含各种按钮的面板Panel3采用4行5列的网格布局,然后将数字按钮和运算符按钮以及控制按钮添加到面板中。
同时注册按钮事件监听器。
Buttonb1=newButton();
b1.addActionListener(this);
b2.addActionListener(this);
事件监听器中的事件处理方法voidactionPerformed(ActionEventevt)完成主要的按钮事件的处理。
事件处理分以下几种情况:
数字按钮事件(”0”,”1”,”2”…”8”,”9”)、运算符按钮事件(”+”,”-“,”*”,””,”%”)、正负号按钮事件(”+-“)、小数点按钮事件(”.”)、等号按钮事件(”=”)、求倒按钮事件(”1x”)、退格按钮事件(”退格”)、清楚按钮事件(“C”)。
在事件处理。
触发按钮事件时,要进一步分析,是重新开始计算时触发的按钮事件还是计算中间触发的按钮事件。
四、详细设计
一import语句,使用import语句引入java.awt.,java.awt.event.,javax.swing.,
Javax.swing.border包中所有的类。
Java.awt.event.*引入系统事件类包。
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.border.*;
二实现动作事件监听接口
publicclassJiSuanQiextendsJFrameimplementsActionListener
注册事件源的动作监听者
menuitem1.addActionListener(this);
menuitem2.addActionListener(this);
menuitem3.addActionListener(this);
注册事件监听器
b1.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
b6.addActionListener(this);
b7.addActionListener(this);
b8.addActionListener(this);
b9.addActionListener(this);
b10.addActionListener(this);
b11.addActionListener(this);
b12.addActionListener(this);
b13.addActionListener(this);
b14.addActionListener(this);
b15.addActionListener(this);
b16.addActionListener(this);
b17.addActionListener(this);
b18.addActionListener(this);
b19.addActionListener(this);
b20.addActionListener(this);
b01.addActionListener(this);
b02.addActionListener(this);
b03.addActionListener(this);
b04.addActionListener(this);
b05.addActionListener(this);
三组件的布局管理
采用了AWT布局管理器当中最复杂的,同时功能也是最强大的GridBagLayout布局方式.
GridBagLayoutg=newGridBagLayout();
GridBagConstraintsc=newGridBagConstraints();
添加了三个面板进行组件布局
panel1=newJPanel();
panel2=newJPanel();
panel3=newJPanel();
面板penel1中包括显示操作结果的文本区,penel中包括退格按钮"
Backspace"
,全部清除按钮"
CE"
,本次清除按钮"
C"
,开始按钮"
,关闭按钮"
OFF"
Penel3中包括数字按钮"
0"
"
1"
2"
3"
4"
5"
6"
7"
8"
9"
小数点按钮"
."
,除号按钮("
"
),求根按钮
sqrt"
,乘号按钮"
*"
,求余按钮"
%"
,减号按钮"
-"
,求倒数按钮"
1x"
,正负号按钮"
+-"
),加号按钮"
+"
等号按钮"
="
设置Penel1在0行0列即开始的地方GridBagConstraintsc=newGridBagConstraints();
c.gridx=0;
c.gridy=0
设置并添加penel2面板按钮
panel1.add(panel2);
GridBagLayouti=newGridBagLayout();
GridBagConstraintsj=newGridBagConstraints();
panel2.setLayout(i);
j.gridx=0;
j.gridy=0;
j.gridwidth=68;
j.gridheight=40;
j.fill=GridBagConstraints.BOTH;
j.insets=newInsets();
j.weightx=3.0;
j.weighty=3.0;
i.setConstraints(b04,j);
panel2.add(b04);
j.gridx=70;
i.setConstraints(b01,j);
panel2.add(b01);
j.gridx=140;
i.setConstraints(b02,j);
panel2.add(b02);
j.gridx=210;
i.setConstraints(b03,j);
panel2.add(b03);
j.gridx=280;
i.setConstraints(b05,j);
panel2.add(b05);
c.gridy=120;
c.gridheight=80;
c.weighty=10.0;
Penel3面板设置为4行5列共20个网格
panel3.setLayout(newGridLayout(4,5));
按布置好的方式添加按钮
panel3.add(b1);
panel3.add(b2);
panel3.add(b3);
panel3.add(b4);
panel3.add(b5);
panel3.add(b6);
panel3.add(b7);
panel3.add(b8);
panel3.add(b9);
panel3.add(b10);
panel3.add(b11);
panel3.add(b12);
panel3.add(b13);
panel3.add(b14);
panel3.add(b15);
panel3.add(b16);
panel3.add(b17);
panel3.add(b18);
panel3.add(b19);
panel3.add(b20);
四在窗口中加入菜单
定义一个菜单JMenuBarmenubar;
定义菜单组件各个部分的对象JMenumenu1,menu2,menu3;
定义对象下的菜单项
JMenuItemmenuitem1,menuitem2,menuitem3,menuitem4,menuitem5;
以下生成菜单组件对象
menubar=newJMenuBar();
menu1=newJMenu("
File"
);
menu2=newJMenu("
Edit"
menu3=newJMenu("
Help"
menuitem1=newJMenuItem("
menuitem2=newJMenuItem("
menuitem3=newJMenuItem("
Close"
menuitem4=newJMenuItem("
Copy"
menuitem5=newJMenuItem("
添加菜单条"
,"
.菜单File中有菜单项"
.菜单"
中菜单项"
panel1.add(menubar);
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
menu1.add(menuitem1);
menu1.add(menuitem2);
menu1.addSeparator();
menu1.add(menuitem3);
menu2.add(menuitem4);
menu3.add(menuitem5);
五处理按钮事件
if(e.getSource()==menuitem1){label.setText(a);
b=true;
}
elseif(e.getSource()==menuitem2){label.setText("
b=false;
elseif(e.getSource()==menuitem3){System.exit(0);
elseif(e.getSource()==b04){label.setText(a);
elseif(e.getSource()==b05){label.setText("
if(b){
if(e.getSource()==b1){
if(label.getText().equals("
)){label.setText("
else{
if(!
c){label.setText(label.getText().concat("
));
else{label.setText("
c=false;
n=0.0;
}
}
if(e.getSource()==b2){
if(e.getSource()==b3){
if(e.getSource()==b6){
if(e.getSource()==b7){
if(e.getSource()==b8){
if(e.getSource()==b11){
if(e.getSource()==b12){
if(e.getSource()==b13){
if(e.getSource()==b16){
)){labe