您好,欢迎来到图艺博知识网。
搜索
您的当前位置:首页文件及输入输出流模拟ATM机

文件及输入输出流模拟ATM机

来源:图艺博知识网

题目:两部分要求都要实现。

一、ATM机的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0)。 模拟ATM的功能设计,用户插卡后显示选择语言界面,输入密码界面,用户输入正确密码(用户输入错误密码,则提示该卡已被锁定,无法操作),则弹出选择界面:存款、取款、转账汇款、修改密码、查询余额。 选择“取款”,则显示100元、500元、1000元、1500元、2000元、5000元、其他金额、退卡、返回操作供用户选择; 选择“存款”,则提示用户输入存款金额,修改余额; 选择“转账”,则提示用户输入转账行号、转账金额,并提示转账成功。 

 

二、假定银行的一个存取款系统有两类客户,一类是现金用户,一类是信用卡用户。银行对每个客户都要登记其姓名name,并为之分配一个唯一的账户号码aid,现金用户还要记录其卡的类型(工资卡、借记卡、理财卡),而信用卡用户则根据其信用级别有一定的透支限额lineOfCredit(A级10000元、B级5000元、C级2000元、D级1000元)。每种客户都可以实现存deposit、取withdraw、和查询余额getBalance,信用卡用户还可以查询透支情况findOverdraw。对于现金用户,每次取款操作只能在账户实际额度balance内操作,允许现金用户改变自己的帐户类型。

(1) 分析有哪些属性和方法可以作为两个子类的共同属性和方法,然后写出抽象类

Account的定义。

(2) 分析CashAccount有那些新增的属性和方法,定义一个继承于Account的子类

CashAccount。

(3) 分析CreditAccount有那些新增的属性和方法,然后定义一个继承于Account

的子类CreditAccount,添加增加的属性和方法。

(4) 请按照要求编写一个程序Test,用你所定义的类完成下列业务操作。

1) 用 Account 作为类型定义两个变量 credit 和 debit,分别引用

CreditAccount和CashAccount的对象,并完成存款500元的操作。

第 3 页 共 5 页

2) 每个对象完成取款200元的操作后再次取款400元,请输出各自的余额。

3) 可以通过credit查看引用对象的透支额吗,如果不能,怎样修改可以查

看?

(5) 添加一个取款异常WithdrawException,请定义异常类WithdrawException,

要求:

1) 异常对象记录取款发生时的帐户余额、取款额还有取款人。

2) 覆盖继承于超类的方法getMessage(),按以下格式返回信息:

取款人,账号余额,取款额,原因:透支。

3) 修改CashAccount的取款方法,当用户取款超出额度时,抛出异常。

4) 编写一个可执行类Test,创建一个CashAccount的对象,其初始余额为500,

连续取款2次,每次300,写出运行结果。

(6) 构建客户基本信息表(ClientInfoTable.txt)和账户流水表(BankInfoTable

.txt)两个数据文件;

客户基本信息表存储信息包括账户号码aid(唯一性),姓名name,,客户

类型(现金卡用户或信用卡用户),卡类型(工资卡、借记卡、理财卡(客户

类型为现金卡时有效)),信用卡透支类型(A级10000元、B级5000元、C级

2000元、D级1000元),卡余额,日期;

账户流水表存储信息包括序号(自动增 1,并保持唯一),账户号码,姓

名,日期,流水类型(存款、取款、透支取款),金额。

(7) 增加查询功能,可以查询账号或姓名查询客户信息,可以查询账号或姓名查询

流水信息。

(8) 增加统计功能,可以根据账号,起始日期、终止日期、流水类型,统计账号流

水信息。

***************************************************************************************************************

拿到这个题目,我开始分析出:

两类账户及其操作可以由不同的类来表示;

存款、转账、取款等操作实际上对文件的读写、修改等操作;

增加的统计功能实际上是考察如何对文件进行统一格式的读写操作。

画上代码的继承关系和类包含的方法图:

前两段代码就是展开写两个类CashAccount(现金用户)和CreditAccount(信用卡用户)类。

第一段代码:

第二段:

第三段代码包含一个Record类,其中包含读取记录和统计以及重写的ToString方法。

第三段:

第四段代码就是主类,其中包含界面控制、等操作。

