java实训 ATM取款机.docx
《java实训 ATM取款机.docx》由会员分享,可在线阅读,更多相关《java实训 ATM取款机.docx(25页珍藏版)》请在冰豆网上搜索。
java实训ATM取款机
ATM取款机课程设计报告
姓名:
学号:
专业:
班级:
ATM取款机
1课程设计过程概述
2009年6月,JAVA游戏开发课程设计在实验楼三楼机房进行,持续时间为两周。
这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象软件开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。
这次课程设计的主要内容是独立用JAVA语言开发一个小的应用程序。
我开发了一个ATM柜员机。
2课程设计题目描述和基本设计要求
我设计的ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。
它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。
3系统需求分析
3.1功能需求分析
本ATM柜员机的主要功能如下所述:
要求使用图形用户界面。
当输入给定的卡号和密码(初始卡号为000000和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行:
●查询余额:
初始余额为50000元
●ATM取款:
每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
●ATM存款:
不能出现负存款。
●修改密码:
只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
3.2其他需求分析
(1)性能描述
实时性好、灵活性强、易于不同年龄阶段的人操作。
(2)设计约束
开发工具:
JCratorProV3.5.0
运行环境:
Windows2000以上
能实现用户所定义的各项需求。
(3)界面要求
以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。
4系统设计
4.1总体设计
我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。
其功能结构图如下所示:
图1ATM功能结构示意图
4.2ATM柜员机界面设计
我觉得一个系统的界面应该要简单明了,当然样式美观就更好了。
我设计的界面主要是由窗体组成,操作简单。
而每一个窗口则执行相应的功能。
一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。
我设计的界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。
(1)窗体的设计
窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不同功能的模块的名字,比如说查询余额,还有取款等。
相应源代码为:
WindowBox(Strings,Accountact){super(“ATM柜员机”);}、Selection(Strings,Accountact){
super(s);
}
向Frame窗口中添加组件使用add()。
例如:
button1=newButton("存款");
p1.add(button1);
this.add(p1);
每个Frame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作Frame可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是对WINDOWS_CLOSING事件做出响应,调用dispose()方法关闭窗口。
Frame也可以引发WindowsEvent类代表的窗口事件。
相应源代码为:
addWindowListener(newWindowAdapter()//窗口侦听器,以从此窗口接收窗口事件
{publicvoidwindowClosing(WindowEvente)//处理窗口关闭事件
{System.exit(0);}
});
}
(2)窗体的主要结构的设计
我所设计的窗口的主要结构的特点就是每个窗口都对应着一个特定的功能。
比如说报各种各样的错,还有各种查询余额、取款、选择服务等,所以它们都是由各种按钮和文本框,标签组成的,而联系各个窗体成为一个整体的就是各个按钮的监听事件。
所以整个设计就趋向简单化了。
为了定义各个按钮所对应的命令和操作,首先需要将各个按钮注册给实现了动作事件的监听接口ActionListener的监听者,然后为监听者定义actionPerformed(ActionEvente)方法,在这个方法中调用e.getSource()或e.getActionCommand()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。
4.3各功能模块设计
4.3.1登陆页面模块设计
与ATM柜员机打交道比较多的,也是大家对安全比较关心的问题:
密码。
所以第一个界面就是要输入密码和卡号才能继续服务。
我定义了文本框累的对象tf1,tf2。
抓药是用于输入单行的文本;文本区调用publicStringgetText()方法,获取用户想要的字符串。
用来判断输入的密码和卡号是否正确,如果不正确的话,则弹出密码或卡号错误的警告框,并用dispose()关掉窗口。
此模块相应的部分源代码为:
publicvoidactionPerformed(ActionEvente){
Accountact;
Stringcard;
Stringpwd;
act=newAccount("000000","Devil","123456",50000);//初始化
/*选择各种服务*/
if(e.getSource()==button1){
Stringnumber1,number2;
number1=tf1.getText();
number2=tf2.getText();
/*判断密码和卡号是否正确*/if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){
dispose();
/*卡号和密码都正确则进入功能选择窗口*/
Selections=newSelection("选择服务",act);
}else{
dispose();
ErrorWarnew=newErrorWarn("消息!
",act);
}
}
/*退卡*/
if(e.getSource()==button2){
System.exit(0);
dispose();
}
}
4.3.2选择服务模块设计
在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。
每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法publicvoidactionPerformed(ActionEvente)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。
其中的部分源代码为:
p.add(newLabel("请选择你要的服务"));
this.add(p);
button1=newButton("存款");
p1.add(button1);
this.add(p1);
button2=newButton("取款");
p2.add(button2);
this.add(p2);
button3=newButton("查询余额");
p3.add(button3);
this.add(p3);
button4=newButton("退出");
p4.add(button4);
this.add(p4);
button5=newButton("修改密码");
p5.add(button5);
this.add(p5);
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
button2.addActionListener(this);
button3.addActionListener(this);
button4.addActionListener(this);
button5.addActionListener(this);
//setLayout(newGridLayout());
setBounds(150,150,200,200);
setVisible(true);
validate();
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==button2){//取款
dispose();
GetBalancegb=newGetBalance("取款",act);
}
if(e.getSource()==button3){//查询余额
Queryq=newQuery("查询余额",act);
dispose();
}
elseif(e.getSource()==button4){//退出
System.exit(0);
dispose();
}
elseif(e.getSource()==button5){//修改密码
ChangePasswordcp=newChangePassword("修改密码",act);
dispose();
}
}
}
4.3.3取款模块设计
在取款模块中,和其他的界面也是同样的结构。
也是有一个文本框和一个按钮还有标签组成的。
用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。
当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。
其方法为:
if(e.getSource()==button){
/*判断余额是否为负*/
if(act.get_Money()<0){
dispose();
ErrorWarn4ew4=newErrorWarn4("消息!
",act);
}
/*判断取款数额是否小于卡里余额*/
elseif(money<=act.get_Money()){
/*取款的数额必须是100的倍数且每次最多只能取5000块*/
if((money%100!
=0)||(money>=5000)){
dispose();
ErrorWarn6ew6=newErrorWarn6("消息!
",act);
}
act.set_Balance(money);//重新设置卡里的余额
this.setVisible(false);
/*取款后就再次进入选择界面*/
Selections=newSelection("选择服务",act);
//dispose();
}elseif(money>act.get_Money()){
dispose();
ErrorWarn5ew5=newErrorWarn5("消息!
",act);
}
}
4.3.4修改密码模块设计
在修改密码模块中,首先你必须要输入你的旧密码是否正确,否则就会报错。
再一个就是要两次输入你的新密码,且两次药匹配,否则也会报错,然后再重新回到修改密码的界面。
在修改密码时用到的方法为:
/*判断旧密码是是否正确*/
if(pwd2.equals(act.get_Password())){
/*判断两次输入的密码是否匹配*/
if(pwd3.equals(pwd4)){
/*如果都正确的话就设置新密码*/
act.setPassword(pwd3);
dispose();
Selections=newSelection("选择",act);
}else{
dispose();
ErrorWarn2ew2=newErrorWarn2("消息",act);
}
}else{
this.setVisible(false);
ErrorWarn3ew1=newErrorWarn3("消息",act);
dispose();
}
4.3.5退卡模块设计
在退卡模块设计中,这个方法就更加的简单了,它只是用了if(e.getSource()==button4){//退出
System.exit(0);
dispose();
}
这个方法就可以实现了,这里就不再多说了。
4.4异常处理情况说明
(1)打开、保存文件时的异常处理
需要处理的异常:
IOException
(2)数据库访问时的异常处理
需要处理的异常:
SQLException
(3)加载类时的异常处理
需要处理的异常:
ClassNotFindException,当应用程序试图使用Class类中的forName方法通过字符串名加载类时,但是没有找到具有指定名称的类的定义。
(4)加载URL时的异常
需要处理的异常:
MalformedURLException,抛出这一异常指示出现了错误的URL。
或者在规范字符串中找不到任何合法协议,或者无法分析字符串。
5系统实现与测试
(1)打开DOS,编译运行程序后,将会看到如下的界面,如图2所示。
如果输入的密码或卡号不正确的话就会报右下图的错误。
图2主界面—登陆页面
(2)选择服务界面效果
当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。
然后就可以选择所需要的服务了。
图3选择服务界面
(3)取款界面,如图4所示。
图4取款界面
当输入的钱数不是100的倍数或每一次大于5000时就会报图5的错误。
图5输入错误1
当取款时如果超过卡里的余额的话就会报图6的错误。
图6输入错误2
(4)查询余额界面,如图7所示。
图7查询余额界面
经过测试,所有的功能基本上都实现了,而且运行正常。
6课程设计总结
6.1遇到的问题及解决办法
在此次课程设计中,我遇到了一些问题,如:
对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具体的系统是一个较大的挑战;还有对于正规开发一个系统的流程不熟悉,适应起来比较慢,编写各个模块相对应的操作时,自己感觉难以动手,这表明所学的知识不能灵活运用到实际中。
对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解,还有就是多跟精通此方面的老师和同学交流,取其精华。
对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。
6.2心得体会
在这次的学年度课程设计中,我主要运用了Java语言的界面设计、异常处理、、Awt控件、Swing控件,输入输出流等,综合运用了Java语言。
我深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。
通过这两个礼拜的课程设计我真的学到了很多的东西,当然这也和我的同学的帮助是离不开的。
好了,下面就谈一下我在这些天的体会吧:
在这次的课程设计中,主要是运用JAVA语言来编写一个小的应用程序,当然还可以用其他的技术来辅助了。
在这个小应用程序当中,我用了Java外还用了Swing控件。
输入输出流等技术。
由于以前学的不是很扎实,而且还有些知识我们都是没有学过的,这就要求我们去查相关的书籍,还有就是和同学之间的交流。
正因为这样,才锻炼了我的自学的能力,还有就是加深了我对各个知识点的认识,并且提高了我对专业的学习的兴趣,为我以后的学习打下了基础。
此外,我还感受到了面向对象语言的类库的强大的功能,掌握了运用JAVA中的类实现某些基本功能,并学会了自己查询使用类的方法,也就是要会用API文档,为以后更好的学习面向对象语言奠定了基础。
通过将近两周的努力,这次课程设计终于结束了,在这个过程当中,我学到了很多的知识,同时也感谢我的同学的帮助和指导。
在以后的学习当中,我会更加努力的学习好专业知识,并将所学的知识用于实践当中去,以便牢固掌握知识。
参考文献
[1]王萌,刘婧,来宾著.JAVA程序设计[M]北京冶金工业出版社,2004
[2]黄聪明精通JAVA2程序设计[M]北京:
清华大学出版社,2004.4
[3]王文涛,袁海燕JAVA实用程序设计100例[M]北京:
人民邮电出版社,2005.5
[4]雍俊海JAVA程序设计[M]北京:
清华大学出版社,2006.8
[5]刘宝林JAVA程序设计与案例[M]北京:
高等教育出版社,2006.11
附录
importjavax.swing.*;
importjava.awt.*;
importjavax.swing.border.*;
importjava.awt.event.*;
importjava.io.*;
/*登陆页面首窗口*/
classWindowBoxextendsFrameimplementsActionListener{
BoxbaseBox,box1,box2;
TextFieldtf1,tf2;
Buttonbutton1;
Buttonbutton2;
WindowBox(Strings){//构造方法
super(s);
tf1=newTextField(6);
tf2=newTextField(6);
box1=Box.createVerticalBox;
box1.add(newLabel("请输入你的卡号"));//输入卡号
box1.add(Box.createVerticalStrut(8));
box1.add(newLabel("请输入你的密码"));//输入密码
box2=Box.createVerticalBox();
box2.add(tf1);
//box2.add(newTextField(16));
box2.add(Box.createVerticalStrut(8));
box2.add(tf2);
//box2.add(newTextField(16));
baseBox=Box.createHorizontalBox();
baseBox.add(box1);
baseBox.add(Box.createHorizontalStrut(10));
baseBox.add(box2);
add(baseBox);
button1=newButton("确定");//加入按钮
button1.addActionListener(this);
add(button1);
button2=newButton("退卡");//退卡按钮
button2.addActionListener(this);
add(button2);
setLayout(newFlowLayout());
/*监听器*/
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
setBounds(120,125,200,175);
setVisible(true);
}
publicvoidactionPerformed(ActionEvente){
Accountact;
Stringcard;
Stringpwd;
act=newAccount("000000","Devil","123456",50000);//初始化
/*选择各种服务*/
if(e.getSource()==button1){
Stringnumber1,number2;//输入的两个卡号和密码的变量
number1=tf1.getText();
number2=tf2.getText();
/*判断两次输入的卡号和密码是否正确*/if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){
dispose();
Selections=newSelection("选择服务",act);
}else{
dispose();
ErrorWarnew=newErrorWarn("消息!
",act);//报输入密码或卡号不正确
}
}if(e.getSource()==button2){
System.exit(0);
dispose();//退出
}
}
}
/*主函数*/
classATM{
publicstaticvoidmain(String[]args){
newWindowBox("登录页面");
}
}
/*选择服务*/
importjava.awt.*;
importjava.awt.event.*;
classSelectionextendsFrameimplementsActionListener{
Buttonbutton1,button2,button3,button4,button5;
Panelp1=newPanel();
Panelp2=newPanel();
Panelp3=newPanel();
Panelp4=newPanel();
Panelp5=newPanel();
Panelp=newPanel();
Account