第一篇:ATM取款机常见故障及解决方法
一、ATM取款机常见故障及解决方法
ATM常见故障如能及时排除,可减少停机时间,因此遇到下列故障可按照相应步骤处理。
(一)用户打印机问题及处理方法
1、用户凭条卡在面板内
(1)检查凭条出口是否有异物堵塞;
(2)检查面板有无受力变形;
(3)拉出打印机检查传送部分有无异常,推入打印机重试;
(4)如仍卡纸, 需进行专业维修。
2、打印纸堵塞在切纸位置
(1)松开传送部件;
(2)拉动蓝色手柄,使打印头露出;
(3)清除堵塞的纸;
(4)查看打印机控制板上有无黄灯常亮;
(5)如无,重试打印机;
(6)如黄灯长亮,需进行专业维修。
3、凭条双倍长度
(1)检查打印纸上的黑色标记是否清晰;
(2)检查黑标方向是否正确;
(3)重试,如仍不正常, 需进行专业维修。
(二)流水打印机问题及处理方法
4、打印纸堵塞在切纸位置
(1)清除堵塞的纸;
(2)查看打印机控制板上有无黄灯常亮;
(3)如无,重试打印机;
(4)如黄灯长亮,需进行专业维修。
(三)读卡机问题及处理方法
1、读卡机堵塞
(1)按照关机程序关机;
(2)取出读卡机;
(3)查看读卡机内有无异物,有则取出;
(4)开机,执行读卡机清洗程序;
(5)重试读卡机。
2、卡不能插入
(1)按程序关机;
(2)取出读卡机,查看有无异常;
(3)如流水打印机上无读卡机故障信息,检查面板插卡口有无异常;
(4)检查读卡机口有无异常;
(5)装回,开机重试;如仍不正常, 需进行专业维修。
(四)吐钞机问题及处理方法
1、出钞不整齐
(1)拉出吐钞机,检查送钞皮带是否脱落;
(2)检查出钞口有无异常(如里面低,外面高);
(3)检查钱箱内钱币是否整齐;
(4)重试, 如仍不正常, 需进行专业维修。
2、只有挖钞声,钱不吐出来
(1)检查钱箱内是否有钱;
(2)检查废钞箱内的钱币质量;
(3)如上述正常,做加钞程序中的吐钞机诊断;
(4)如诊断不能通过,将钱箱换一个通道;
(5)再做吐钞机诊断;
(6)如仍不正常, 需进行专业维修。
3、吐钞机报“钱币堵塞”
(1)按程序关机;
(2)拉出吐钞机;
(3)查看有无钱币卡在上面传送带;
(4)查看有无钱币卡在侧面传送带;
(5)取出钱箱,查看通道内有无钱币堵塞;
(6)清除堵塞的钱币;
(7)重新装回钱箱,开机重试;
(8)如故障依旧,检查传感器;
(9)更换传感器或进行专业维修。
4、废钞箱卷帘门裂开
(1)取出废钞箱卷帘门;
(2)如仅前三条裂开,裁下裂开的那条;
(3)装回卷帘门,即可;
(4)如已裁下三条以上,更换。
(五)其它故障
1、通讯不通
(1)按程序关机;
(2)检查通讯线是否插好;
(3)开机,注意系统上电启动时有无提示相关信息;
(4)请电信局检查线路;
(5)进行专业维修。
2、屏幕无显示
(1)关机;
(2)检查显示信号线是否接好;
(3)开机,观测是否有系统开机自检信息;
(4)如有,表明硬件无问题,重装软件;
(5)如无, 进行专业维修。
二、存取款机常见故障的原因及解决方法
1、磁条读写器吞卡
磁条读写器吞卡是由于以下四种情况造成:
(1)主机命令
(2)弹卡超时不取走
(3)用户操作超时
(4)插卡动作不当造成。
如果是主机命令或弹卡超时造成吞卡,客户会得到一张打印的客户凭条,凭条上有该卡的卡号和吞卡原因。
如果是由于插卡动作不当或操作超时不取造成吞卡,客户也同样能够得到一张客户凭条,但该凭条上面没有卡号和吞卡原因。
2、存款模块回收箱不空
当回收箱不空时,存款交易暂停,以避免其他客户操作而产生的帐务不清。以下情况存款进入回收箱。
有识别不出的钞票或用户中途取消操作的情况下,存款退回到入钞口,如果客户没有及时取走,机器将把入钞口上全部钞票打入回收箱。
客户钞票识别完毕,提交主机,在等待主机应答超时的情况下,把客户提交的存款打入回收箱,其面值总额应该与客户得到的客户凭条相符。
3、存款模块卡钞票
当钞票在中途卡住,存钞模块停止工作,只有排除故障之后,才能初始化继续。当卡住钞票,整个流水线全部停止。除了在钞票卡住的部位,请检查其前后流水线上是否有钞票在中间。如果有则请旋转绿色旋钮,把钞票取出。这时如果需要继续正常使用存款模块则需要重新启动应用,或者清除存款箱。
4、取款模块钞箱安放不当
取款模块的钞箱分为两种,回收箱和出钞箱,在使用出钞模块之前需要对各出钞箱进行序号设置,为钞箱编号。以尽量减小钞箱装错的可能性。当钞箱安装没有到位,或者顺序不符,系统能够检测到,并提示取款钞箱出错。这时需要重新安装钞箱,直到正确为止。
5、客户插卡后没有可做交易
金库门打开的情况下,只能进行管理员卡类交易。请检查金库门是否关闭好。
系统只有查询交易可以进行
系统缺少客户凭条打印纸,则仅提供查询服务。
6、没有存款功能
存款模块初始化失败,请拧动管理员钥匙,检查设备状态。
存款模块回收箱中有钞票,请检查存款模块中的回收箱。
存款功能在系统中没有设置,拧动管理员钥匙,修改系统参数为“存取款”或“仅存款”。
7、没有取款功能
取款模块初始化失败。
钞箱中钞票数量低于最低限制数量。
取款功能在系统中没有设置,拧动管理员钥匙,修改系统参数为“存取款”或“仅取款”。
三、存折补登机常见故障及处理方法
(一)存折打印机故障
1、磁条读写故障,表现为磁条读写失败
(1)原因分析1:有异物(如纸削)阻塞磁头的水平移动
解决方法:清除异物
(2)原因分析2:磁条读写磁头脏
解决方法:用异丙醇和酒精或随机配送的清洁卡清洗磁头
(3)原因分析3:打印机磁道读写参数与软件系统不匹配
解决方法:更改打印机的磁条读写参数或软件系统参数
(4)原因分析4:磁条读写电路故障
解决方法:更换磁条读写板
(5)原因分析5:磁条读写机械部分故障
解决方法:更换磁条读写组件
2、卡纸(折)、纸(折)进出困难或歪斜
(1)原因分析1:有异物阻塞进出纸槽
解决方法:清除异物
(2)原因分析2:打印机机架故障
解决方法:调整机架
3、打印机无打印动作,常见故障为放入存折后打印机无打印动作
(1)原因分析1:存折无补登项目
解决方法:无需处理
(2)原因分析2:打印机通信接口坏
解决方法:检查联机电缆是否损坏,如损坏更换之;更换打印机主板
(3)原因分析3:主机网络通信故障
解决方法:检查网络通讯部分
(4)原因分析4:多用户卡故障
解决方法:检查在Windows系统内多用户卡的IRQ值是否于BIOS设置值一致(推荐IRQ值取5);更换多用户卡
不能进折或打印头撞墙,或者开机打印头来回移动
原因分析:由于长时间使用,灰尘过多造成光电参数丢失
解决方法:此时请设置光电参数。具体操作如下:
(1)关闭电源,打开打印机的上盖;
(2)将打印头移到打印机的最左边;
(3)按住面板上的三个键,同时打开电源,机械动作停止后,关上机盖;
(4)按操作面板上的STATION1键两次,此时READY灯停止闪烁,并发出蜂鸣声;
(5)在进纸器槽中插入一张A4的纸并按一次STATION2键;
(6)当打印机退出纸张后,再插入一张A4纸,打印机打印出光电参数值。
(二)触摸屏故障
1、触摸屏无反映,常见故障为触摸屏幕鼠标无任何反映
(1)原因分析1:更换、移动、插拔触摸屏的联机接口后会造成触摸屏失效,这是由于触摸屏属于非即插即用产品,因此硬件上的改变都有可能引起触摸屏失效
解决方法:重新安装触摸屏驱动程序
(2)原因分析2:重新安装、克隆操作系统,原因分析如上
解决方法:同上
(3)原因分析3:触摸屏硬件故障
解决方法:更换触摸屏控制卡、联机电缆
2、触摸屏不灵敏,常见故障为需要大力触摸才有反映
原因分析:屏幕灰尘过多,或者有水滴在屏幕上都会造成不灵敏
解决方法:清洁屏幕
触摸屏触摸的位置发生偏移
解决方法:打开控制面板,调用校准程序,根据提示点击3个圆点进行校准
(二)金属键盘故障
1、键反应过灵敏,当按下某一数字键时幕显示输入两个或多个相同数字
原因分析:在系统里设置按键重复时间过短
解决方法:打开“控制面板”里的“键盘”项,如图所示把红色部分按照图中调整即可
2、按键经常无反应,常见故障为多个数字按键无反应
(1)原因分析1:键盘使用时间长,键盘膜片失效
解决方法:更换键盘膜片
(2)原因分析2:键盘电缆松脱或者损坏
解决方法:检查接口是否松脱,电缆是否损坏,更换故障部分
3、整个键盘失效
(1)原因分析1:键盘控制板故障
解决方法:更换键盘控制卡
(2)原因分析2:PC机的键盘PS/2接口坏
解决方法:更换PC主板
(三)PC机及系统其他故障
1、不能开机
(1)原因分析1:PC机电源坏,常见故障为开机时CPU风扇不转动
解决方法:更换PC电源
(2)原因分析2:PC机主板、CPU、内存及其他板卡故障都可能造成不能开机
解决方法:用替换法确定损坏部件进行更换
打开主机电源后PC机不能自动开启,需手动开机
原因分析:BIOS中未设置自动上电开机功能
解决方法:手动开机进入BIOS设置界面,进入“Integrated Peripherals”(整合周边设备)设置项,把选项“Power on Function”设置为“BUTTON ONLY”,把选项“PWRON After PWR-Fail”设置为“On”。(注:上述操作主要针对微星的主板MS-6153,其他型号主板的设置请参考相应主板的说明书)
2、不能进入操作系统或业务画面
(1)原因分析1:硬盘产生坏区,无法正常启动Windows系统
解决方法:格式化C盘,重新安装Windows系统和应用程序
(2)原因分析2:系统中病毒
解决方法:使用杀毒软件清除病毒。
第二篇:uml 描述ATM自动取款机系统
ATM自动取款机系统
ATM自动取款机(automatic teller machine)是银行在银行营业大厅、超市、商业机构、机场、车站、码头和闹市区设置的一种小型机器,利用一张信用卡大小的胶卡上的磁带〔或芯片卡上的芯片〕记录客户的基本户口资料,让客户可以透过机器进行提款、存款、转帐等银行柜台服务。这里介绍使用Rational Rose工具为ATM自动取款机系统进行建模。
5.1需求分析
ATM自动取款机系统的需求分析简述如下:
(1)客户将银行卡插入读卡器,读卡器识别卡的真伪,并在显示器上提示输入密码。(2)客户通过键盘输入密码,取款机验证密码是否有效。如果密码错误提示错误信息,如果正确,提示客户进行选择操作的业务。
(3)客户根据自己的需要可进行存款、取款、查询账户、转账、修改密码的操作。(4)在客户选择后显示器进行交互提示和操作确认等信息。(5)操作完毕后,客户可自由选择打印或不打印凭条。
(6)银行职员可进行对ATM自动取款机的硬件维护和添加现金的操作。
5.2系统建模
在系统建模以前,我们首先需要在Rational Rose 2003中创建一个模型。并命名为“ATM自动取款机系统”,该名称将会在Rational Rose 2003的顶端出现,如下图5-1所示。
图 5-1创建项目系统模型
5.2.1创建系统用例模型
创建系统用例的第一步是确定系统的参与者。考试成绩管理系统的参与者包含以下三种:
(1)客户(2)银行职员(3)信用系统 三个参与者如图5-2所示。
图5-2 系统参与者
然后,我们根据参与者的不同分别画出各个参与者的用例图。
1.客户用例图:客户在本系统中可以进行取款、存款、转账、查询余额、修改密码和还款的相关操作,通过这些活动创建的客户用例图如图5-3所示。
图5-3 客户用例图
图5-4 银行职员用例图
2.银行职员用例图:银行职员在本系统中能够进行硬件维护、修改密码和添加现金的相关操作,通过这些活动创建的银行职员用例图如图5-4所示。
5.2.2创建系统静态模型
从前面的需求分析中,我们可以依据主要的九个类对象:ATM自动提款机、客户、银行职员、信用系统、数据库连接、银行账户、ATM屏幕、ATM键盘和ATM读卡器创建完整的类图如图5-5所示。
图 5-5 系统类图
5.2.3创建系统动态模型
系统的动态模型可以使用交互作用图、状态图和活动图来进行描述。
5.2.3.1 创建序列图和协作图
客户取款的活动步骤分为:(1)客户插入银行卡(2)读卡机读取卡号(3)初始化屏幕(4)读卡机打开账户并提示输入密码(5)用户输入密码(6)验证密码(7)屏幕提示选择操作(8)用户选择取款操作(9)银行账户扣除钱款(10)吐钱机提供钱和收据(11)用户取钱并退卡。根据以上步骤创建的序列图和协助图,如下图5-6和图5-7所示。
图5-6 客户取款序列图
图5-7 客户取款协作图
5.2.3.2 创建活动图
我们还可以利用系统的活动图来描述系统的参与者是如何协同工作的。ATM自动取款机系统中,根据用户开立新账户的步骤,我们可以创建活动图如下图5-12所示。
图5-12 系统活动图
图5-13 系统状态图
5.2.3.3 创建状态图
在ATM自动取款机系统中,有明确状态转换的类是银行账户,从账户的打开到账户关闭的过程,状态会发生明显的变化。创建后的系统状态图如下图5-13所示。
5.2.4创建系统部署模型
对系统的实现结构进行建模的方式包括两种,即构件图和部署图。ATM自动取款系统的构件图我们通过构件映射到系统的实现类中,说明该构件物理实现的逻辑类,在本系统中,我们可以对银行账户、信用系统、客户、ATM屏幕、ATM取款机、ATM键盘、银行职员、读卡器和数据库服务器分别创建对应的构件进行映射。ATM自动取款机系统的构件图如图5-14所示。
.图 5-14系统构件图
图5-15 系统部署图
ATM自动取款机系统的部署图描绘的是系统节点上运行资源的安排。包括了四个节点,分别是:ATM客户端、地区ATM服务器、银行数据库服务器和打印机。创建后的部署图如图5-15所示。
第三篇:ATM自动取款机C++课程设计
C++课程设计
学校: 惠州学院
题目: 设计ATM自动取款机系统 系别: 电子科学系 班级: 11电信2班 学号: 110703229 姓名: 王志勇
2014年4月21日
一、课程设计目的及要求
1.1设计目的
1.提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。
2.培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
3.学习和掌握础。C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基
1.2 ATM自动取款机设计要求
1.实现ATM取款机的基本功能,如给用户提供开户、查询余额、取款、修改密码、吃卡、退出系统等服务,可根据实际情况添加(如缴费、转账等服务)。
2.对于用户要求输入相应的帐号和密码,如果三次出错则将卡吃掉并打印出相应凭条。
若输入的取款金额超出账户余额,则提示用户输入有误并提供更正功能
二、课程设计具体实现
2.1.1总体设计
根据C++类的基本知识和类的基本性质去实现ATM自动取款机基本功能;
ATM自动取款系统开户用户登录退出存款取款查询余额修改密码转账退出系统
2.1.2详细设计
1.登陆模块
主要完成功能为:当用户开始使用本系统,进入登陆模块。屏幕显示菜单提示,用户可根据需要选择相应功能。具体如下:开户、用户登录、退出系统;用户登录里面还有存款、取款、查询余额、修改密码、转账等功能
主要适用技术:登陆函数主要是使用了循环函数和do while函数,还有许多的成员函OpenAccount()、SaveMoney()、TakeMoney()、Inquiry()、Changepsw()、Transfer();Menus();关键代码如下: void main();主函数;
do{} while(1);//循环结构语句 switch(i);case 1: default: UserLogin();//用户登录界面函数 Menus();//用户操作函数 bank k;//默认构造函数 OpenAccount();break;//开户
SaveMoney();break;//存款 TakeMoney();break;//取款 Inquiry();break;//查询余额 Changepsw();break;//修改密码 Transfer();break;//转账
2.开户模块
主要完成功能为:进入开户模块。屏幕显示菜单提示,可根据要求依次输入姓名、身份证号、卡号、密码和预存款金额,完成以上操作之后,屏幕上显示恭喜您,开户成功;主要适用技术:开户函数使用了基本函数;
主要代码如下:void OpenAccount()//开户函数
3.存款模块
主要完成功能为:当开始使用本系统,进入存款模块。屏幕显示菜单提示,根据要求依 主要使用技术:存款函数使用了循环语句函数、判断函数和选择函数 主要代码如下:
void SaveMoney()//存款函数
4.取款模块
主要完成功能为:进入取款模块。如果全款金额小于或者等于卡上余额,则取款进行,否则重新输入取款金额。取款成功后显示卡上余额
主要适用技术:存款函数使用了循环语句函数、判断函数和选择函数 主要代码如下:
void TakeMoney()//取款函数
5.查询余额
主要完成功能为:进入查询余额模块。屏幕显示菜单提示,屏幕上将显示你的余额,然后进入修改密码模块;
主要适用技术:存款函数使用了循环语句函数、判断函数和选择函数 主要代码如下:
voidInquiry()//查询余额函数
6.修改密码
主要完成功能为:进入修改密码模块。屏幕显示菜单提示,根据要求依次输卡号和密码,如果卡号和原始密码正确,则将进行修改密码的步骤,先输入原始密码,然后再输入新密码,之后确认新密码,确认正确之后,密码修改成功,接下来进入转账模块; 主要适用技术:存款函数使用了循环语句函数、判断函数和选择函数 主要代码如下:
void Changepsw()//修改密码函数
for(int i=1;i<=N;i++)else //循环结果语句 exit(1);//结束函数
7.转账模块
主要完成功能为:进入转账模块。输入所要转账的账号并输入转账金额,如果转账金额小于余额,转账成功输出卡上余额,主要适用技术:存款函数使用了循环语句函数、判断函数和选择函数 主要代码如下:
voidTransfer()//转账函数
8.退出系统模块
主要完成功能为:退出ATM自动取款系统,用条件if(i==7)break;或exist(1)实现。
三、源程序代码
#include
//默认构造函数,并初始化
void UserLogin();
//用户登录声明
void OpenAccount();
//开户函数声明
void Menus();
//用户操作函数声明
void SaveMoney();
//存款函数声明
void TakeMoney();
//取款函数声明
void Inquiry();
//查询函数声明
void Transfer();
//转账函数声明
void Changepsw();
//修改密码函数声明 private:
char name[20];
long cardID;
double SFZ;
long psw;
int money;};void Bank::UserLogin()
//用户登录函数定义 { long ID;long psw1;cout< //用户操作函数定义 { int a;do{ cout<<“1.存款n”;cout<<“2.取款n”;cout<<“3.查询余额n”;cout<<“4.修改密码n”;cout<<“5.转账n”;cout<<“6.退出系统n”;cout<<“请输入您要办理业务的序号:”;cin>>a;switch(a){ case 1: SaveMoney();break; case 2: TakeMoney();break; case 3: Inquiry();break; case 4: Changepsw();break; case 5: Transfer();break; case 6: exit(0);break; default:{cout<<“你的输入有误,请输入1-7之间的整数!n”;} } for(int j=0;j<=20;j++)cout<<“**”;cout< { cout<<“欢迎开户:”< cout<<“请输入您的姓名:”< cin>>name;cout<<“请输入身份证号码:”< 号:“< //存款 //取款 //查询余额 //修改密码 //转账 //退出 //开户函数定义 //cout<<”请输入您的卡 cin>>money;cout<<“恭喜您,开户成功!”< //存款函数定义 {int money1;cout<<“欢迎您使用取款业务”< void Bank::TakeMoney() { int money1;cout<<“欢迎您使用取款业务n”;cout<<“每次取款不能超过5000元”< cout<<“取款金额超出账户余额,请重新输入取款金额:”;cin>>money1;money=money-money1;cout<<“取款成功,您卡上余额为:”< 义 { cout<<“欢迎进行查询余额业务n”;cout<<“卡上余额为:”< //取款函数定义 //查询余额函数定 void Bank::Transfer() //转账函数定义 { long ID2;int money1;cout<<“欢迎使用转账业务n”< cout<<“金额超出账户余额,请重新输入取款金额:”;cin>>money1;money=money-money1;cout<<“转账成功,您卡上余额为:”< 修改密码函数定义 { long ID;long psw1;long psw2;cout<<“欢迎使用修改密码业务n”< // cin>>psw1;cout<<“请输入您的新密码:”< ICBC ”< case 2: k.UserLogin();break; default:{cout<<“你的输入有误,请输入1-3之间的整数!n”;} } for(int j=0;j<=20;j++)cout<<“**”;cout< //开户函数调用//用户登录 四、总结 在为期二周的课程设计中,我体会颇多,学到很多东西,通过完成C++程序设计的任务,使我熟练和掌握了这学期所学的有关visual c++6.0中的一些主要知识点和应用点,比如面向对象中的类的定义、类的实现、对象的定义、类的继承、类的多态性等等;还有面向过程的许多基础知识,结构体的基本类型,基本应用、结构体的堆栈基础知识等等。应用程序的设计和创建,经历了平时在课堂中和考试中,决不会有的重重难题和问题,这些问题,并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们面对难题,自己思索,自己探索,自己查资料发现问题、解决问题的独断能力。 时间总是过得很快,转眼间C++课程设计就要结束了,通过这次课程设计,我们学会了很多,也懂得了很多,知道自己的C++只是哈有很大的提高空间。感谢老师,是您让我们知道了这些,是您一次次的帮助我们那些被我们收拾的面目全非的程序,让我们的程序起死回生;感谢老师,是您让我们看到自己的差距,看到了自己的基础知识还很薄弱,还有许多的只是我们还不懂,我们需要再接再厉去提高自己;感谢老师,是您让我们懂得了原来C++的许多程序原来是很深奥很深奥的,原来C++的许多程序是可以那样完成的,还有调试还可以是以那种形式去调试的;总之感谢您老师,是我们的C++有了进一步的提高,谢谢您老师,你们辛苦了。 “实践是检验真理的唯一标准”。没有实践,就不会发现和深刻体会它的真实所在。只有通过检验的真理,在自己的心里,才会认可它的真实性。C++程序设计的完成,使我们懂得了真理的重要性,理论和实际的相结合,才能真正把握所学和所掌握的知识。理论的拥有并不能代表我们的实力和能力,一切的事件和其成功都是理论和实践的结合。总之,我们学习和掌握的知识,只有通过实际应用,才能真正的理解和掌握,才能更好的去应用理论的拥有并不能代表我们的实力和能力,一切的事件和其成功都是理论和实践的结合。我们学习和掌握的知识,只有通过实际应用,才能真正的理解和掌握,才能更好的去应用。 ATM取款机课程设计报告 姓 名: 学 号: 专 业: 班 级: ATM取款机 课程设计过程概述 2009年6月,JAVA游戏开发课程设计在实验楼三楼机房进行,持续时间为两周。这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象软件开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。这次课程设计的主要内容是独立用JAVA语言开发一个小的应用程序。我开发了一个ATM柜员机。课程设计题目描述和基本设计要求 我设计的ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。系统需求分析 3.1 功能需求分析 本ATM柜员机的主要功能如下所述: 要求使用图形用户界面。当输入给定的卡号和密码(初始卡号为000000和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行: 查询余额:初始余额为50000元 ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。 ATM存款:不能出现负存款。 修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。3.2 其他需求分析 (1)性能描述 实时性好、灵活性强、易于不同年龄阶段的人操作。(2)设计约束 开发工具:JCrator ProV3.5.0 运行环境:Windows 2000以上 能实现用户所定义的各项需求。(3)界面要求 以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。系统设计 4.1 总体设计 我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。其功能结构图如下所示: 图1 ATM功能结构示意图 4.2 ATM柜员机界面设计 我觉得一个系统的界面应该要简单明了,当然样式美观就更好了。我设计的界面主要是由窗体组成,操作简单。而每一个窗口则执行相应的功能。 一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。我设计的界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。 (1)窗体的设计 窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不同功能的模块的名字,比如说查询余额,还有取款等。相应源代码为:WindowBox(String s,Account act){super(“ATM柜员机”);}、Selection(String s,Account act){ } 向Frame窗口中添加组件使用add()。super(s); 例如:button1 = new Button(“存款”); p1.add(button1);this.add(p1);每个Frame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作Frame可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是对WINDOWS_CLOSING事件做出响应,调用dispose()方法关闭窗口。Frame也可以引发WindowsEvent类代表的窗口事件。相应源代码为: addWindowListener(new WindowAdapter()//窗口侦听器,以从此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//处理窗口关闭事件 { System.exit(0);} });}(2)窗体的主要结构的设计 我所设计的窗口的主要结构的特点就是每个窗口都对应着一个特定的功能。比如说报各种各样的错,还有各种查询余额、取款、选择服务等,所以它们都是由各种按钮和文本框,标签组成的,而联系各个窗体成为一个整体的就是各个按钮的监听事件。所以整个设计就趋向简单化了。 为了定义各个按钮所对应的命令和操作,首先需要将各个按钮注册给实现了动作事件的监听接口ActionListener的监听者,然后为监听者定义actionPerformed(ActionEvent e)方法,在这个方法中调用e.getSource()或e.getActionCommand()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。 4.3 各功能模块设计 4.3.1 登陆页面模块设计 与ATM柜员机打交道比较多的,也是大家对安全比较关心的问题:密码。所以第一个界面就是要输入密码和卡号才能继续服务。 我定义了文本框累的对象tf1,tf2。抓药是用于输入单行的文本;文本区调用public String getText()方法,获取用户想要的字符串。用来判断输入的密码和卡号是否正确,如果不正确的话,则弹出密码或卡号错误的警告框,并用dispose()关掉窗口。此模块相应的部分源代码为: public void actionPerformed(ActionEvent e){ Account act;String card; String pwd; act=new Account(“000000”,“Devil”,“123456”,50000);//初始化 /*选择各种服务*/ if(e.getSource()== button1){ String number1,number2; number1=tf1.getText(); number2=tf2.getText();/*判断密码和卡号是否正确*/ if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){ dispose(); /*卡号和密码都正确则进入功能选择窗口*/ } Selection s = new Selection(“选择服务”,act); }else{ } dispose(); ErrorWarn ew = new ErrorWarn(“消息!”,act); /*退卡*/ if(e.getSource()==button2){ } System.exit(0);dispose();} 4.3.2 选择服务模块设计 在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法public void actionPerformed(ActionEvent e)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。其中的部分源代码为: p.add(new Label(“请选择你要的服务”)); this.add(p);button1 = new Button(“存款”);p1.add(button1);this.add(p1);button2 = new Button(“取款”);p2.add(button2);this.add(p2);button3 = new Button(“查询余额”);p3.add(button3);this.add(p3);button4 = new Button(“退出”);p4.add(button4);this.add(p4);button5 = new Button(“修改密码”);p5.add(button5);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } });} button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);//setLayout(new GridLayout());setBounds(150,150,200,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){ if(e.getSource()==button2){//取款 } if(e.getSource()==button3){//查询余额 } else if(e.getSource()==button4){//退出 } else if(e.getSource()==button5){//修改密码 ChangePassword cp = new ChangePassword(“修改密码”,act);dispose(); dispose();GetBalance gb = new GetBalance(“取款”,act); Query q =new Query(“查询余额”,act);dispose();System.exit(0);dispose(); } } } 4.3.3 取款模块设计 在取款模块中,和其他的界面也是同样的结构。也是有一个文本框和一个按钮还有标签组成的。用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。其方法为: if(e.getSource()==button){ /*判断余额是否为负*/ if(act.get_Money()<0){ } dispose(); ErrorWarn4 ew4 = new ErrorWarn4(“消息!”,act); /*判断取款数额是否小于卡里余额*/ else if(money<=act.get_Money()){ /*取款的数额必须是100的倍数且每次最多只能取5000块*/ if((money%100!=0)||(money>=5000)){ } act.set_Balance(money);//重新设置卡里的余额 this.setVisible(false); dispose(); ErrorWarn6 ew6 = new ErrorWarn6(“消息!”,act); /*取款后就再次进入选择界面*/ Selection s = new Selection(“选择服务”,act); //dispose();}else if(money>act.get_Money()){ } } dispose(); ErrorWarn5 ew5 = new ErrorWarn5(“消息!”,act);4.3.4 修改密码模块设计 在修改密码模块中,首先你必须要输入你的旧密码是否正确,否则就会报错。再一个就是要两次输入你的新密码,且两次药匹配,否则也会报错,然后再重新回到修改密码的界面。在修改密码时用到的方法为: /*判断旧密码是是否正确*/ if(pwd2.equals(act.get_Password())){ /*判断两次输入的密码是否匹配*/ if(pwd3.equals(pwd4)){ /*如果都正确的话就设置新密码*/ act.setPassword(pwd3);dispose();Selection s = new Selection(“选择”,act); }else{ dispose();} ErrorWarn2 ew2 = new ErrorWarn2(“消息”,act);}else{ this.setVisible(false); } ErrorWarn3 ew1 = new ErrorWarn3(“消息”,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。或者在规范字符串中找不到任何合法协议,或者无法分析字符串。系统实现与测试 (1)打开DOS,编译运行程序后,将会看到如下的界面,如图2所示。如果输入的密码或卡号不正确的话就会报右下图的错误。 图2 主界面—登陆页面 (2)选择服务界面效果 当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。然后就可以选择所需要的服务了。 图3 选择服务界面 (3)取款界面,如图4所示。 图4 取款界面 当输入的钱数不是100的倍数或每一次大于5000时就会报图5的错误。 图5 输入错误1 当取款时如果超过卡里的余额的话就会报图6的错误。 图6 输入错误2(4)查询余额界面,如图7所示。 图7 查询余额界面 经过测试,所有的功能基本上都实现了,而且运行正常。课程设计总结 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 附录 import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;import java.io.*; /*登陆页面首窗口*/ class WindowBox extends Frame implements ActionListener{ Box baseBox,box1,box2;TextField tf1,tf2;Button button1;Button button2;WindowBox(String s){//构造方法 super(s); tf1 = new TextField(6); tf2 = new TextField(6); box1= Box.createVerticalBox;box1.add(new Label(“请输入你的卡号”));//输入卡号 box1.add(Box.createVerticalStrut(8));box1.add(new Label(“请输入你的密码”));//输入密码 } box2=Box.createVerticalBox();box2.add(tf1);//box2.add(new TextField(16));box2.add(Box.createVerticalStrut(8));box2.add(tf2);//box2.add(new TextField(16));baseBox=Box.createHorizontalBox();baseBox.add(box1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);add(baseBox);button1= new Button(“确定”);//加入按钮 button1.addActionListener(this);add(button1); button2 = new Button(“退卡”);//退卡按钮 button2.addActionListener(this);add(button2);setLayout(new FlowLayout());/*监听器*/ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ });System.exit(0);} setBounds(120,125,200,175);setVisible(true); public void actionPerformed(ActionEvent e){ Account act;String card; String pwd; act=new Account(“000000”,“Devil”,“123456”,50000);//初始化 /*选择各种服务*/ if(e.getSource()== button1){ String number1,number2;//输入的两个卡号和密码的变量 number1=tf1.getText(); number2=tf2.getText(); /*判断两次输入的卡号和密码是否正确*/ if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){ dispose(); Selection s = new Selection(“选择服务”,act); }else{ dispose(); ErrorWarn ew = new ErrorWarn(“消息!”,act);//报输入密码或卡号不正确 } } /*主函数*/ class ATM{ } } if(e.getSource()==button2){ } System.exit(0);dispose();//退出 } public static void main(String [] args){ } new WindowBox(“登录页面”);/*选择服务*/ import java.awt.*;import java.awt.event.*;class Selection extends Frame implements ActionListener{ Button button1,button2,button3,button4,button5;Panel p1 = new Panel();Panel p2 = new Panel();Panel p3 = new Panel();Panel p4 = new Panel();Panel p5 = new Panel();Panel p = new Panel();Account act; public Selection(){} Selection(String s,Account act){ super(s);this.act=act;this.setLayout(null);this.setLayout(new GridLayout(6,1));p.add(new Label(“请选择你要的服务”));this.add(p); /*各种服务功能*/ button1 = new Button(“存款”); } p1.add(button1);this.add(p1);button2 = new Button(“取款”);p2.add(button2);this.add(p2);button3 = new Button(“查询余额”);p3.add(button3);this.add(p3);button4 = new Button(“退出”);p4.add(button4);this.add(p4);button5 = new Button(“修改密码”);p5.add(button5);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ });System.exit(0);} button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);setBounds(150,150,200,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){ } } if(e.getSource()==button2){//取款 } if(e.getSource()==button3){//查询余额 } else if(e.getSource()==button4){//退出 } else if(e.getSource()==button5){//修改密码 } ChangePassword cp = new ChangePassword(“修改密码”,act);dispose();System.exit(0);dispose();Query q =new Query(“查询余额”,act);dispose();dispose();GetBalance gb = new GetBalance(“取款”,act); /*class Test4{ public static void main(String [] args){ Selection s = new Selection(“选择”); /*取款功能*/ import javax.swing.*;import java.awt.*; }*/ } import javax.swing.border.*;import java.awt.event.*;class GetBalance extends Frame implements ActionListener{ Box baseBox, box1,box2;Button button;TextField tf;Account act;GetBalance(String s,Account act){//构造函数 super(s);this.act=act;button=new Button(“确定”);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(“请输入你想取钱的数目”));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){ });public void windowClosing(WindowEvent e){ } System.exit(0);setBounds(200,200,150,150);this.setVisible(true); } public void actionPerformed(ActionEvent e){ 于5000 } //System.out.println(e.getActionCommand());double money; money = Double.parseDouble(tf.getText().trim());if(e.getSource()==button){ if(act.get_Money()<0){//判断余额是否为负 dispose(); ErrorWarn4 ew4 = new ErrorWarn4(“消息!”,act);} else if(money<=act.get_Money()){//取钱的数额不大于余额 if((money%100!=0)||(money>=5000)){//取钱数为100的倍数或不大 dispose(); ErrorWarn6 ew6 = new ErrorWarn6(“消息!”,act); } act.set_Balance(money);//重置余额 this.setVisible(false); Selection s = new Selection(“选择服务”,act);//返回选择服务窗口 //dispose(); }else if(money>act.get_Money()){判断取款数额是否大于余额 dispose(); ErrorWarn5 ew5 = new ErrorWarn5(“消息!”,act); } } } /* public static void main(String[] args){ } /*修改密码功能*/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;class ChangePassword extends Frame implements ActionListener{ Panel panel1 = new Panel();Panel panel2 = new Panel();Panel panel3 = new Panel();Panel panel = new Panel();TextField tf4,tf5,tf6;Button button;Account act;ChangePassword(String s,Account act){ super(s);this.act=act; GetBalance test = new GetBalance(“dfdf”);} GetBalance gb = new GetBalance(“取款”);tf4 = new TextField(6);tf5 = new TextField(6);tf6 = new TextField(6);button = new Button(“确定”); button.addActionListener(this);/*建立新密码*/ } /*判断事件源,看条件是否成立再修改密码*/ public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ String pwd2,pwd3,pwd4; pwd2 = tf4.getText(); panel1.add(new Label(“请输入你的旧密码:”));panel1.add(tf4);panel2.add(new Label(“请输入你的新密码:”));panel2.add(tf5);panel3.add(new Label(“请再次输入你的新密码”));panel3.add(tf6);panel.add(button);this.add(panel1);this.add(panel2);this.add(panel3);this.add(panel);setLayout(new GridLayout(4,1));setBounds(200,200,250,250);this.setVisible(true);/*窗口事件*/ this.addWindowListener(new WindowAdapter(){ });public void windowClosing(WindowEvent e){ } System.exit(0); } } pwd3 = tf5.getText(); pwd4 = tf6.getText(); } if(pwd2.equals(act.get_Password())){//判断旧密码是否正确 if(pwd3.equals(pwd4)){//判断两次输入的新密码是个匹配 act.setPassword(pwd3);//启用新的密码 dispose();Selection s = new Selection(“选择”,act);//返回选择服务窗口 }else{ //this.setVisible(true); //ErrorWarn2 ew = new ErrorWarn2(“消息”,act); dispose();} ErrorWarn2 ew2 = new ErrorWarn2(“消息”,act);}else{ this.setVisible(false); } ErrorWarn3 ew1 = new ErrorWarn3(“消息”,act); dispose();/*查询余额功能*/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;class Query extends Frame implements ActionListener{ //Account act;Button button;Account act;Query(String s,Account act){//构造函数 } public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ dispose(); super(s);this.act = act; button=new Button(“确定”);//TextField tf = new TextField(6);Panel panel1 = new Panel();Panel panel = new Panel();panel1.add(new Label(“你的余额为: ” + act.get_Money()));//查询余额的方法 //panel1.add(tf); button.addActionListener(this);panel.add(button);this.add(panel);this.add(panel1);this.setLayout(new GridLayout(2,1));this.addWindowListener(new WindowAdapter(){ });public void windowClosing(WindowEvent e){ } System.exit(0);setBounds(200,200,150,150);setVisible(true); } } Selection s = new Selection(“选择服务”,act);//返回选择服务窗口 } /*账户*/ import java.io.*; /*该类为实现客户信息及部分功能*/ class Account { private String code =null; //信用卡号 private String name =null; //客户姓名 private String password=null; //客户密码 private double money =0.0; //卡里金额 /********************/ public Account(String code,String name,String password,double money){ this.code=code; this.name=name; this.password=password; this.money=money;} public String get_Code(){//取得卡号 return code;} public String get_Name(){//取得名字 return name;} public String get_Password(){//取得密码 return password;} public double get_Money(){//取得余额 return money;} /*得到剩余的钱的数目*/ protected void set_Balance(double mon){ money-= mon;} /*重置秘密的方法*/ public String setPassword(String pwd){ } } password = pwd;return password; 黄 淮 学 院 JAVA 课程设计报告 题 目: 《ATM柜员机》课程设计 学 院: 信 息 工 程 学 院 专 业: 计算机科学与技术 指导老师: 二0一三年六月 目录 课程设计过程概述.......................................................................................3 2 课程设计题目描述和基本设计要求...........................................................3 3 系统需求分析...............................................................................................3 3.1 功能需求分析···················································································· 3 3.2 其他需求分析···················································································· 4 4 系统设计........................................................................................................4 4.1 总体设计 ··························································································· 4 4.2 ATM柜员机界面设计 ········································································· 5 4.3 各功能模块设计 ················································································ 7 4.3.1 登陆页面模块设计 ····························································· 7 4.3.2 选择服务模块设计 ····························································· 8 4.3.3 取款模块设计 ····································································· 9 4.3.4 修改密码模块设计 ····························································· 9 4.3.5 退卡模块设计 ··································································· 10 4.4 异常处理情况说明 ·········································································· 10 5 系统实现与测试.........................................................................................11 6 课程设计总结.............................................................................................13 6.1 遇到的问题及解决办法 ·································································· 13 6.2 心得体会 ························································································· 14 参考文献..........................................................................................................15 附录..................................................................................................................15 ATM初始账号:000000 初始密码:123456 ATM柜员机 课程设计过程概述 2013年6月,JAVA课程设计在1#楼六楼机房进行,持续时间为两周。这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象软件开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。这次课程设计的主要内容是独立用JAVA语言开发一个小的应用程序。我们开发了一个ATM柜员机。课程设计题目描述和基本设计要求 我设计的ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。3 系统需求分析 3.1 功能需求分析 本ATM柜员机的主要功能如下所述: 要求使用图形用户界面。当输入给定的卡号和密码(初始卡号为000000和密码为123456)时,系统能登录ATM柜员机系统,用户可 以按照以下规则进行: 查询余额:初始余额为50000元 ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。 ATM存款:不能出现负存款。 修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。 3.2 其他需求分析(1)性能描述 实时性好、灵活性强、易于不同年龄阶段的人操作。(2)设计约束 开发工具:MyEclipse 运行环境:Windows XP、Window 7 能实现用户所定义的各项需求。(3)界面要求 以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。4 系统设计 4.1 总体设计 我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组 成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。其功能结构图如下所示: 图1 ATM功能结构示意图 4.2 ATM柜员机界面设计 我们觉得一个系统的界面应该要简单明了,当然样式美观就更好了。我设计的界面主要是由窗体组成,操作简单。而每一个窗口则执行相应的功能。 一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。我设计的界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。(1)窗体的设计 窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不 同功能的模块的名字,比如说查询余额,还有取款等。相应源代码为: 向Frame窗口中添加组件使用add()。例如:button1 = new Button(“存款”);p1.add(button1);this.add(p1);每个Frame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作Frame可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是对WINDOWS_CLOSING事件做出响应,调用dispose()方法关闭窗口。Frame也可以引发WindowsEvent类代表的窗口事件。相应源代码为: addWindowListener(new WindowAdapter()//窗口侦听器,以从此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//处理窗口关闭事件 { System.exit(0);} });}(2)窗体的主要结构的设计 我所设计的窗口的主要结构的特点就是每个窗口都对应着一个特定的功能。比如说报各种各样的错,还有各种查询余额、取款、选择服务等,所以它们都是由各种按钮和文本框,标签组成的,而联系各个窗体成为一个整体的就是各个按钮的监听事件。所以整个设计就趋向简单化了。 为了定义各个按钮所对应的命令和操作,首先需要将各个按钮注册给实现了动作事件的监听接口ActionListener的监听者,然后为监听者定义actionPerformed(ActionEvent e)方法,在这个方法中调用e.getSource()或e.getActionCommand()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。4.3 各功能模块设计 4.3.1 登陆页面模块设计 与ATM柜员机打交道比较多的,也是大家对安全比较关心的问题:密码。所以第一个界面就是要输入密码和卡号才能继续服务。我定义了文本框类的对象tf1,tf2。是用于输入单行的文本;文本区调用public String getPassword()方法,获取用户想要的字符串。用来判断输入的密码和卡号是否正确,如果不正确的话,则弹出密码或卡号错误的警告框,并用dispose()关掉窗口。此模块相应的部分源代码为: public void actionPerformed(ActionEvent e){ Account act;act=new Account(“000000”,“HuangHuai”,“123456”,50000);//初始化 /*选择各种服务*/ if(e.getSource()== button1){ String number1,number2;//输入的两个卡号和密码的变量 number1=tf1.getText().toString();number2 = new String(tf2.getPassword()); /*判断两次输入的卡号和密码是否正确*/ if((act.getCode().equals(number1))&&(act.getPassword().equals(number2))){ dispose(); new Selection(“选择服务”,act);}else{ JOptionPane.showMessageDialog(this, “密码或帐号错误!”,“账户提 示信息”,JOptionPane.ERROR_MESSAGE); dispose(); new WindowBox(“ATM”); } } if(e.getSource()==button2){ System.exit(0); dispose();//退出 } } 4.3.2 选择服务模块设计 在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法public void actionPerformed(ActionEvent e)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。其中的部分源代码为: p.add(new Label(“请选择你要的服务”)); this.add(p);/*各种服务功能*/ buttonCUN = new Button(“ 存 款 ”); p1.add(buttonCUN); this.add(p1); buttonQU = new Button(“ 取 款 ”); p2.add(buttonQU); this.add(p2); buttonCHA = new Button(“ 查询余额 ”); p3.add(buttonCHA); this.add(p3); buttonTUI = new Button(“ 退 出 ”); p4.add(buttonTUI); this.add(p4); buttonGAI = new Button(“ 修改密码 ”); 4.3.3 取款模块设计 在取款模块中,和其他的界面也是同样的结构。也是有一个文本框和一个按钮还有标签组成的。用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。其方法为: public String withdrawMoney(double money){ String str = null; if(money<=0){ str = “取款数目须是正数!”;}else{ if(getMoney()<0){//判断余额是否为负 str=“余额为负数!”; }else if(money<=getMoney()){ if((money%100!=0)||(money>=5000)){//取钱数为100的倍数或不大于5000 str= “取款数目须是一百的整数倍!”; }else{ setBalance(money); str = “取款成功:余额为”+getMoney(); } }else{ str = “余额不足!”; } } return str;} 4.3.4 修改密码模块设计 在修改密码模块中,首先你必须要输入你的旧密码是否正确,否则就会报错。再一个就是要两次输入你的新密码,且两次药匹配,否则也会报错,然后再重新回到修改密码的界面。在修改密码时用到的方法为: /*判断旧密码是是否正确*/ if(pwd2.equals(pwd1)){ if(pwd3.equals(pwd4)){//判断两次输入的新密码是个匹配 act.changePassword(pwd3);//启用新的密码 dispose(); JOptionPane.showMessageDialog(this, “修改密码成功!”); new Selection(“选择”,act);//返回选择服务窗口 }else{ this.setVisible(true); dispose(); JOptionPane.showMessageDialog(this, “两次输入要修改的密码不同,更新密码失败!”); new Selection(“选择”,act); } }else{ this.setVisible(false); dispose(); JOptionPane.showMessageDialog(this, “输入密码错误,更新密码失败!”); new Selection(“选择”,act);} } 4.3.5 退卡模块设计 在退卡模块设计中,这个方法就更加的简单了,它只是用了if(e.getSource()==buttonTUI){//退出 System.exit(0); dispose(); } 这个方法就可以实现了,这里就不再多说了。4.4 异常处理情况说明 (1)打开、保存文件时的异常处理 需要处理的异常:IOException(2)数据库访问时的异常处理 需要处理的异常:SQLException (3)加载类时的异常处理 需要处理的异常:ClassNotFindException,当应用程序试图使用Class类中的forName方法通过字符串名加载类时,但是没有找到具有指定名称的类的定义。(4)加载URL时的异常 需要处理的异常:MalformedURLException,抛出这一异常指示出现了错误的 URL。或者在规范字符串中找不到任何合法协议,或者无法分析字符串。5 系统实现与测试 (1)打开MyEclipse,编译运行程序后,将会看到如下的界面,如图2所示。如果输入的密码或卡号不正确的话就会报下图的错误。 图2 主界面—登陆页面 (2)选择服务界面效果 当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。然后就可以选择所需要的服务了。 图3 选择服务界面 (3)取款界面,如图4所示。 图4 取款界面 当输入的钱数不是100的倍数或每一次大于5000时就会报图5的错误。 图5 输入错误 当取款时如果超过卡里的余额的话就会报图6的错误。 图6 输入错误2(4)查询余额界面,如图7所示。 图7 查询余额界面 (5)修改密码界面,如下图所示。 经过测试,所有的功能基本上都实现了,而且运行正常。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 附录 Account类: package cn.com.account;/** * 帐户 * 该类为实现客户信息及部分功能 */ public class Account { private String code = null;//信用卡号 private String name = null;//客户姓名 private String password= null;//客户密码 private double money = 0.0;//卡里金额 public Account(){ } public Account(String code,String name,String password,double money){ } public String getCode(){//取得卡号 return code;} public String getName(){//取得名字 return name;} /** * 取得密码 * @return */ public String getPassword(){ } /** * 重置秘密的方法 */ public void changePassword(String pwd){ } public double getMoney(){//取得余额 return money;} /** * 得到剩余的钱的数目 */ private void setBalance(double mon){ } money-= mon;password = pwd;return password;this.code=code;this.name=name;this.password=password;this.money=money;this.code = “123456”;this.password = “123456”; } /** * 取款设置 * 若成功显示余额 * 不成功显示提示信息 */ public String withdrawMoney(double money){ String str = null;if(money<=0){ str = “取款数目须是正数!”;}else{ if(getMoney()<0){//判断余额是否为负 str=“余额为负数!”;}else if(money<=getMoney()){ if((money%100!=0)||(money>=5000)){//取钱数为100的倍数 str= “取款数目须是一百的整数倍!”;}else{ setBalance(money);str = “取款成功:余额为”+getMoney();} 或不大于5000 }else{ str = “余额不足!”;} } return str;} /** * 存款设置 * 若成功显示余额 * 不成功显示提示信息 */ public String depositMoney(double money){ } String str = null; if(money<0){ str =“存款数目须是正数!”;}else{ setBalance(-money);str = “存款成功:余额为”+getMoney();} return str;ChangePassword类: package cn.com.frameui;import cn.com.account.Account;import javax.swing.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(“serial”)public class ChangePassword extends Frame implements ActionListener{ Panel panel1 = new Panel();Panel panel2 = new Panel();Panel panel3 = new Panel();Panel panel = new Panel();//TextField tf4,tf5,tf6;JPasswordField tf4,tf5,tf6;Button button;Account act;ChangePassword(String s,Account act){ super(s);this.act=act; tf4 = new JPasswordField(6);tf5 = new JPasswordField(6);tf6 = new JPasswordField(6);button = new Button(“确定”);button.addActionListener(this);/*建立新密码*/ panel1.add(new Label(“请输入你的旧密码:”));panel1.add(tf4);panel2.add(new Label(“请输入你的新密码:”));panel2.add(tf5);panel3.add(new Label(“请再次输入新密码:”));panel3.add(tf6);panel.add(button);this.add(panel1);this.add(panel2);this.add(panel3);this.add(panel);setLayout(new GridLayout(4,1));setBounds(200,200,300,200);this.setVisible(true);/** * 窗口事件, 判断窗口是否关闭 */ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } } });/** * 判断事件源,看条件是否成立再修改密码 */ public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ String pwd2,pwd3,pwd4,pwd1;char [] p2,p3,p4;pwd1 = act.getPassword();p2=tf4.getPassword();p3=tf5.getPassword();p4=tf6.getPassword(); pwd2 = new String(p2);pwd3 = new String(p3);pwd4 = new String(p4); if(pwd2.equals(pwd1)){ if(pwd3.equals(pwd4)){//判断两次输入的新密码是个匹配 act.changePassword(pwd3);//启用新的密码 dispose();JOptionPane.showMessageDialog(this, “修改密码成功!”);new Selection(“选择”,act);//返回选择服务窗口 }else{ this.setVisible(true);dispose();JOptionPane.showMessageDialog(this, “两次输入要修改的密码不同, new Selection(”选择“,act);} this.setVisible(false);dispose();JOptionPane.showMessageDialog(this, ”输入密码错误,更新密码失更新密码失败!“);}else{ 败!”); new Selection(“选择”,act);} } } GetBalance类: package cn.com.frameui;import cn.com.account.*;import javax.swing.*; import java.awt.*;import java.awt.event.*;@SuppressWarnings(“serial”)public class GetBalance extends Frame implements ActionListener{ Box baseBox, box1,box2;Button button;TextField tf;Account act;public GetBalance(String s,Account act){//构造函数 super(s); } public void actionPerformed(ActionEvent e){ double money;String str = null;/* * 取款判定 */ this.act=act;button=new Button(“确定”);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(“请输入你想取钱的数目”));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ } System.exit(0);});setBounds(200,200,300,200);this.setVisible(true); if(tf.getText().toString().equals(“")){ str = ”取款数目不能为空!“;}else{ } money = Double.parseDouble(tf.getText().toString());str = act.withdrawMoney(money); JOptionPane.showMessageDialog(this, str,”取款提示信息“,JOptionPane.PLAIN_MESSAGE); } this.setVisible(false);new Selection(”选择服务“,act);} Query类: package cn.com.frameui;import cn.com.account.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class Query extends Frame implements ActionListener{ Button button;Account act;public Query(String s,Account act){//构造函数 super(s); this.act = act; button=new Button(”确定“); Panel panel1 = new Panel();Panel panel = new Panel();panel1.add(new Label(”你的余额为: “ + act.getMoney()));//查询余额的方法 this.add(panel1);this.add(panel); button.addActionListener(this);panel.add(button); this.setLayout(new GridLayout(2,1));this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ } } } System.exit(0);});setBounds(200,200,200,150);setVisible(true);public void actionPerformed(ActionEvent e){ } if(e.getSource()==button){ dispose();new Selection(”选择服务“,act);//返回选择服务窗口 } Selection类: package cn.com.frameui;import cn.com.account.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class Selection extends Frame implements ActionListener{ Button buttonCUN,buttonQU,buttonCHA,buttonTUI,buttonGAI;Panel p1 = new Panel();Panel p2 = new Panel();Panel p3 = new Panel();Panel p4 = new Panel();Panel p5 = new Panel();Panel p = new Panel();Account act; public Selection(){} public Selection(String s,Account act){ super(s);this.act=act;this.setLayout(null);this.setLayout(new GridLayout(6,1));p.add(new Label(”请选择你要的服务“));this.add(p);buttonCUN = new Button(” 存 款 “);p1.add(buttonCUN);this.add(p1);buttonQU = new Button(” 取 款 “);p2.add(buttonQU);/*各种服务功能*/ } this.add(p2);buttonCHA = new Button(” 查询余额 “);p3.add(buttonCHA);this.add(p3);buttonTUI = new Button(” 退 出 “);p4.add(buttonTUI);this.add(p4);buttonGAI = new Button(” 修改密码 “);p5.add(buttonGAI);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });buttonCUN.addActionListener(this);buttonQU.addActionListener(this);buttonCHA.addActionListener(this);buttonTUI.addActionListener(this);buttonGAI.addActionListener(this);setBounds(150,150,300,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){ if(e.getSource()==buttonCUN){//存款 dispose();new SetBalance(”存款款“,act); }else if(e.getSource()==buttonQU){//取款 dispose();new GetBalance(”取款“,act); }else if(e.getSource()==buttonCHA){//查询余额 dispose();new Query(”查询余额“,act); }else if(e.getSource()==buttonTUI){//退出 System.exit(0);dispose(); } } }else if(e.getSource()==buttonGAI){//修改密码 dispose();new ChangePassword(”修改密码“,act); } SetBalance类: package cn.com.frameui;import cn.com.account.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class SetBalance extends Frame implements ActionListener{ Box baseBox, box1,box2;Button button;TextField tf;Account act;public SetBalance(String s,Account act){//构造函数 super(s); } public void actionPerformed(ActionEvent e){ this.act=act;button=new Button(”确定“);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(”请输入你想存款的数目“));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ } System.exit(0);});setBounds(200,200,300,200);this.setVisible(true); double money;String str = null;if(tf.getText().toString().equals(”“)){ str = ”存款数目不能为空!“;}else{ } money = Double.parseDouble(tf.getText().toString());str = act.depositMoney(money); JOptionPane.showMessageDialog(this, str,”存款提示信息“,JOptionPane.INFORMATION_MESSAGE); } dispose();this.setVisible(false);new Selection(”选择服务“,act);} WindowBox类: package cn.com.frameui;import cn.com.account.Account;import javax.swing.*; import java.awt.*;import java.awt.event.*;/** * 登陆页面首窗口 */ @SuppressWarnings(”serial“)public class WindowBox extends Frame implements ActionListener{ box1= Box.createVerticalBox();box1.add(new Label(”请输入您的卡号“));//输入卡号 box1.add(Box.createVerticalStrut(8));box1.add(new Label(”请输入您的密码“));//输入密码 box2=Box.createVerticalBox();Box baseBox,box1,box2;TextField tf1;JPasswordField tf2;Button button1;Button button2;public WindowBox(String s){//构造方法 super(s);tf1 = new TextField(6);tf2 = new JPasswordField(6); } box2.add(tf1); box2.add(Box.createVerticalStrut(8));box2.add(tf2); baseBox=Box.createHorizontalBox();baseBox.add(box1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);add(baseBox);button1= new Button(”确定“);//加入按钮 button1.addActionListener(this);add(button1); button2 = new Button(”退卡“);//退卡按钮 button2.addActionListener(this);add(button2);setLayout(new FlowLayout());/*监听器*/ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });setBounds(120,125,300,200);setVisible(true);public void actionPerformed(ActionEvent e){ Account act;act=new Account(”000000“,”HuangHuai“,”123456“,50000);//初始化 /*选择各种服务*/ if(e.getSource()== button1){ String number1,number2;//输入的两个卡号和密码的变量 number1=tf1.getText().toString();number2 = new String(tf2.getPassword()); /*判断两次输入的卡号和密码是否正确*/ if((act.getCode().equals(number1))&&(act.getPassword().equals(num dispose();ber2))){ new Selection(”选择服务“,act);}else{ JOptionPane.showMessageDialog(this, ”密码或帐号错误!“,”账户提示信息“,JOptionPane.ERROR_MESSAGE);dispose(); new WindowBox(”ATM“);} } if(e.getSource()==button2){ System.exit(0); dispose();//退出 } } } package cn.com.test;import cn.com.frameui.*;public class ATM { /** * 主测试程序 * @param args */ public static void main(String[] args){ new WindowBox(”ATM");} }第四篇:java实训 ATM取款机
第五篇:ATM取款机java课程设计