第四段:

  1 package ATM;
  2 import java.io.*;
  3 import java.util.Scanner;
  4 
  5 public class Login {
  6     public static void main(String[] args){
  7         int number=1;
  8         CashAccount[] a=new CashAccount[3];
  9         CreditAccount[] b=new CreditAccount[3];
 10         a[0]=new CashAccount("01","a",100,"借记卡");
 11         a[1]=new CashAccount("02","b",100,"借记卡");
 12         a[2]=new CashAccount("03","c",100,"借记卡");
 13         b[0]=new CreditAccount("04","d",100,"A");
 14         b[1]=new CreditAccount("05","e",100,"A");
 15         b[2]=new CreditAccount("06","f",100,"A");
 16          try
 17           {
 18              // 写入文件,从末尾写入  分别写现金操作和信用卡操作
 19              //不论记录数据还是记录操作,都按现金和信用卡分别建立文件 1对应信用卡
 20              PrintWriter out = new PrintWriter(new FileWriter("C://ClientInfoTable.txt"),true);
 21              PrintWriter out1 = new PrintWriter(new FileWriter("C://ClientInfoTable1.txt"),true);
 22              PrintWriter in = new PrintWriter(new FileWriter("C://BankInfoTable.txt",true));
 23              PrintWriter in1 = new PrintWriter(new FileWriter("C://BankInfoTable1.txt",true));
 24              in.println("序号"+"|"+"卡号"+"|"+"姓名"+"|"+"年"+"|"+"月"+"|"+"日"+"|"+"时"+"|"+"分"+"|"+"操作类型"+"|"+"金额");
 25              in1.println("序号"+"|"+"卡号"+"|"+"姓名"+"|"+"年"+"|"+"月"+"|"+"日"+"|"+"时"+"|"+"分"+"|"+"操作类型"+"|"+"金额");
 26              out.println("卡号"+"|"+"姓名"+"|"+"卡类型"+"|"+"余额");
 27              out1.println("卡号"+"|"+"姓名"+"|"+"信用等级"+"|"+"可透支额"+"|"+"余额"); 
 28              writeDatacash(a, out);
 29              writeDatacredit(b, out1);
 30              do{
 31                  try{
 32                      System.out.print("请选择用户类型\t1.现金卡\t2.信用卡");
 33                      Scanner s=new Scanner(System.in);
 34                      int i=s.nextInt();
 35                      if(i==1)
 36                          {showface(a[i],in,number);
 37                          in.flush();}
 38                      else if(i==2)
 39                          {showface(a[i],in1,number);
 40                          in.flush();}
 41                      else
 42                          throw new In("错误!从1或2中选择输入");
 43                  }catch(In e){System.out.print(e);
 44                  System.exit(0);}
 45                  number++;
 46              }while(number<=6);   
 47              System.out.print("来统计一下");
 48              Statistics();
 49              out.checkError();
 50              out1.close();
 51              in.close();
 52              in1.close();
 53           }
            catch(IOException exception)
 55           {
 56              exception.printStackTrace();
 57           }
 58        }
 59     //现金用户界面
 60     static void showface(CashAccount a,PrintWriter in,int number){
 61         String s="*****************************************\n";
 62         s=s+"          模拟银行ATM系统    \n";
 63         s=s+"*****************************************\n";
          s=s+"    1、存款\n";
 65         s=s+"    2、取款\n";
 66         s=s+"    3、查询余额\n";
 67         s=s+"    4、改变卡的种类\n";
 68         s=s+"    5、输入5结束\n";
 69         do{
 70             System.out.println(s);
 71             Scanner S1=new Scanner(System.in);
 72             int i=S1.nextInt();
 73             if(i==1)
 74                 a.deposit(in,number);        
 75             else if(i==2)
 76                 a.withdraw(in,number);
 77             else if(i==3)
 78                 a.getBalance(in,number);
 79             else if(i==4)
 80                 a.Changetype(in,number);
 81             else
 82                 break;
 83             }while(true);
 84     }
 85     //信用卡用户界面
 86     static void showface(CreditAccount a,PrintWriter in,int number){
 87         String s1="*****************************************\n";
 88         s1=s1+"          模拟银行ATM系统    \n";
          s1=s1+"*****************************************\n";
 90         s1=s1+"    1、存款\n";
 91         s1=s1+"    2、取款\n";
 92         s1=s1+"    3、查询余额\n";
 93         s1=s1+"    4、查询可透支余额\n";
 94         s1=s1+"    5、输入5结束\n";
 95         do{
 96             System.out.println(s1);
 97             Scanner S1=new Scanner(System.in);
 98             int i=S1.nextInt();
 99             if(i==1)
100                 a.deposit(in,number);        
101             else if(i==2)
102                 a.withdraw(in,number);
103             else if(i==3)
104                 a.getBalance(in,number);
105             else if(i==4)
106                 a.findOverdraw(in,number);
107             else
108                 break;
109             }while(true);
110     }
111      /**
112     将信息写入文件,现金用户
113     @param out a print writer
114  */
115  static void writeDatacash(CashAccount[] employees, PrintWriter out)
116     throws IOException
117  {
118     // write number of employees
119     out.println(employees.length);
120 
121     for (CashAccount e : employees)
122        e.writeData(out);
123  }
124  /**
125  将信息写入文件,信用卡用户
126  @param out a print writer
127 */
128 static void writeDatacredit(CreditAccount[] account, PrintWriter out)
129  throws IOException
130 {
131  // write number of employees
132  out.println(account.length);
133 
134  for (CreditAccount e : account)
135     e.writeData(out);
136 }
137  /**
138     将记录信息读进Record类数组
139  */
140  static Record[] readDatarecord(BufferedReader in)
141     throws IOException
142  {
143     Record[] a = new Record[6];
144     for (int i = 0; i < 6; i++)
145     {
146        a[i] = new Record();
147        a[i].readData(in);
148     }
149     return a;
150  }
151  /**
152  读现金用户
153  @param in the buffered reader
1  @return the array of employees
155 */
156 static CashAccount[] readData(BufferedReader in)
157  throws IOException
158 {
159  // retrieve the array size
160  int n = Integer.parseInt(in.readLine());
161 
162  CashAccount[] employees = new CashAccount[n];
163  for (int i = 0; i < n; i++)
1  {
165     employees[i] = new CashAccount();
166     employees[i].readData(in);
167  }
168  return employees;
169 }
170  /**
171  Reads an array of 信用卡用户 from a buffered reader将文件信息读为数组
172  @param in the buffered reader
173  @return the array of employees
174 */
175 static CreditAccount[] readDatacredit(BufferedReader in)
176  throws IOException
177 {
178  CreditAccount[] a = new CreditAccount[6];
179  for (int i = 0; i < 6; i++)
180  {
181     a[i] = new CreditAccount();
182     a[i].readData(in);;
183  }
184  return a;
185 }
186 /*
187  * 实现统计功能
188  * */
1 static void Statistics()throws IOException{
190      // 将文件中的内容读进一个新数组
191     BufferedReader in = new BufferedReader(new FileReader("C:\\BankInfoTable.txt"));
192     String t=in.readLine();
193     BufferedReader in1 = new BufferedReader(new FileReader("C:\\BankInfoTable1.txt"));
194     String t1=in1.readLine();
195     do{
196         try{
197             System.out.print("请选择用户类型\n1.现金卡\n2.信用卡\n3.退出");
198              Scanner s=new Scanner(System.in);
199              int i=s.nextInt();
200              Record a=new Record();
201              if(i==1)
202              {Record[] newcashaccount=readDatarecord(in);
203              System.out.println("选择查询方式:\n1.查询您的所有历史操作记录\n2.按日期查询");
204              int j=s.nextInt();
205              if(j==1)
206                  a.Sort(newcashaccount, 1, "02");
207              else
208                  a.Sort(newcashaccount, 2, "02");
209              }
210              else if(i==2)
211              {Record[] newcashaccount1=readDatarecord(in1);
212              System.out.println("选择查询方式:\n1.查询您的所有历史操作记录\n2.按日期查询");
213              int j=s.nextInt();
214              if(j==1)
215                  a.Sort(newcashaccount1, 1, "02");
216              else
217                  a.Sort(newcashaccount1, 2, "02");} 
218              else if(i==3)
219                  break;
220              else
221                  throw new In("错误!从1或2中选择输入");
222         }catch(In e){System.out.print(e);
223         System.exit(0);}
224     }while(true);     
225     in.close();
226     in1.close();
227 }
228 }
229 class In extends Exception{
230     In(String s){super(s);}
231 }
View Code

