JAVA 期中课程设计报告报告题目:ATM模拟程序姓名:刘佳学号:2009118287学院:信息科学与技术学院专业:计算机科学与技术班级:2009级计科(2)班一、课程设计目的和内容目的:课程设计的主要目的是结合面向对象程序设计课程,培养面向对象软件开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。
内容:设计ATM取款机主要包括登录页面、选择服务、存款、取款、查询余额、修改密码和退出等功能。
注:各种按钮的事件和功能简单模拟ATM取款机的要求。
二、系统需求分析(1)模拟ATM柜员机程序;(2)修改密码。
当用户需要修改密码时,可以用这个功能,新密码长度不小于6位,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
(3)取款。
用户根据自己需要取多少钱,输入要取的金额,每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
(4)查询余额。
用户需要知道自己帐户还剩多少钱时,可以查询自己帐户的余额。
(5)存款。
用户可以存款,金额为100的倍数,不能出现负存款。
(6)锁机。
当用户3次输入密码错误时,停止操作。
三、程序流程图四、程序流程图五、思路分析1、要写这个程序之前我看了书上的选举界面,想仿照这个例子的布局和参数传递来做ATM2、首先是写出各个界面,最初看了书上的选举界面的card布局,但是与我想要的ATM界面布局有所差异,所以后来想到设置窗口为card布局,再在窗口中添加每个面板3、每个面板就是一个出现的界面都是用方法写的以方便窗口调用(程序共有七个界面)4、接下来就是把每个每个面板串起来,这就要用事件来触发它,添加简单的事件。
5、把每个界面串起来后,要突破的第一个难关就是,用户登陆。
(写程序时最初考虑的是用输入输出流来做,因而我就要先写一个文本来存放我的用户名和密码以及用户的钱,首先就是读数据,我看了书上的考试系统的一个例子,我读数据则是在同一个文本中读出多个用户的信息,我则用了两次循环,把用户名、密码、钱读入后,再与我在窗口中输入的信息进行匹配)经过多次修改用户登陆成功了6、在用户登陆的时候,我们不得不考虑这样的问题,如果用户名或者是密码输入错误,我们应该怎样做,应该可以重新输入,首先的思想是光标重定位,但是当学习了线程的休眠以后就调用线程,达到了同样的效果。
7、现在就进入了选择业务的界面,会看到取款,查询余额等按钮选项。
进入第二个难关就是用输入输出流来修改密码,为了要实现这个功能,我把书上第十章的所有例子运行了一遍,看有哪些对于这个功能的实现能够有所帮助,其中发现了创建一个新文本来覆盖,我便在程序中使用了这个功能,用参数来传递修改的变量,后来在记事本中的替换功能中启发,想把改变的字符替换掉,但是这功能没有实现,最后用创建一个新的同名文本覆盖的方法实现了对于密码的修改和取款等变量改变的操作。
8、在实现大体的功能后,便对界面进行美化,首先使用了J类的Button,然后就是初始界面的“欢迎来到ATM取款机”用了线程的方法使它移动,并且设置了字体的一些样式,使字体看起来更加美观,学习了Java util类中的Date后,便在一些界面中加入了计时器。
9、由于用输入输出流做出来的ATM如果要随意的添加或者删除用户的话,其中的代码也会有一点改变,这显得有一些不方便,所以在学习Java连接数据库后,我便尝试用数据库做这个程序。
10、数据库做这个程序的主要思想就是参数传递。
相对于输入输出流要简单一点,而且它可以任意的添加或者删除用户。
因此程序的最后版本就是数据库。
七、调试与运行情况进入初始界面进入输入用户名的界面输入用户名错误时出现的界面(下面的“非法……”这一串字符会在两秒后消失这是调用线程的休眠方法)输入用户名正确后出现输入密码的界面输入密码错误后输入的界面(下面的“密码……”这一串字符会在两秒后消失这是调用线程的休眠方法)当用户名和密码都输入正确后便进入选择业务界面现在进入取款界面如果取100元钱的话,系统会出现以下提示如果选择其他的按钮,会出现以下界面如果选择余额查询的按钮会出现以下界面如果选择存钱这个按钮会出现以下界面如果你输入的金额是非法的(例如:有非数字的)便会出现以下界面现在进入修改密码界面如果你输入的原密码与你的密码不能匹配会出现以下提示信息如果你没有输入新密码或者输入时不小心敲了空格键会出现以下提示信息如果输入新密码和确认密码不相同会出现以下提示信息当你的旧密码输入正确并且新密码和确认密码相同后会出现以下提示信息八、程序代码ATM.javaimport java.sql.*;import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;import java.util.Date.*;import java.awt.color.*;import javax.swing.Timer;class frame extends Frame implements ActionListener,Runnable{ Panel Panel1,Panel2,Panel3,Panel4,Panel5,Panel6,Panel7,panel1,panel2,panel3 ,panel4,panel5,panel6,panel7,panel8,panel9,panel10,panel11,panel12,pa nel13,panel14;JButtonbutton1,button2,button3,button4,button5,button6,button7,button8,butto n9,button10,a1,a2,a3,a4,a5,b1,b2,b3,b4,b5,b6,b7,b8,c1,c2,d1,d2;Labellabel1,label2,label3,label4,label5,label6,label7,label8,label9,label1 0,label11,label12,label13,label14;TextField text,text1,text2,text3,text4;CardLayout card=new CardLayout();//系统界面布局方式float gmoney=0;int state=0;//判别多个状态 1、修改密码;2、数据输入;3、菜单 String gid,pwd;Thread Scrollwords=null;Account act=new Account();SQL sql1=new SQL();Timer time;boolean boo;Box baseBox ,boxV1,boxV2;frame(String s)//主窗口{ super(s);Scrollwords=new Thread(this);//定义一个滚动字体的线程 time=new Timer(1000,this);//定义一个时间器this.showWelcome();//------------------------------- this.showInput();this.showMenu();this.showGetMoney();//主窗口调用各个方法实现各个界面 this.showQueryLeft();this.showChangeID();this.showXT();//------------------------------------setLayout(card);add(Panel1,"Panel1");add(Panel2,"Panel2");add(Panel3,"Panel3");add(Panel4,"Panel4");add(Panel5,"Panel5");add(Panel6,"Panel6");add(Panel7,"Panel7");addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});//添加window adapter 适配器setBounds(100,100,400,280);setVisible(true);Scrollwords.start();//调用线程的run方法}public void showWelcome()//进入欢迎界面{ Panel1=new Panel();Panel1.setBounds(100,100,400,280);Panel1.setLayout(new GridLayout(3,3,10,10));label1=new Label("欢迎来到ATM提款机");label1.setAlignment(Label.CENTER);//-------------------------label1.setFont(new Font("Serif",Font.BOLD,30));//设置标签的位置,字体样式,字体颜色label1.setForeground(Color.red);//----------------------------button1=new JButton("进入");button2=new JButton("退卡");button1.addActionListener(this);button2.addActionListener(this);panel1=new Panel();panel1.add(button1);panel1.add(button2);Panel1.add(label1);Panel1.add(panel1);}public void run()//字体的移动{ while(true){ int x=label1.getBounds().x;int y=120;x=x+5;label1.setLocation(x,y);if(x>380){ x=10;label1.setLocation(x,y);}try{ Scrollwords.sleep(100);}catch(InterruptedException e){}if(boo){ return; //结束run方法,导致线程死亡。