java课设atm机PDF.pdf
_x0001_页脚内容 1软 件 学 院课程设计报告书课程名称面向对象程序课程设计设计题目A T M 柜员机模拟程序专业班级学号姓名指导教师_x0001_页脚内容 22013 年 6 月目 录1 设计时间 . 62 设计目的 . 63 设计任务 . 64 设计内容 . 74.1 概要设计 . 74.1.1 设计思想 . 7ATM 机主要包括登陆模块,注册设计模块,选择服务模块,取款模块,存款模块,查询模块,修改密码模块等几个功能模块。其中: . 7(1) 登陆模块设计:提示用户输入卡号和密码的信息,要是用户输入的密码有错误,ATM 将会提醒您的密码输入错误,请重新输入,ATM 允许用户输入三次密码,若第三次输入也错误,机器将会吞卡。如果用户密码输入正确,点击确认将会进入选择服务的界面。. 7(2)选择服务模块设计:该界面显示ATM 柜员机的基本功能,如:取款,存款,查询余额,修改密码,退出。当用户选择其中任何一个功能时会进入对应界面,若选择退出功则将会退出登录界面。 . 7(3)取款模块设计:限制取款金额,即每次取款金额为100的倍数,不为负数,总额不超过5000_x0001_页脚内容 3元,支取金额不允许透支。 . 7(4)修改密码模块设计:修改密码界面要求新密码长度不小于6位,不允许出现 6 位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。 8(5)注册界面设计:当新用户使用ATM 机时,注册用户。用户名不得与已存在用户同名,且密码长度不小于 6位,不允许出现6位完全相同。 . 84.1.2 实现方法 . 84.1.3程序所能达到的功能 . 84.2 总体设计 . 84.2.1 Java 类和自定义类的层次关系. 84.2.1 自定义类的说明 . 94.3 详细设计 . 104.3.1 程序代码: . 10图 48 . 50_x0001_页脚内容 4 . 53 . 54_x0001_页脚内容 5. 54 . 555 总结与展望 . 55参考文献 . 56成绩评定 . 57_x0001_页脚内容 61 设计时间2013年 06月 8 日至 2013年 06月 14日2 设计目的面向对象程序设计是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。JAVA 程序设计的设计加深了学生对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用。本次面向对象程序课程设计目标为:通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力,提高学生的应用能力。通过此次课程设计巩固所学Java语言基本知识增进Java语言编辑基本功掌握JDK 等开发工具的运用拓宽常用类库的应用。通过该环节与课程及相关知识加以融会贯通全面掌握Java语言的编程思想及面向对象程序设计的方法为今后从事实际工作打下坚实的基础。通过实践加深学生对面向对象程序设计的类、对象、方法和基础知识的理解, 掌握使用 Java语言进行面向对象设计的基本方法,帮助学生建立面向对象的思维模式。在实践中,通过对Java程序的调试,提高学生分析程序中出现的错误和解决这些错误的能力。3设计任务题目: ATM 柜员机模拟程序_x0001_页脚内容 7要求:使用图形用户界面。当输入给定的卡号和密码(初始卡号和密码为123456 )时,系统能登录 ATM 柜员机系统,用户可以按照以下规则进行:(1)查询余额功能:初始余额为10000元。(2)ATM 取款功能:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。(3)ATM 存款功能:不能出现负存款。(4)修改密码:新密码长度不小于6位,不允许出现 6位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。4 设计内容4.1 概要设计4.1.1 设计思想ATM 机主要包括登陆模块, 注册设计模块, 选择服务模块, 取款模块, 存款模块,查询模块,修改密码模块等几个功能模块。其中:(1)登陆模块设计:提示用户输入卡号和密码的信息,要是用户输入的密码有错误,ATM 将会提醒您的密码输入错误,请重新输入,ATM 允许用户输入三次密码,若第三次输入也错误,机器将会吞卡。如果用户密码输入正确,点击确认将会进入选择服务的界面。(2)选择服务模块设计:该界面显示ATM 柜员机的基本功能,如:取款,存款,查询余额,修改密码,退出。当用户选择其中任何一个功能时会进入对应界面,若选择退出功则将会退出登录界面。(3)取款模块设计:限制取款金额,即每次取款金额为100 的倍数,不为负数,总额不超过5000元,支取金额不允许透支。_x0001_页脚内容 8(4)修改密码模块设计:修改密码界面要求新密码长度不小于6 位,不允许出现6 位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。(5)注册界面设计:当新用户使用ATM机时,注册用户。用户名不得与已存在用户同名,且密码长度不小于 6位,不允许出现 6位完全相同。4.1.2 实现方法ATM 柜员机主要是由各个Windows 窗口组成,它是由登录页面、 选择服务、取款、查询余额、修改密码和退卡等功能。它的各种按钮的事件和功能可以简单的模拟ATM 柜员机的要求。4.1.3程序所能达到的功能运用了事件监听技术来实现ATM 的各种功能例如:存款、取款、修改密码、查询。通过使用图形用户界面的设计思路,以方便用户操作,同时也使的程序更加简单。4.2 总体设计4.2.1 Java 类和自定义类的层次关系如图_x0001_页脚内容 9图MF类、denlu类、qukuan类、cunkuan类、chaxun类和 gaimi 类都继承了 Java类的 JFrame 类。4.2.1 自定义类的说明(1) Class Account创建客户,初始化客户信息功能以及保存客户信息,例如:卡号、密码、原有余额、取款后卡里的余额以及存款后卡里的余额。此类中包含的成员有:成员变量code ,mima,money和构造方法Account() ,获得用户卡号方法get_Code() ,获得用户密码方法get_Mima() , 获 得 用 户 信 用 卡 的 金 额 方 法 get_Money(), 设 置 取 款 后 的 账 户 余 额 方 法set_Balance(), 设置存款后的账户余额方法reccount(), 设置修改密码的方法gaimi()。(2) Class MF实现登录的界面,如果卡号和密码匹配就可以登录到主界面否则报错。它的成员有:P1 ,P2,L1 ,L2,L3,password ,B1 ,B2,TF1 ,content ,a和构造方法 MF和事件监听方法 actionPerformed() 。(3) Class ZC实现新用户注册界面,如果注册用户名出现重复进行提示。注册成功后进入服务界面。它的成员有 :p1,p2,p3,p4,b1,l1,l2,l3, t1, password,content,v和构造方法 ZC 和事件监听方法actionPerformed() 。(4)Class denlu 实现功能的主界面,它的成员有:P3,P4,B1 ,B2,B3,B4,B5,content ,key和构造方法 denlu和事件监听方法 actionPerformed() 。(5)Class qukuan实现取款的界面,如果每次取款金额不为100的倍数,总额超过500元,支取金额透支则报错。 它的成员有: P1 ,P2,L1 ,B1,B2,TF1 ,content ,key和构造方法 qukuan和事件监听方法 actionPerformed() 。(6)Class cunkuan 实现存款的界面,如果输入存款数为负款则报错。它的成员有:P1 ,P2,L1 ,_x0001_页脚内容 10B1 ,B2,TF1 ,content ,key和构造方法 cunkuan和事件监听方法 actionPerformed() 。(7)Class chaxun实现查询余额的界面,它的成员有:P1 ,P2,L1 ,B1 ,content ,key和构造方法 cunkuan和事件监听方法actionPerformed() 。(8)Class gaimi 实现查询余额的界面,如果新密码长度不小于6位,没出现 6位同的情况,旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码否则报错。它的成员有: P1 ,P2,L1 ,L2,L3,TF1 ,TF2 ,TF3 ,B1 ,B2,content ,key和构造方法 cunkuan和事件监听方法 actionPerformed() 。除 Account 类之外,其他的类均实现ActionListener 接口。4.3 详细设计4.3.1 程序代码:import javax.swing.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;import java.util.*;class Account static String code = null; / 信用卡号static String mima = null; / 用户密码_x0001_页脚内容 11static int money = 0; / 信用卡里金额public Account(String code,String mima,int money )/构造函数this.code = code;this.mima= mima;this.money = money;protected String get_Code() / 获取用户信用卡号return code;protected String get_mima() / 获得用户密码return mima;_x0001_页脚内容 12public int get_Money() / 获得用户信用卡里金额return money;protected void set_Balance(double mon) / 设置取款后的账户余额money -= mon;public void reccount(double mon) / 设置存款后的账户余额 money += mon;String gaimima(String mi) / 修改密码方法mima = mi; return mima;_x0001_页脚内容 13class MF extends JFrame implements ActionListener / 导入接口类JTextField t1;JLabel l1, l2, l3, l4;JButton b1, b2, b3;JPasswordField password;JPanel p1,p2,p3,p31,p32,p33,p321,p322;Account a=new Account100; int v;public static void main(String args)new MF();public MF()_x0001_页脚内容 14a0 = new Account(shishi, 123456, 10000);int v=1;this.setSize(500,300); password = new JPasswordField(12);t1 = new JTextField(10);l1 = new JLabel( 用户);l2 = new JLabel( 密码); l3 = new JLabel( 未注册用户请注册 );l4 = new JLabel( 欢迎使用 ATM);b1 = new JButton( 注册);b2 = new JButton( 确定);b3 = new JButton( 取消);b1.addActionListener(this); /B1 申请监听b2.addActionListener(this); /B2 申请监听QX qx = new QX(t1,password);_x0001_页脚内容 15b3.addActionListener(qx); /B3 申请监听setLayout(new GridLayout(3, 1); / 布局管理p1 = new JPanel();p2 = new JPanel();p3 = new JPanel();this.add(p1);this.add(p2);this.add(p3);p3.setLayout(new GridLayout(1, 3);p31 = new JPanel();p32 = new JPanel();p33 = new JPanel();p3.add(p31);p3.add(p32);p3.add(p33);p32.setLayout(new GridLayout(1, 2);p321 = new JPanel();_x0001_页脚内容 16p322 = new JPanel();p32.add(p321);p32.add(p322);p1.add(l4);p2.add(l1);p2.add(t1);p2.add(l2);p2.add(password);p2.add(l3);p2.add(b1);p321.add(b2);p322.add(b3);p1.setBackground(Color.pink);p2.setBackground(Color.pink);p31.setBackground(Color.pink);p321.setBackground(Color.pink);p322.setBackground(Color.pink);_x0001_页脚内容 17p33.setBackground(Color.pink);this.addWindowListener(new MyWindowMonitor();this.setVisible(true);public void actionPerformed(ActionEvent e) / 监听类if (e.getSource() = b1) / 判断是否是 b1new ZC(v,a); / 进入 qukuansetVisible(false);if (e.getSource() = b2) / 判断是否是 b1String x = t1.getText(); / 把 TF1 的值强制转换成字符if (x.equals(a0.code) / 检查到开始判断是否匹配_x0001_页脚内容 18for (int i = 1; i = 3; i+) / 利用 for 循环来判断错误密码输入次数if (password.getText().equals(a0.mima) / 名字匹配成功后判断密码是否成功new denlu(a0); / 密码输入正确后进入denlu的界面setVisible(false); elseJOptionPane.showMessageDialog(null, 对不起密码错误+n您还有 + (3 - i) + 次机会 ,否则将会吞卡! );/ 密码错误弹出提示密码错误框break;_x0001_页脚内容 19class MyWindowMonitor implements WindowListener / 窗口监听public void windowActivated(WindowEvent e) public void windowClosed(WindowEvent e) public void windowClosing(WindowEvent e) System.exit(-1); public void windowDeactivated(WindowEvent e) public void windowDeiconified(WindowEvent e) public void windowIconified(WindowEvent e) _x0001_页脚内容 20 public void windowOpened(WindowEvent e) class ZC extends JFrame implements ActionListener JPanel p1,p2,p3,p4; JButton b1;JLabel l1,l2,l3;JTextField t1;JPasswordField password; Container content; int v,j; Account a;public ZC(int v,Account a) _x0001_页脚内容 21this.v=v;this.a=a;p1 = new JPanel();l1 = new JLabel( 用户注册 );p1.add(l1);p2 = new JPanel(); l2 = new JLabel( 姓名);t1 = new JTextField(10);p2.add(l2);p2.add(t1);p3 = new JPanel();l3 = new JLabel( 密码);password = new JPasswordField(12);p3.add(l3);p3.add(password);p4 = new JPanel();b1 = new JButton( 确定);_x0001_页脚内容 22b1.addActionListener(this);p4.add(b1);p1.setBackground(Color.pink);p2.setBackground(Color.pink);p3.setBackground(Color.pink);p4.setBackground(Color.pink);content = this.getContentPane(); / 布局定义content.setLayout(new GridLayout(4, 1);content.add(p1);content.add(p2);content.add(p3); content.add(p4); this.pack();this.setLocation(100, 100);this.setTitle( 用户注册 ); this.setSize(500, 300); this.setResizable(false);_x0001_页脚内容 23this.show();public void actionPerformed(ActionEvent event) / 接口监听 String x = t1.getText();for(int j=0;jv;j+)if (x.equals(aj.code)JOptionPane.showMessageDialog(null, 该用户已存在,请重新命名 );t1.setText();elseav=new Account(null,null,0);av.code = x;_x0001_页脚内容 24av.mima= password.getText();av.money = 5000;JOptionPane.showMessageDialog(null, 注册成功 );new denlu(aj); setVisible(false); class QX implements ActionListenerJTextField n1;JPasswordField n2;public QX(JTextField n1,JPasswordField n2 )this.n1=n1;_x0001_页脚内容 25this.n2=n2;public void actionPerformed(ActionEvent e)n1.setText();n2.setText();class denlu extends JFrame implements ActionListener / 导入接口类JPanel p2,p3,p4; JButton b1, b2, b3, b4, b5;JLabel l1; Container content; Account key; / 定义客户类传从参数key_x0001_页脚内容 26public denlu(Account key)this.key = key; / 把 key传到顶层容器p2 = new JPanel();l1 = new JLabel( 欢迎进入用户界面 );p2.add(l1);p3 = new JPanel(); b1 = new JButton( 取款); b1.addActionListener(this); /b1 申请监听b2 = new JButton( 存款); b2.addActionListener(this); /b2 申请监听b3 = new JButton( 查询余额 ); b3.addActionListener(this); /b3 申请监听b4 = new JButton( 修改密码 ); b4.addActionListener(this); /b4 申请监听p3.add(b1);p3.add(b2);_x0001_页脚内容 27p3.add(b3);p3.add(b4);p4 = new JPanel(); b5 = new JButton( 退出); b5.addActionListener( / 定义一个匿名类new ActionListener()public void actionPerformed(ActionEvent event)System.exit(0); / 退出登陆p4.add(b5);p2.setBackground(Color.pink);p3.setBackground(Color.pink);p4.setBackground(Color.pink);content = this.getContentPane(); / 布局定义_x0001_页脚内容 28content.setLayout(new GridLayout(3, 1);content.add(p2);content.add(p3); content.add(p4); this.pack();this.setLocation(100, 100);this.setTitle(ATM); this.setSize(500, 300); this.setResizable(false);this.show();public void actionPerformed(ActionEvent event) / 接口监听if (event.getSource() = b1) / 判断是否是 b1new qukuan(key); / 进入 qukuansetVisible(false);_x0001_页脚内容 29if (event.getSource() = b2) / 判断是否是 b2new cunkuan(key); / 进入 cunkuansetVisible(false);if (event.getSource() = b3) / 判断是否是 b3new chaxun(key); / 进入 chaxunsetVisible(false);if (event.getSource() = b4) / 判断是否是 b4new gaimi(key); / 进入 gaimisetVisible(false);_x0001_页脚内容 30class qukuan extends JFrame implements ActionListener / 导入接口类 JPanel P1,P2,P3; JLabel L1; JButton B1, B2; JTextField TF1; Container content; Account key; / 定义客户类传从参数keypublic qukuan(Account key)this.key = key; / 把 key传到顶层容器P1 = new JPanel(); L1 = new JLabel( 请输入您要取的金额: ); P1.add(L1);P2 = new JPanel(); _x0001_页脚内容 31TF1 = new JTextField(10); P2.add(TF1);P3 = new JPanel(); B1 = new JButton( 确定); B1.addActionListener(this); /B1 申请一个监听B2 = new JButton( 返回); B2.addActionListener(this); /B2 申请一个监听P3.add(B1);P3.add(B2);P1.setBackground(Color.pink);P2.setBackground(Color.pink);P3.setBackground(Color.pink);content = this.getContentPane(); / 布局定义content.setLayout(new GridLayout(3, 1);content.add(P1);content.add(P2); content.add(P3); _x0001_页脚内容 32this.pack();this.setLocation(100, 100);this.setTitle( 取款); this.setSize(500,300); this.setResizable(false);this.show();public void actionPerformed(ActionEvent e) / 接口监听类if (e.getSource() = B1) / 判断是是否是 B1double money =Double.parseDouble(TF1.getText(); / 把 money转成 Doubleif (money % 100 = 0 & money 0)JOptionPane.showMessageDialog(this, 取 款 成 功 , 你 已 经 成 功 取 款 + TF1.getText() + 元!);key.set_Balance(money); / 把存的钱传回客户类TF1.setText();_x0001_页脚内容 33return;elseJOptionPane.showMessageDialog(this, 对不起,你所输入的金额有误+n每次取款金额为的倍数且总额不得超过5000元+n请您重新输入! );if (e.getSource() = B2) / 判断是是否是 B2new denlu(key); / 返回 denlusetVisible(false);class cunkuan extends JFrame implements ActionListener / 导入接口类_x0001_页脚内容 34JPanel P1,P2; JLabel L1; JButton B1, B2; JTextField TF1; Container content; Account key; / 定义客户类传从参数keypublic cunkuan(Account key)this.key = key; / 把 key传到顶层容器P1 = new JPanel(); L1 = new JLabel( 请输入您要存入的金额: ); TF1 = new JTextField(10); P1.add(L1);P1.add(TF1);P2= new JPanel(); B1 = new JButton( 确定); B1.addActionListener(this); /B1 申请一个监听_x0001_页脚内容 35B2 = new JButton( 返回); B2.addActionListener( / 定义一个匿名类监听new ActionListener()public void actionPerformed(ActionEvent event)KQActionPerformed(event););P2.add(B1);P2.add(B2);P1.setBackground(Color.pink);P2.setBackground(Color.pink);content = this.getContentPane(); / 布局定义content.setLayout(new GridLayout(2, 1);content.add(P1); _x0001_页脚内容 36content.add(P2); this.pack();this.setLocation(100, 100);this.setTitle( 存款); this.setSize(500,300); this.setResizable(false);this.show(); / 显示public void actionPerformed(ActionEvent e) / 接口监听类if (e.getSource() = B1) / 判断是是否是 jb1double money = Double.parseDouble(TF1.getText(); / 把 money转成 Doubleif (money = 0)JOptionPane.showMessageDialog(this, 存 款 成 功 , 你 已 经 成 功 存 款 + TF1.getText() + 元!);key.reccount(money); / 把存的钱传回客户类_x0001_页脚内容 37TF1.setText();return;elseJOptionPane.showMessageDialog(this, 对不起,你所输入的金额有误+n要求不能出现负存款 );public void KQActionPerformed(ActionEvent event) / 匿名类监听过程if (event.getSource() = B2) / 判断要是 B2new denlu(key); / 返回 denlu界面setVisible(false);_x0001_页脚内容 38class chaxun extends JFrame implements ActionListener / 导入接口类JPanel P1,P2; JLabel L1; JButton B1; Container content; Account key; / 定义客户类传从参数keypublic chaxun(Account key)this.key = key; / 把 key传到顶层容器P1 = new JPanel(); L1 = new JLabel( 您的剩余金额为: + key.get_Money()+ 元);P1.add(L1);P2 = new JPanel(); B1 = new JButton( 返回);B1.addActionListener(this);_x0001_页脚内容 39P2.add(B1);P1.setBackground(Color.pink);P2.setBackground(Color.pink);content = this.getContentPane(); / 布局定义content.setLayout(new GridLayout(2, 1);content.add(P1); content.add(P2); this.pack();this.setLocation(100, 100);this.setTitle( 查 询 余 额); this.setSize(500, 300); this.setResizable(false);this.show();public void actionPerformed(ActionEvent e) / 接口监听类if (e.getSource() = B1) / 判断是否是 B1 _x0001_页脚内容 40new denlu(key); / 返回 denlusetVisible(false);class gaimi extends JFrame implements ActionListener / 导入接口类JPanel P1, P2,P3,P4; JLabel L1, L2, L3; JTextField TF1, TF2, TF3; JButton B1, B2; Container content; Account key; / 定义客户类传从参数keypublic gaimi(Account key)this.key = key; / 把 key传到顶层容器_x0001_页脚内容 41P1 = new JPanel();P2 = new JPanel(); P3 = new JPanel(); L1 = new JLabel( 请输入您的原始密码: ); L2 = new JLabel( 请输入您要修改的密码: );L3 = new JLabel( 请确认您要修改的密码: ); TF1 = new JTextField(15); TF2 = new JTextField(15); TF3 = new JTextField(15); P1.add(L1);P1.add(TF1);P2.add(L2);P2.add(TF2);P3.add(L3);P3.add(TF3);P4 = new JPanel(); B1 = new JButton( 确定); _x0001_页脚内容 42B1.addActionListener(this); /B1 申请监听B2 = new JButton( 返回登录 ); B2.addActionListener(this); /B2 申请监听P4.add(B1);P4.add(B2);P1.setBackground(Color.pink);P2.setBackground(Color.pink);P3.setBackground(Color.pink);P4.setBackground(Color.pink);content = this.getContentPane(); / 布局定义content.setLayout(new GridLayout(4, 1);content.add(P1); content.add(P2);content.add(P3);content.add(P4); this.pack();this.setLocation(100, 100);_x0001_页脚内容 43this.setTitle( 修改密码); this.setSize(500, 300); this.setResizable(false);this.show(); / 显示public void actionPerformed(ActionEvent e) / 接口监听类boolean flag = false; / 用来标志密码不能出现全部相同的数字if (e.getSource() = B1) / 判断是否是 B1 if (TF1.getText().equals(key.mima) / 判断你输入的 mima是否正确if (TF2.getText().length() 6) / 判断新密码长度是否大于或等于JOptionPane.showMessageDialog(null, 新 密码 长 度 必 须 大 于 或 等 于位+n错误提示 );elsefor (int i = 0; i TF2.getText().length(); i+)/用一个循环来查询密码是否全部_x0001