JAVA实验——更改C++中4到12章个人银行账户管理系统案例的心得体会(第8和9章)

5.第8章:多态特性

改动的一些点:(1)由于C++中有运算符重载而JAVA中没有,故此点不做改动。

  (2)在JAVA中没有C++中虚函数的virtual关键字,取而代之的是父类中的抽象方法,同C++一样,抽象父类都是使用abstract关键字,不过在JAVA中,子类实现父类方法时就相当于完成了C++中虚函数的功能。

  (3)JAVA中没有sizeof()来计算数组所占内存空间大小,故在计算对象数组长度时,采用对象数组引用的length静态域变量直接得到数组长度。

  (4)对于输入方面,JAVA中没有getline(cin,string)来读入输入的一行命令,而是通过扫描器类Scanner以及其中一系列nextXX()方法,如next()读入输入的字符串,nextLine()读入一行。输入的文本以空格等为分隔符。另外为了能够只读入一个字符,可以使用String类的charAt(index)方法。

源代码:

Date类和Accumulator都与第7章一样,其余类的代码如下:

SavingsAccount8类(父类):

abstract public class SavingsAccount8 {

private String id;
private double balance;
private static double total=0;//所有账户的总金额
protected SavingsAccount8(final Date date,final String id){
this.id=id;
balance=0;
date.show();
System.out.println("\t#"+id+" created");
}
protected final void error(final String msg) {
System.out.println("Error(#"+id+"):"+msg);
}
//记录一笔账,有日期、金额和说明(desc)
protected void record(final Date date,double amount,final String desc){
amount=Math.floor(amount*100+0.5)/100;//保留小数点后两位
total+=amount;
balance+=amount;
date.show();
System.out.println("\t#"+id+"\t"+amount+"\t"+balance+"\t"+desc);
}
public final String getId(){return id;}
public final double getBalance(){return balance;}
public static double getTotal(){return total;}
abstract public void deposit(final Date date,double amount,final String desc);
//取出现金,data为日期,amount为金额,desc为款项说明
abstract public void withdraw(final Date date,double amount,final String desc);
//结算(计算利息、年费等),每月结算一次,date为结算日期
abstract public void settle(final Date date);
public void show(){
System.out.print(id+"\tBalance: "+balance);
}

}

SavingsAccount81类(子类1):

public class SavingsAccount81 extends SavingsAccount8{
private Accumulator acc;//辅助计算利息的累加器
private double rate;//存款的年利率
public SavingsAccount81(final Date date,final String id,double rate){
super(date,id);
this.rate=rate;
acc=new Accumulator(date,0);
}
public final double getRate(){return rate;}
//存入和取出现金
public void deposit(final Date date,double amount,final String desc){
record(date,amount,desc);
acc.change(date, getBalance());
}
public void withdraw(final Date date,double amount,final String desc){
if(amount>getBalance())
System.out.println("not enough money");
else{
record(date,-amount,desc);
acc.change(date, getBalance());
}
}
public void settle(final Date date){
if(date.getMonth()==1) {
double interest=acc.getSum(date)*rate/date.distance(new Date(date.getYear()-1,1,1));
if(interest!=0)
record(date,interest,"interest");
acc.reset(date,getBalance());
}
}

}

SavingsAccount82类(子类):

