1、课程论文现代软件工程与实践题 目: ATM 柜员机模拟程序 学院(系): 信息工程学院 专业班级: 学生姓名: 指导教师: 2011 年 12 月 4 日摘 要通过设计 ATM 柜员模拟程序,加深自己对 Java 编程尤其是对 Java 图形用户界面编程的了解,将自己的学到的编程知识融会贯通,同时培养自身面向对象软件开发的思维,初步了解软件开发的一般流程,提高用 Java 实际动手能力并增强自己对面向对象的了解。通过这次编程设计,加深了对 Java 图形界面编程中各个模块和组件的应用了解,以及类和类之间的关系,界面排版的处理等。设计要求是,当输入给定的卡号和密码(初始卡号和密码为 123456
2、)时,系统能登录 ATM 柜员机系统,用户可以按照以下规则进行(规则可以按照实际系统做需求):(1)查询余额:初始余额为 10000 元。 (2)ATM 取款:每次取款金额为 100 的倍数,总额不超过 5000 元,支取金额不允许透支。 (3)ATM 存款:不能出现负存款。 (4)修改密码:新密码长度不小于 6 位,不允许出现 6 位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。该程序设置了 7 个类,1 个主类 6 个辅助类,6 个辅助类都是内部类的形式,辅助类包括五个实现 ATM 的功能,一个存放客户资料,之所以用内部类来实现是为了在各个界面转
3、换时不至于要创建多个对象,每一个辅助类的对象只要在主类中创建一次就可以在各个内部类中引用。该程序利用的功能是利用 Java 事件监听技术来实现的,各种功能单独的创建一个类来实现,不会互相混淆,更加容易理清楚思路。设计的程序完美的实现了设计要求,具有查询、取款、存款、修改密码等功能。目 录摘 要 .I目 录 II1 前言.11.1 设计任务 11.1.1 需求说明11.2 设计内容 12 程序要求.13 算法分析.24 流程图.35 程序源代码及说明.45.1 程序源代码 45.2 源代码说明 215.2.1 源代码中自定义类的说明:215.2.2 源代码中的事件监听器.226 调试及运行结果.
4、237 体会.298 参考文献.301 前言1.1 设计任务1.1.1 需求说明随着市场经济的繁荣发展,人们的物质生活得到极大的提高,手中的剩余资金也日益增多。受传统观念影响,绝大多数人喜欢把资金投进银行,而在需要使用现金的时候再到银行提取现金。这就导致银行业务的急剧增加。虽然银行网点越来越多,银行的工作效率也随着信息化有较明显的增长,但是依旧不能满足广大用户的需要。而一味的增加营业网点,从理论上虽然能稍微的缓解银行的压力,但是治标不治本,而且每增加一个网点,不仅要付出昂贵的资金成本,还需要长期投入人力资本,成本非常之昂贵。这时候就迫切的需要一种自动的,易于普及的,低成本的设备来解决这一问题。
5、于是 ATM 机系统应运而生了。本文正是通过设计一个 ATM 模拟模拟程序来实现 ATM 机系统的基本功能,充分运用自己所学的 Java 知识进行设计编程。1.2 设计内容(1)程序要求 (2)算法分析 (3)流程图 (4)源程序 (5)调试及运行结果(6)体会2 程序要求本 ATM 柜员机的主要功能如下所述:要求使用图形用户界面。当输入给定的卡号和密码(初始卡号和密码为 123456)时,系统能登录 ATM 柜员机系统,用户可以按照以下规则进行: 查询余额:初始余额为 10000 元。 ATM 取款:每次取款金额为 100 的倍数,总额不超过 5000 元,支取金额不允许透支。 ATM 存款
6、:不能出现负存款。 修改密码:新密码长度不小于 6 位,不允许出现 6 位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。3 算法分析通过程序要求,我们可以清楚的知道本次设计的 ATM 柜员模拟程序需要实现四大功能,即查询余额、取款、存款、修改密码。初次之外,作为 ATM 系统,还需要最基本的两大功能,即登陆和退出。根据上述的功能分析,我们可以吧整个 ATM 系统分为登陆模块、查询模块、取款模块、存款模块、修改密码模块。除此之外,还有在登陆系统后的功能选择模块,退出功能则镶嵌在各个需要的模块中。由于各个模块的功能实现是通过界面显示出来的,则程序设计又可
7、以理解为几大界面的设计:登陆界面、主界面、查询余额界面、取款界面、存款界面、修改密码界面。除了几大界面之外,还有系统的初始化,主要是初始卡号、密码的设定等。在程序的大体框架确定之后,我们需要了解各个模块所要实现和需要具有的功能。根据现有的银行 ATM 系统,我们可以很快就可以了解本次设计的 ATM 系统应该具有的操作。(1)登陆界面用户输入正确的账号和密码就可以登录到该系统的主界面中去,进行相应的操作:取款、存款、查询、修改密码。(2)主界面主界面包括查询、存款、取款、修改密码、退出的功能按钮,按下相应的按钮,可以进行相应的操作。(3)查询界面在主界面中按下查询按钮可以进行查询操作。通过查询功
8、能我们可以查询账户的余额,在查询过程中我们可以选择取款的业务,除此之外,查询界面之中还有返回和退出的操作。返回的操作会使用户回到主界面,退出的操作会使用户直接回到登陆界面。(4)取款界面取款界面既可以通过主界面进入,也可以通过查询、存款等操作过程中的界面进入。取款功能在对话框中输入你想要取出的金额,但是次金额不可以比账户的余额大,且必须是 100 的整数倍,取款完毕,会弹出是否显示余额的提示,选“是”的话就会进入查询界面,选“否”的话,则回到主界面。(5)存款界面在主界面按下存款按钮可以进行存款操作,在对话中输入你需要存入的金额,所输入的数字也要是 100 的整数倍,而且不可以是负数。存款完毕
9、,会弹出是否显示余额的提示,选“是”的话就会进入查询界面,选“否”的话,则回到主界面。(6)修改密码选择修改密码按钮可以进行修改密码房,但是要先输入就密码正确并且两次输入新密码一致才可以修改密码。修改完成后,会返回主界面。4 流程图业业业业业业业业业业业业业业业业业业业业业业业业业业业 业业 业业业业业业业业业业业业 业业 业业业业业业 业业业业 业业业业 业业业业 业业业业业业NNN NYYYY图 1 程序流程图5 程序源代码及说明5.1 程序源代码import javax.swing.*;import javax.swing.JOptionPane;import java.awt.even
10、t.*;public class ATMmodel Account myaccount=new Account();Load load=new Load();MainFrame Jmain=new MainFrame();Take take=new Take();Input input=new Input();Display dis=new Display();Setpw setpw=new Setpw();public ATMmodel() JOptionPane.showMessageDialog(null,“欢迎使用 ATM 柜员模拟系统“);public static void mai
11、n(String args) ATMmodel atm=new ATMmodel();/*创建账户*/class Account private int count=10000; /初始账户余额 10000private String account=“123456“; /初始账号private String password=“123456“; /初始密码public Account() public void setpw(String password)this.password=password; public void deccount(int money)count-=money;p
12、ublic void reccount(int money)count+=money;public int get()return count;public String getaccount() /账号return account;public String getpw()return password;/* 主界面*/class MainFrame extends JFrame public JButton checked; public JButton cunkuan;public JButton quit;public JButton qukuan;public JButton res
13、et;public MainFrame() initComponents(); this.setLocationRelativeTo(null); / this.setVisible(false); /* 控件初始化*/private void initComponents() cunkuan = new JButton();qukuan = new JButton();checked = new JButton();reset = new JButton();quit = new JButton();setDefaultCloseOperation(WindowConstants.EXIT_
14、ON_CLOSE); setTitle(“ATM 柜员模拟程序 “);setName(“mianframe“);setResizable(false); cunkuan.setText(“存款“);cunkuan.addActionListener(new ActionListener() public void actionPerformed(ActionEvent evt) cunkuanActionPerformed(evt););qukuan.setText(“取款 “);qukuan.addActionListener(new ActionListener() public void
15、 actionPerformed(ActionEvent evt) qukuanActionPerformed(evt););checked.setText(“查询“);checked.addActionListener(new ActionListener() public void actionPerformed(ActionEvent evt) checkedActionPerformed(evt););reset.setText(“修改密码“);reset.addActionListener(new ActionListener() public void actionPerforme
16、d(ActionEvent evt) resetActionPerformed(evt); );quit.setText(“退出“);quit.addActionListener(new ActionListener() public void actionPerformed(ActionEvent evt) quitActionPerformed(evt););GroupLayout layout = new GroupLayout(getContentPane(); /GroupLayout 它将组件按层次分组,以决定它们在 Container 中的位置getContentPane().s
17、etLayout(layout);layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addComponent(cunkuan)
18、.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 105, Short.MAX_VALUE).addComponent(reset).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addComponent(qukuan).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 143, Short.MAX_V
19、ALUE).addComponent(quit).addComponent(checked).addContainerGap();layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(46, 46, 46).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).ad
20、dComponent(cunkuan).addComponent(reset).addGap(51, 51, 51).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(quit).addComponent(qukuan).addGap(57, 57, 57).addComponent(checked).addGap(39, 39, 39);pack();private void quitActionPerformed(ActionEvent evt) load
21、.setVisible(true);this.setVisible(false); private void resetActionPerformed(ActionEvent evt) setpw.setVisible(true);this.setVisible(false);private void checkedActionPerformed(ActionEvent evt) dis.setVisible(true);this.setVisible(false);private void qukuanActionPerformed(ActionEvent evt) take.setVisi
22、ble(true);this.setVisible(false);private void cunkuanActionPerformed(ActionEvent evt) input.setVisible(true);this.setVisible(false); /*登录界面*/ class Load extends JFrame public JPasswordField Jpassword; public JTextField accountnum;public JButton commit;private JLabel jL1;private JLabel jL2;public Loa
23、d() initComponents(); this.setLocationRelativeTo(null);this.setVisible(true);private void initComponents() jL1 = new JLabel(); jL2 = new JLabel();accountnum = new JTextField();commit = new JButton();Jpassword = new JPasswordField();setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setTitle(“AT
24、M 柜员模拟程序 “);setResizable(false);jL1.setText(“账号:“);jL2.setText(“密码:“);commit.setText(“确定“); commit.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) commitActionPerformed(evt););javax.swing.GroupLayout layout = new javax.swing.GroupLayo
25、ut(getContentPane();getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequenti
26、alGroup().addContainerGap(50, Short.MAX_VALUE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(jL1).addComponent(jL2).addGap(31, 31, 31).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false).addComponent(Jpassword).addCompo
27、nent(accountnum, javax.swing.GroupLayout.DEFAULT_SIZE, 143, Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addGap(122, 122, 122).addComponent(commit).addContainerGap(72, Short.MAX_VALUE);layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(
28、layout.createSequentialGroup().addGap(85, 85, 85).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(accountnum, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jL1).addGap(41
29、, 41, 41).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jL2).addComponent(Jpassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentP
30、lacement.RELATED, 72, Short.MAX_VALUE).addComponent(commit).addGap(64, 64, 64);pack();private void commitActionPerformed(ActionEvent evt) if(accountnum.getText().equals(myaccount.getaccount() this.setVisible(false);accountnum.setText(“);Jpassword.setText(“);elseJOptionPane.showMessageDialog(null,“密码
31、与账户不匹配,请重新输入“,“出错提示“,1);accountnum.setText(“);Jpassword.setText(“);/*取款界面*/class Take extends JFrame public JButton back;public JButton clear;public JButton commit;private JLabel jL1;public JTextField jT1;public JButton quit; String str=“; public Take() initComponents();this.setLocationRelativeTo(nu
32、ll);this.setVisible(false);private void initComponents() jL1 = new JLabel();jT1 = new JTextField();commit = new JButton();back = new JButton();quit = new JButton();clear = new JButton();setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);jL1.setText(“取款金额:“); commit.setText(“确定“);commit.addActio
33、nListener(new ActionListener() public void actionPerformed(ActionEvent evt) commitActionPerformed(evt););back.setText(“返回“);back.addActionListener(new ActionListener() public void actionPerformed(ActionEvent evt) backActionPerformed(evt););quit.setText(“退出“);quit.addActionListener(new ActionListener
34、() public void actionPerformed(java.awt.event.ActionEvent evt) quitActionPerformed(evt););clear.setText(“清除“);clear.addActionListener(new ActionListener() public void actionPerformed(ActionEvent evt) clearActionPerformed(evt););javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentP
35、ane();getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(41, 41, 41).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSeq
36、uentialGroup().addComponent(jL1).addGap(33, 33, 33).addComponent(jT1, javax.swing.GroupLayout.PREFERRED_SIZE, 174, javax.swing.GroupLayout.PREFERRED_SIZE).addGroup(layout.createSequentialGroup().addComponent(clear).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 147, Short.MAX_VA
37、LUE).addComponent(quit).addGroup(layout.createSequentialGroup().addComponent(commit).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 147, Short.MAX_VALUE).addComponent(back).addContainerGap(69, javax.swing.GroupLayout.PREFERRED_SIZE);layout.setVerticalGroup(layout.createParallelG
38、roup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(103, 103, 103).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jL1).addComponent(jT1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SI
39、ZE, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(61, 61, 61).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(commit).addComponent(back).addGap(29, 29, 29).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(clear
40、).addComponent(quit).addContainerGap(65, Short.MAX_VALUE);pack();private void clearActionPerformed(ActionEvent evt) str=“; jT1.setText(str);private void quitActionPerformed(ActionEvent evt) load.setVisible(true);this.setVisible(false);private void backActionPerformed(ActionEvent evt) Jmain.setVisibl
41、e(true);this.setVisible(false);private void commitActionPerformed(ActionEvent evt) if(Integer.parseInt(jT1.getText()0 jT1.setText(str);private void commitActionPerformed(java.awt.event.ActionEvent evt) if(Integer.parseInt(jT1.getText()%100=0)int a=Integer.parseInt(jT1.getText();if(a0)JOptionPane.sho
42、wMessageDialog(null,“存款不能为负数“,“出错“,1);elsemyaccount.reccount(a);dis.set(String.valueOf(myaccount.get();int result=javax.swing.JOptionPane.showConfirmDialog(null,“是否显示余额?“,“,javax.swing.JOptionPane.YES_NO_OPTION,javax.swing.JOptionPane.QUESTION_MESSAGE);if(result=javax.swing.JOptionPane.YES_OPTION)st
43、r=“;jT1.setText(str);dis.setVisible(true);this.setVisible(false);elseJmain.setVisible(true);this.setVisible(false);elseJOptionPane.showMessageDialog(null,“存款金额必须为 100 的整数倍!“+“n 请确认你的金额“,“出错提示“,1);jT1.setText(“); /*显示余额界面*/class Display extends JFrame public JButton back;private JLabel jL1;public JTe
44、xtField jT1;public JButton quit;public JButton qukuan;public Display() initComponents();jT1.setText(String.valueOf(myaccount.get();this.setLocationRelativeTo(null);this.setVisible(false);public void set(String str) jT1.setText(str);private void initComponents() jL1 = new JLabel();jT1 = new JTextFiel
45、d();quit = new JButton();back = new JButton();qukuan = new JButton();setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);jL1.setText(“您的余额为:“);jT1.setEditable(false); quit.setText(“退出“);quit.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEv
46、ent evt) quitActionPerformed(evt););back.setText(“返回“);back.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) backActionPerformed(evt););qukuan.setText(“取款 “);qukuan.addActionListener(new java.awt.event.ActionListener() public void acti
47、onPerformed(java.awt.event.ActionEvent evt) qukuanActionPerformed(evt););javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane();getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.cr
48、eateSequentialGroup().addGap(27, 27, 27).addComponent(jL1).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(jT1, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(36, Short.MAX_VALUE).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap(215, Short.MAX_VALUE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(back).