那么现在我把四段代码中的方法的功能参数等写下,然后再把结构说一下就OK。

 本来想做一个类似JDK帮助文档的东西,但是方法太多了,懒得弄,自己看吧。这次的代码注释写的很好,你们应该可以看懂,注意参数啊。

1.实现ATM的存取,转账,查询其实就是对文件的查找修改操作。每一个账户建立一个文件存他的账户信息,要用到就打开修改即可。你们可以看到每个类都包含write和read的方法,就是用来读取文件和修改文件。其中求该文件其实就是重写。

2.存取文件用到一个技巧:用“|”隔开,并用StringTokenizer中包含的方法设置分隔符读取。

3.记录操作记录,可以看到两个用户类中都包含wrtiteRecord方法,就是用来记录操作的,每一个操作对应的方法最后都加入一个此方法就能实现操作的记录。

4查询,很简单,直接读取记录操作的文件,然后转换成数组统计即可。

评价:

1.这次的代码做的比较好的地方就是结构,尽量把功能模块化来写,调试的时候很容易发现错误;而且方法之间互相调用,可以减少大量重复的功能代码。

2.主方法不要写的很冗杂,尽量写的简介,调试很节省时间。

3.这回注释写的比较详细。

1.还是有些问题,先说一个硬伤:调用scanner类中的in方法从控制台读取输入时,要关闭in这个流。但是如果一个方法多次用到in方法,而且每次还关闭,就会出错。我查到的一个解释是:一个方法多次使用in方法,前面的in关闭会影响后面的in。对,你们也能看到,我这个多次在循环中用到in,多次调试显示:第一次可以执行,后面就要报错。对,因为第一次执行完in就关闭了。好,现在这个问题我还没解决!不过我有个想法,我可以在循环外建立in,在循环结束统一关闭。虽然不关闭in不会报错,那是因为现在的代码很短很简单,将来代码长了没准就出问题,还是避免的好。我现在要做到:最基本不报错,尽量做到没警告!

2.毕竟没受过专业训练,代码还是写的不是非常专业,继续学习!

转载于:https://www.cnblogs.com/cxy2016/p/6349700.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuoyibo.net 版权所有 湘ICP备2023021910号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务