import java.io.IOException;
import java.util.Scanner;
public class SavingsAccount82 extends SavingsAccount8{
private Accumulator acc;
private double credit;//信用额度
private double rate;//欠款的日利率
private double fee;//信用卡年费
private final double getDebt(){
double balance=getBalance();
return (balance<0?balance:0);
}
public SavingsAccount82(final Date date,final String id,double credit,double rate,double fee){
super(date,id);
this.credit=credit;
this.rate=rate;
this.fee=fee;
acc=new Accumulator(date,0);
}
public final double getCredit(){return credit;}
public final double getRate(){return rate;}
public final double getFee(){return fee;}
public final double getAvailableCredit(){//获得可用信用额度
if(getBalance()<0)
return credit+getBalance();
else
return credit;
}
public void deposit(final Date date,double amount,final String desc){
record(date,amount,desc);
acc.change(date, getDebt());
}
public void withdraw(final Date date,double amount,final String desc){
if(amount-getBalance()>credit)
System.out.println("not enough credit");
else{
record(date,-amount,desc);
acc.change(date, getDebt());
}
}
public void settle(final Date date){
double interest=acc.getSum(date)*rate;
if(interest!=0)
record(date,interest,"interest");
if(date.getMonth()==1)
record(date,-fee,"annual fee");
acc.reset(date, getDebt());
}
public final void show(){
super.show();
System.out.print("\tAvailable credit: "+getAvailableCredit());
}
public static void main(String args[]) throws IOException{
Date date=new Date(2008,11,1);//起始日期

//建立几个账户
SavingsAccount81 sa1=new SavingsAccount81(date,"S3755217",0.015);
SavingsAccount81 sa2=new SavingsAccount81(date,"02342342",0.015);
SavingsAccount82 ca=new SavingsAccount82(date,"C5392394",10000,0.0005,50);
SavingsAccount8[] accounts= {sa1,sa2,ca};
final int n=accounts.length;//账户总数
System.out.println("(d)deposit (w)withdraw (s) show (c)change day (n) next month (e) exit");
char cmd;
Scanner s = new Scanner(System.in);
do {//显示日期和总金额
date.show();
System.out.print("\tTotal:"+getTotal()+"\tcommand");
int index,day;
double amount;
String desc;
String ss=s.next();
cmd=ss.charAt(0);
switch(cmd) {
case 'd'://存入现金
index=s.nextInt();
amount=s.nextDouble();
desc=s.nextLine();
//desc=(new BufferedReader(new InputStreamReader(System.in))).readLine();
accounts[index].deposit(date,amount,desc);
break;
case 'w'://取出现金
index=s.nextInt();
amount=s.nextDouble();
desc=s.nextLine();
//desc=(new BufferedReader(new InputStreamReader(System.in))).readLine();
accounts[index].withdraw(date,amount,desc);
break;
case 's'://查询各账户信息
for(int i=0;i<n;i++) {
System.out.print("["+i+"]");
accounts[i].show();
System.out.println("");
}
break;
case 'c'://改变日期
day = s.nextInt();
if(day<date.getDay())
System.out.print("You cannot specify a previous day");
else if(day>date.getMaxDay())
System.out.print("Invalid day");
else
date=new Date(date.getYear(),date.getMonth(),day);
break;
case 'n'://进入下个月
if(date.getMonth()==12)
date=new Date(date.getYear()+1,1,1);
else
date=new Date(date.getYear(),date.getMonth()+1,1);
for(int i=0;i<n;i++)
accounts[i].settle(date);
break;
}
}while(cmd!='e');
}

}



6.第9章:使用容器代替数组

改动的一些点:(1)将C++中的类模板实现动态数组更改为集合类中的ArrayList子类,利用容器替代数组。

      (2)在对数组进行操作时,使用ArrayList类中的size()获得数组大小、trimToSize()更新数组大小、get(index)获得指定下标的元素,remove(index)删除指定下表的元素。

源代码:

Date类和Accumulator类同第7章,其他类源代码如下:

SavingsAccount9(父类):

import java.text.DecimalFormat;

abstract public class SavingsAccount9 {
private String id;
private double balance;
private static double total=0;//所有账户的总金额
protected SavingsAccount9(final Date date,final String id){
this.id=id;
balance=0;
date.show();
System.out.println("\t#"+id+" created");
}
protected final void error(final String msg) {
System.out.println("Error(#"+id+"):"+msg);
}
//记录一笔账,有日期、金额和说明(desc)
protected void record(final Date date,double amount,final String desc){
amount=Math.floor(amount*100+0.5)/100;//保留小数点后两位
total+=amount;
balance+=amount;
date.show();
System.out.println("\t#"+id+"\t"+amount+"\t"+balance+"\t"+desc);
}
public final String getId(){return id;}
public final double getBalance(){return balance;}
public static double getTotal(){ DecimalFormat df=new DecimalFormat("#.00");
System.out.println(df.format(total));
return total;}
abstract public void deposit(final Date date,double amount,final String desc);
//取出现金,data为日期,amount为金额,desc为款项说明
abstract public void withdraw(final Date date,double amount,final String desc);
//结算(计算利息、年费等),每月结算一次,date为结算日期
abstract public void settle(final Date date);
public void show(){
System.out.print(id+"\tBalance: "+balance);
}
}


SavingsAccount91类(子类1):

