实现计算器功能的应用程序文档格式.docx
《实现计算器功能的应用程序文档格式.docx》由会员分享,可在线阅读,更多相关《实现计算器功能的应用程序文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
1.1课程设计的目的
计算器在我们的生活中常常会使用到,本次课程设计,通过界面以及其中的逻辑处理,完成了四则运算的处理。
通过awt包或者swing包中的界面设计部分对界面设计的细节可以有更多的了解。
利用面向对象的思想,将各个组件的事件响应分别用不同的类表达出来。
面向对象的思想从很大程度上可以让程序的思路更加清晰,而且可重用性很高。
对于具有相同事件响应的组件则可以调用相同的类来处理事件。
除此之外,利用栈的知识来解决运算符优先的问题也让我们对java中的栈有了更多的了解。
1.2课程设计的任务与要求
a.使用Java的awt包或Swing包的类库设计图形界面的计算器
b该计算器能够完成加减乘除的四则混合运算(注意运算优先级)
c使用图形界面中的事件委托机制来处理事件响应
2需求分析
2.1功能需求
用户能够完成四则混合运算+、-、*、/,并且计算器能够自动的识别运算符的优先级,根据输入的运算公式,自动计算出相应的结果。
同时完成计算器中的backspace、ce按钮,能够完成消除或者删除的功能。
2.2出错处理
当用户如果按下的是除零的操作,显示框将显示“被除数不能为0”。
当用户如果连续多次按下运算符,计算器自动记忆第一次运算符,并且做防连续输入相同的运算符或者是不同的运算符。
当用户在同一个数据中多次输入小数点,计算器能够自动判断小数点重复,自动只记忆第一个小数点。
当用户在同一个数据中输入多个负号,计算器能够自动做重复检查,不显示多余的负号。
当用户在使用backspace功能删除越界数据时候,计算器自动做相应处理。
2.3数据处理
在程序的起始,建立了两个栈,分别用来存储操作数和操作符。
在计算器的核心运算代买中,运用这两个栈来实现算法中的优先级的处理,使用“#”号来标记目标计算公式的结束。
目标计算公式通过计算器的键盘实现输入,当按下“=”号之后,计算器通过调用计算器核心函数来实现数据的处理。
2.4系统环境要求
操作系统:
WINXP或更高版本
开发语言:
java
开发工具:
eclipse
3概要设计
3.1界面及功能描述
(1)界面布局。
创建一个面板,先将所有按钮:
所有数字键和运算符键等放在面板上,采用网格布局,具体设计为4行,4列的网格,十六个格子。
再添加一个1行4列的网格布局来放置三个功能键:
归零,退格,输出。
然后,对以上两个面板,采用BorderLayout布局,将按键面板放在计算机的中部,功能键面板放右上角,作为一个新的面板。
最后,将文本框放在左上角,新面板放中央,采用边界布局管理器,做为界面的整体布局,这样界面布局就搞定了。
(2)按退格键,将返回到前一次输入状态。
(3)按归零键,输入的数字第一个数字为零。
3.2简要的设计流程
图3.1简要的设计流程图
4详细设计
4.1计算器界面的设置
本程序的实现使用了swing和awt两个包,主题程序界面按键根据微软计算器的布置界面进行设置,采用比较人性化的常规按键排布。
返回计算结果的“=”号键使用了两倍于普通按键面积的设计,使的击中的概率更加大。
整体界面是采用了BorderLayout布局,通过4个panel进行布局的详细划分,panel3用来存储位于panel4左下角的GridLayout(1,2,4,4)布局,panel1、panel2、panel3分别用来表示BorderLayout的上中下三个模块。
Panel1中添加了一个Labeldisplay,display用来作为显示器,实时的显示输入和计算的数据。
其中display需要设置为右对齐和只读属性。
Panel2中添加数字输入键和基本操作符键,panel采用了GridLayout布局,将整个panel2平分为4*4个空间,其中,数字键采用了15磅字体和蓝色文字,操作符采用了15磅字体和红色文字,是的界面更加显眼和便于区分。
Panel4中首先划分为GridLayout(1,2,4,4),在Panel4中,再次使用了GridLayout(1,2,4,4)将panel4的左侧一分为二,左边为panle3,这个的基础上程序往panel3中添加了backspace和ce两个按键,在Panel4的右侧单元格中添加了“=”号按钮,这个时候的“=”号就是相当于两个普通按钮的长度和大小。
整个程序界面的设计工作基本完成。
4.2类层次中各个类的描述
本次课程设计一共分为了5个类,每个类都各自完成不同的功能。
●classMyCalculator:
类MyCalculator是主类,含有main()函数,通过newCalFrame()来运行程序。
●classCalFrame:
类CalFrame完成的功能是计算器界面的设计,并且将每个组件都添加事件响应。
具体的事件响应操作将在其他的类中逐一实现。
●classHandleWin:
点击关闭windows窗口的控制类。
●classHandleNum:
字符串输入控制类。
●ClassHandleEqual:
等号出发事件的响应机制类。
类的属性包括:
0-9的数字键
JButtonnum1;
JButtonnum2;
JButtonnum3;
JButtonnum4;
JButtonnum5;
JButtonnum6;
JButtonnum7;
JButtonnum8;
JButtonnum9;
JButtonnum0;
+-*/四个控制按钮
JButtonplus;
JButtonminus;
JButtonmutiply;
JButtondivide;
.+/-两个按钮
JButtonpoint;
JButtonsign;
Backspacece=三个按钮
JButtonbs;
JButtonce;
JButtonequal;
将这些按钮按照一定的顺序添加到现实面板中。
Panelp1,p2,p3,p4;
//为了布局的方便,利用borderLayout,通过几个面板来添加
Stack<
Double>
OPNT=newStack<
();
//用来记录操作数的栈
String>
OPTR=newStack<
//用来记录操作符的栈,栈底压入“#”,取到了“#"
代表已到栈底
booleanpointswitch=true;
//小数点开关
booleanoprateswitch=false;
//运算符开关
booleansiginswitch=true;
//正负号开关
方法:
publicvoidactionPerformed(ActionEvente)
当按下了控制按钮,根据搜索控制开关来确定能否继续添加,各个相应的处理机制。
publicdoublesegmentation(StringmyString)
字符串优先级计算代码的核心函数。
publicintcompare(charch1,charch2)
1值为ch1大于ch2;
-1为ch1小于ch2;
0为ch1等于ch2
publicdoubleoprate(doublea,charb,doublece)
通过参数b来判断加减乘除
5系统运行测试
5.1初始运行界面
图5.1初始运行界面
5.2按键测试
图5.2按键测试
5.3运算符重复输入测试
图5.3运算符重复输入测试
5.4被除数为0的测试
图5.4被除数为0的测试
5.5backspace按键越界操作
图5.5backspace按键越界操作
5.6优先级程序计算
图5.6优先级程序计算
5.7输出测试
图5.7输出测试
6总结
这个学期的java课程设计实现计算器功能的应用程序对我来说是一个不断学习,逐步完善的过程。
开始的时候拿到题目看到只有四则混合运算就理所当然的认为应该是非常简单的的一个程序而已。
首先开始了程序的界面的设计,并且将一些简单的按钮的事件响应完成了,剩下了运算符优先级的问题以及数据的处理问题。
于是在同学的帮助下利用正则表达式来完成输入字符串的切割,但是如果自己一个人单独做的话,对于题目中的数据处理的问题一时不知道该如何与正则表达式连接上。
最后我还是选择用栈来处理。
这个过程让我明白了学习知识的时候实践与理论之间是有很大的差异的。
应用能力我还有待加强。
于是我开始熟悉栈的使用。
在以前的学习中接触过栈,这次的使用思想是一样的,只需要在了解一下java中的相关一些函数便可。
但实际在写程序的过程中,由于有一些特殊情况的考虑与进出入栈的联系,还是碰到了一些问题。
但在后来我慢慢的整理清楚思路以后,逻辑列清楚了,便将这些问题解决,逐步的将各项功能都完善。
当然目前我的计算器也只是完成了四则混合运算,实际上还应该有很多功能可以添加入计算器的。
本次java课程设计也让我明白只要我一步步去做,那么程序功能便会不断强大。
在以后的学习中,多加强自己的动手实践能力。
参考文献
[1]朱福喜.《Java语言程序设计》(第二版).科学出版社
[2]陈国君等.《Java程序设计基础》(第二版).清华大学出版社
[3]Deitel.《Java大学基础教程》(第六版).电子工业出版社
[4]MaryCampione.《Java语言导学》(第四版).机械工业出版社
[5]Y.DanielLiang.《Java语言程序设计基础篇》(第六版).机械工业出版社
[6]KathySierra.《HeadFirstJava》(第二版).东南大学出版社
[7]宁书林等,《java2技能百练》,中国铁道出版社,2004
[8]於东军[等]著,《Java程序设计与应用开发》,清华大学出版社,2005
附录(源代码)
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
publicclassMyCalculator{
publicstaticvoidmain(String[]args){
newCalFrame();
}
}
classCalFrameextendsJFrame{
Stringopnt,optr;
Stack<
Labeldisplay;
//显示
JButton[]num=newJButton[10];
//按键设计
JButtonplus;
JButtonminus;
JButtonmutiply;
JButtondivide;
JButtonbs;
JButtonpoint;
JButtonsign;
JButtonlbracket;
JButtonrbracket;
Panelp1,p2,p3,p4;
Stringdisp="
"
;
//用户输入的表达式
Stringresult="
;
//用户输入的字符串
CalFrame(){
OPTR.push("
#"
);
for(inti=0;
i<
=9;
++i){
num[i]=newJButton(String.valueOf(i));
}
plus=newJButton("
+"
plus.setForeground(Color.red);
plus.setFont(newFont("
Dialog"
1,15));
minus=newJButton("
-"
minus.setForeground(Color.red);
minus.setFont(newFont("
mutiply=newJButton("
*"
mutiply.setForeground(Color.red);
mutiply.setFont(newFont("
divide=newJButton("
/"
divide.setForeground(Color.red);
divide.setFont(newFont("
equal=newJButton("
="
equal.setForeground(Color.red);
equal.setFont(newFont("
point=newJButton("
."
point.setFont(newFont("
sign=newJButton("
+/-"
sign.setFont(newFont("
bs=newJButton("
backspace"
bs.setForeground(Color.red);
bs.setFont(newFont("
1,8));
ce=newJButton("
ce"
ce.setFont(newFont("
p1=newPanel();
p1.setLayout(newBorderLayout());
display=newLabel("
0."
Label.RIGHT);
display.setBackground(Color.white);
p1.add(display,BorderLayout.NORTH);
p2=newPanel();
p2.setLayout(newGridLayout(4,4,4,4));
p2.add(num[7]);
p2.add(num[8]);
p2.add(num[9]);
p2.add(divide);
p2.add(num[4]);
p2.add(num[5]);
p2.add(num[6]);
p2.add(mutiply);
p2.add(num[1]);
p2.add(num[2]);
p2.add(num[3]);
p2.add(minus);
p2.add(num[0]);
p2.add(sign);
p2.add(point);
p2.add(plus);
p3=newPanel(newGridLayout(1,2,4,4));
p3.add(bs);
p3.add(ce);
p4=newPanel(newGridLayout(1,2,4,4));
p4.add(p3);
p4.add(equal);
setTitle("
实现计算器功能的应用程序"
setLayout(newBorderLayout());
add(p1,BorderLayout.NORTH);
add(p2,BorderLayout.CENTER);
add(p4,BorderLayout.SOUTH);
setVisible(true);
pack();
setResizable(false);
setBounds(600,350,300,230);
addWindowListener(newHandleWin());
num[i].setForeground(Color.blue);
num[i].setFont(newFont("
num[i].addActionListener(newHandleNum(this,i));
plus.addActionListener(newHandleNum(this));
minus.addActionListener(newHandleNum(this));
mutiply.addActionListener(newHandleNum(this));
divide.addActionListener(newHandleNum(this));
point.addActionListener(newHandleNum(this));
sign.addActionListener(newHandleNum(this));
bs.addActionListener(newHandleNum(this));
ce.addActionListener(newHandleNum(this));
equal.addActionListener(newHandleEqual(this));
}
classHandleWinextendsWindowAdapter{//关闭计算器
publicvoidwindowClosing(WindowEvente){
(e.getWindow()).dispose();
System.exit(0);
booleanpointswitch=true;
booleanoprateswitch=false;
booleansiginswitch=true;
//
classHandleNumimplementsActionListener{//字符串的输入
JFramemy_Num;
intitemp=0;
HandleNum(JFramef,inta){
my_Num=f;
itemp=a;
HandleNum(JFramef){
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==num[itemp]){//输入数字字符
oprateswitch=true;
siginswitch=false;
disp=disp+itemp;
display.setText(disp);
}
if(oprateswitch&
&
e.getSource()==plus){//输入加号
pointswitch=true;
oprateswitch=false;
siginswitch=true;
disp=disp+"
e.getSource()==minus){//输入减号
e.getSource()==mutiply){//输入乘号
e.getSource()==divide){//输入除号
pointswitch==true&
e.getSource()==point){//输入小数点
pointswitch=false;
if(siginswitch&
e.getSource()==sign){//输入负号
—"
if(e.getSource()==bs){//点击backspace
if(!
disp.isEmpty()){
disp=disp.substring(0,disp.length()-1);