题目:两部分要求都要实现。
一、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(信用卡用户)类。
第一段代码:
1 package ATM; 2 import java.io.*; 3 import java.util.Calendar; 4 import java.util.GregorianCalendar; 5 import java.util.Scanner; 6 import java.util.StringTokenizer; 7 8 abstract class Account1{ 9 //抽象类,现金类用户和信用卡用户父类。 10 String aid,name; 11 double balance;//余额 12 public void deposit(){}//存款 13 public void withdraw(){}//取款 14 public void getBalance(){}//查询余额 15 public void getMssage(){}//查询信息 16 } 17 public class CashAccount extends Account1{ 18 String cardtype;//卡的类型 19 CashAccount(){ 20 this.a>; 21 this.name=""; 22 this.balance=0; 23 } 24 CashAccount(String a,String b,double c,String d){ 25 this.aid=a; 26 this.name=b; 27 this.balance=c; 28 this.cardtype=d; 29 } 30 /* 31 *存款方法,写操作 32 */ 33 public void deposit(PrintWriter in,int i){ 34 Scanner s1=new Scanner(System.in); 35 System.out.println("请输入要存入的数额"); 36 double s=s1.nextDouble(); 37 balance=balance+s; 38 System.out.println("存款成功!您的余额为"+balance); 39 this.Writerecord(in, "存款", s,i);//调用函数 40 } 41 /* 42 * 取款方法,写操作 43 */ 44 public void withdraw(PrintWriter in,int i){ 45 System.out.println("请输入要取的数额"); 46 Scanner S=new Scanner(System.in); 47 double s=S.nextDouble(); 48 try{ 49 if(balance-s>0){ 50 balance=balance-s; 51 System.out.println("取款成功!您的余额为"+balance); 52 this.Writerecord(in, "取款", -s,i); 53 } 54 else 55 throw new WithdrawException("余额不足!重新输入!"); 56 }catch(WithdrawException e){System.out.println(e); 57 this.getMssage(s); 58 withdraw(in,i);} 59 } 60 /* 61 显示余额方法,写入操作 62 */ 63 public void getBalance(PrintWriter in,int i){ 64 System.out.println("您的余额为"+balance); 65 this.Writerecord(in, "查询余额", 0,i); 66 } 67 /* 68 改变卡类型方法 69 */ 70 public void Changetype(PrintWriter in,int i){ 71 System.out.println("您当前的卡类型为"+cardtype); 72 System.out.println("选择您需要的卡类型\n1.工资卡\n2.借记卡\n3.理财卡"); 73 Scanner S=new Scanner(System.in); 74 int s=S.nextInt(); 75 switch(s){ 76 case 1:cardtype="工资卡";break; 77 case 2:cardtype="借记卡";break; 78 case 3:cardtype="理财卡";break; 79 } 80 this.Writerecord(in, "变更卡的类型", 0,i); 81 } 82 /* 83 * 显示信息方法*/ 84 public void getMssage(double a){ 85 System.out.println("取款人"+name+"\n"+"账户余额"+balance+"\n"+"取款额"+a+"\n"+"原因:透支"); 86 } 87 /* 88 * 写文件的方法 89 * @参数 out在print writer*/ 90 public void writeData(PrintWriter out) throws IOException 91 { 92 out.println(aid + "|" 93 + name + "|" 94 + cardtype + "|" 95 + Double.toString(balance)); 96 } 97 /* 98 * 独文件的方法 99 * @ in的参数在buffer 100 */ 101 public void readData(BufferedReader in) throws IOException 102 { 103 String s = in.readLine(); 104 StringTokenizer t = new StringTokenizer(s, "|"); 105 aid=t.nextToken(); 106 name = t.nextToken(); 107 cardtype=t.nextToken(); 108 balance=t.countTokens(); 109 } 110 /* 111 * 写操作记录的方法 112 * 参数来自主类的文件路径和print writer 113 * */ 114 public void Writerecord(PrintWriter in,String op,double a,int i) { 115 String months[] = { 116 "Jan", "Feb", "Mar", "Apr", 117 "May", "Jun", "Jul", "Aug", 118 "Sep", "Oct", "Nov", "Dec"}; 119 //初始化当前时间并在后续写入文件 120 Calendar calendar = Calendar.getInstance(); 121 in.println(String.valueOf(i)+"|"+aid + "|" 122 + name + "|"+String.valueOf(calendar.get(Calendar.YEAR))+ 123 "|"+String.valueOf(months[calendar.get(Calendar.MONTH)])+"|"+ 124 String.valueOf(calendar.get(Calendar.DATE)) 125 + "|"+String.valueOf(calendar.get(Calendar.HOUR))+"|"+ 126 String.valueOf(calendar.get(Calendar.MINUTE)) 127 +"|"+op+"|" 128 + Double.toString(a)); 129 } 130 } 131 class WithdrawException extends Exception{ 132 WithdrawException(String s){super(s);} 133 }