public class SavingsAccount91 extends SavingsAccount9{
private Accumulator acc;//辅助计算利息的累加器
private double rate;//存款的年利率
public SavingsAccount91(final Date date,final String id,double rate){
super(date,id);
this.rate=rate;
acc=new Accumulator(date,0);
}
public final double getRate(){return rate;}
//存入和取出现金
public void deposit(final Date date,double amount,final String desc){
record(date,amount,desc);
acc.change(date, getBalance());
}
public void withdraw(final Date date,double amount,final String desc){
if(amount>getBalance())
System.out.println("not enough money");
else{
record(date,-amount,desc);
acc.change(date, getBalance());
}
}
public void settle(final Date date){
if(date.getMonth()==1) {
double interest=acc.getSum(date)*rate/date.distance(new Date(date.getYear()-1,1,1));
if(interest!=0)
record(date,interest,"interest");
acc.reset(date,getBalance());
}
}
}


SavingsAccount92类(子类2):

import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;


public class SavingsAccount92 extends SavingsAccount9{
private Accumulator acc;
private double credit;//信用额度
private double rate;//欠款的日利率
private double fee;//信用卡年费
private final double getDebt(){
double balance=getBalance();
return (balance<0?balance:0);
}
public SavingsAccount92(final Date date,final String id,double credit,double rate,double fee){
super(date,id);
this.credit=credit;
this.rate=rate;
this.fee=fee;
acc=new Accumulator(date,0);
}
public final double getCredit(){return credit;}
public final double getRate(){return rate;}
public final double getFee(){return fee;}
public final double getAvailableCredit(){//获得可用信用额度
if(getBalance()<0)
return credit+getBalance();
else
return credit;
}
public void deposit(final Date date,double amount,final String desc){
record(date,amount,desc);
acc.change(date, getDebt());
}
public void withdraw(final Date date,double amount,final String desc){
if(amount-getBalance()>credit)
System.out.println("not enough credit");
else{
record(date,-amount,desc);
acc.change(date, getDebt());
}
}
public void settle(final Date date){
double interest=acc.getSum(date)*rate;
if(interest!=0)
record(date,interest,"interest");
if(date.getMonth()==1)
record(date,-fee,"annual fee");
acc.reset(date, getDebt());
}
public final void show(){
super.show();
System.out.print("\tAvailable credit: "+getAvailableCredit());
}
public static void main(String args[]) throws IOException{
Date date=new Date(2008,11,1);
ArrayList<SavingsAccount9> accounts=new ArrayList<SavingsAccount9>(0);
//创建账户数组,元素个数为0

//final int n=accounts.length;
System.out.println("(a)add account(d)deposit (w)withdraw (s)show (c)change day (n) next month (e) exit");
char cmd;
Scanner s = new Scanner(System.in);
do {
date.show();
System.out.print("\tTotal:"+getTotal()+"\tcommand");
char type;
int index,day;
double amount,credit,rate,fee;
String id,desc;
SavingsAccount9 account;
String ss=s.next();
cmd=ss.charAt(0);
switch(cmd) {
case 'a'://增加账户
type=s.next().charAt(0);
id=s.next();
if(type=='s') {
rate=s.nextDouble();
account=new SavingsAccount91(date,id,rate);
}else {
   credit=s.nextDouble();
rate=s.nextDouble();
fee=s.nextDouble();
account=new SavingsAccount92(date,id,credit,rate,fee);
}
accounts.add(account);
accounts.trimToSize();
break;
case 'd':
index=s.nextInt();
amount=s.nextDouble();
desc=s.nextLine();
//desc=(new BufferedReader(new InputStreamReader(System.in))).readLine();
accounts.get(index).deposit(date,amount,desc);
break;
case 'w':
index=s.nextInt();
amount=s.nextDouble();
desc=s.nextLine();
//desc=(new BufferedReader(new InputStreamReader(System.in))).readLine();
accounts.get(index).withdraw(date,amount,desc);
break;
case 's':
for(int i=0;i<accounts.size();i++) {
System.out.print("["+i+"]");
accounts.get(i).show();
System.out.println("");
}
break;
case 'c':
day = s.nextInt();
if(day<date.getDay())
System.out.print("You cannot specify a previous day");
else if(day>date.getMaxDay())
System.out.print("Invalid day");
else
date=new Date(date.getYear(),date.getMonth(),day);
break;
case 'n':
if(date.getMonth()==12)
date=new Date(date.getYear()+1,1,1);
else
date=new Date(date.getYear(),date.getMonth()+1,1);
for(int i=0;i<accounts.size();i++)
accounts.get(i).settle(date);
break;
}
}while(cmd!='e');
for(int i=0;i<accounts.size();i++)
accounts.remove(i);
}
}





猜你喜欢

转载自blog.csdn.net/qq_37155773/article/details/80013318