一.课程设计要求与目的
- 模仿个人银行账户管理系统的c++版本(4-8),使用java语言重新实现该系统,比较c++与java在实现上的异同,熟练掌握java语法
- 根据需求演化,逐步完善个人银行账户管理系统的功能,改进代码,体会面对对象思想的封装继承与多态
二.课程设计进展记录
1.个人银行账户管理系统1.0
1.1 系统需求:建立账户,可对账户进行存钱取钱操作,结算年息,得出余额
1.2系统设计:
- 存钱,取钱,计算利息,展示余额,记录每一笔余额变化
- 存钱,取钱,计算利息都需要调用到记录record函数
1.3系统实现:
public class SavingsAccount1 {
private int id; //账号
private double balance; //余额
private double rate; //存款的年利率
private int lastDate; //上次变更余额的时期
private double accumulation; //余额按日累加之和
**//记录一笔帐,date为日期,amount为金额,desc为说明**
private void **record**(int date, double amount){
accumulation = accumulate(date);
lastDate = date;
amount = Math.floor(amount * 100 + 0.5) / 100; //保留小数点后两位
balance += amount;
System.out.println(date+"\t#"+id+"\t"+amount+"\t"+balance);
}
//获得到指定日期为止的存款金额按日累积值
final private double accumulate(int date) {
return accumulation + balance * (date - lastDate);
}
public SavingsAccount1(int date,int id,double rate){ }
int getId() { return id; }
double getBalance() { return balance; }
double getRate() { return rate; }
//存入现金
public void **deposit**(int date, double amount){*record(date,amount);*}
//取出现金
public void **withdraw**(int date, double amount){
if (amount > getBalance())
System.out.println("Error: not enough money");
else
*record(date, -amount);*
}
//结算利息,每年1月1日调用一次该函数
public void **settle**(int date){
double interest = accumulate(date) * rate / 365;//计算年息
if (interest != 0)
record(date, interest);
accumulation = 0;
}
//显示账户信息
public void **show**(){System.out.println("#"+id+"\tBalance: "+balance); }
1.4系统测试:
2.个人银行账户管理系统2.0
2.1系统需求:相对于1.0版本,多了统计所有账户金额功能
2.2系统设计:
-相对于2.0版本,多了获取总账户金额的函数
-record函数内部也相应加上统计总金额的代码
2.3系统实现:
属性多了private static double total; //所有账户的总金额
private void record(int date, double amount){
accumulation = accumulate(date);
lastDate = date;
amount = Math.floor(amount * 100 + 0.5) / 100; //保留小数点后两位
balance += amount;
**total+=amount;**
System.out.println(date+"\t#"+id+"\t"+amount+"\t"+balance);
}
其余函数无变化
2.4系统测试:
3.个人银行账户管理系统3.0
3.1系统需求:相较于2.0版本,日期精确为了具体年月日;每笔存款取款明确了用途与来源。
3.2系统设计:
-相对于2.0版本,新增了Date类
-账户类将*变更余额的时期*类型从int改为了Date----->两个类之间产生联系
-记录,存钱,取钱函数相应增加了传参入口,传入字符串
-加入了日期的展示(show)
-计算日期的差,从int直接相加减变成了两个对象总日期属性相加减
3.3系统实现:
class Date{
final int DAYS_BEFORE_MONTH[]= new int[]{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
private int year;//年
private int month;//月
private int day;//日
private int totalDays;//该日期是从公元元年1月1日开始的第几天
public Date(int year, int month, int day){//用年、月、日构造日期
this.year=year;
this.month=month;
this.day=day;
if (day <= 0 || day>getMaxDay()) {
System.out.println("Invalid date: ");
show();
System.out.println();
//exit(1);
}
int years = year - 1;
totalDays = years * 365 + years / 4 - years / 100 + years / 400
+ DAYS_BEFORE_MONTH[month - 1] + day;
if (isLeapYear() && month > 2) totalDays++;
}
final int getYear() { return year; }
final int getMonth() { return month; }
final int getDay() { return day; }
final int getMaxDay(){
if (isLeapYear() && month == 2)
return 29;
else
return DAYS_BEFORE_MONTH[month]- DAYS_BEFORE_MONTH[month - 1];
} //获得当月有多少天
final boolean isLeapYear() { //判断当年是否为闰年
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
final void show(){System.out.println(getYear()+"-"+getMonth()+"-"+getDay()); } //输出当前日期
final int distance(final Date date) { //计算两个日期之间差多少天
return totalDays - date.totalDays;
}
}
3.4系统测试:
4.个人银行账户管理系统4.0
4.1系统需求:相较于3.0版本,多了信用账户类,有了信用额度,欠款日利率,信用卡年费的概念
4.2系统设计:
-由于有信用账户类以及储蓄账户类,所以采用了两个子类继承Account类
-设计了Date类与Accumulator类(辅助计算利息的累加器),与账户类对象形成联系
4.3系统实现:
class Accumulator { //将某个数值按日累加
private Date lastDate; //上次变更数值的时期
private double value; //数值的当前值
private double sum; //数值按日累加之和
//构造函数,date为开始累加的日期,value为初始值
public Accumulator(final Date date, double value){
lastDate=date;
this.value=value;
sum=0;
}
//获得到日期date的累加结果
public double getSum(final Date date) {
return sum + value * date.distance(lastDate);
}
//在date将数值变更为value
public void change(final Date date, double value) {
sum = getSum(date);
lastDate = date;
this.value = value;
}
//初始化,将日期变为date,数值变为value,累加器清零
public void reset(final Date date, double value) {
lastDate = date;
this.value = value;
sum = 0;
}
}
static class CreditAccount extends Account { //信用账户类
private Accumulator acc; //辅助计算利息的累加器
private double credit; //信用额度
private double rate; //欠款的日利率
private double fee; //信用卡年费
final private double getDebt() { //获得欠款额
double balance = getBalance();
return (balance < 0 ? balance : 0);
}
public CreditAccount(final Date date, final String id, double credit, double rate, double fee, final Accumulator acc1) { } //构造函数
final public double getCredit() { return credit;}
final public double getRate() {return rate; }
final public double getFee() { return fee; }
final public double getAvailableCredit() { //获得可用信用
if (getBalance() < 0)
return credit + getBalance();
else
return credit;
}
void deposit(final Date date, double amount, final String desc) { } //存入现金
void withdraw(final Date date, double amount, final String desc) { } //取出现金
void settle(final Date date) { } //结算利息和年费,每月1日调用一次该函数
public void show() {
super.show();
System.out.println("\tAvailable credit:" + getAvailableCredit());
}
}
4.4系统测试:
5.个人银行账户管理系统5.0
5.1系统需求:相较于4.0版本,多了用户选择,自定义的功能
5.2系统设计:主要修改在主函数内部,其他功能函数无大变化
5.3系统实现:
char cmd;
Scanner scanner = new Scanner(System.in);
do {
date.show();
System.out.print("\tTotal: "+Account.getTotal()+"\tcommand> ");
int index,day;
double amount;
String decs;
cmd = scanner.next().charAt(0);
switch (cmd) {
case 'd':
System.out.print("Index> ");
index = scanner.nextInt();
System.out.print("Amount> ");
amount = scanner.nextInt();
System.out.print("Decs> ");
Scanner sc = new Scanner(System.in);
decs = sc.nextLine();
accounts[index].deposit(date,amount,decs);
break;
case 'w':
System.out.print("Index> ");
index = scanner.nextInt();
System.out.print("Amount> ");
amount = scanner.nextInt();
System.out.print("Decs> ");
sc = new Scanner(System.in);
decs = sc.nextLine();
accounts[index].withdraw(date,amount,decs);
break;
case 's':
for(int i = 0; i<n; i++) {
System.out.print("["+i+"]");
accounts[i].show();
}
break;
case 'c':
day = scanner.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 (Account value : accounts) {
value.settle(date);
}
break;
}
} while (cmd != 'e');
5.4系统测试:
!!!!!需要注意,改变过程中:!!!!!!!
- const变final
- c语言需要头文件,using namespacestd;java不需要,只需要各类中完成即可
- Java类之间的使用不用遵循先声明再使用的规则,而C++必需先声名才可以使用
- java是boolean;c++是bool
- Java类外不能有变量的声明,而C++可以有作为C++的全局变量。
- 类的属性、方法定义写法不同
- 构造函数初始化不同
- 调用父类构造方法(super vs 直接父类名)
- 传参类型为类对象时不同,一个地址,一个直接引用
- 运算符重载
(int operator - (const Date& date) const {
return totalDays - date.totalDays;
} vs java无运算符重载) - 纯虚函数 vs 抽象方法
- -静态变量调用方法不同:Account::getTotal() vs Account.getTotal()
- 空行:cout << endl; vs System.out.println();
- 对象建立不同,直接声明 vs new方法
- 输出方法不同(cout vs sout)
- 输入方法 (char cmd;cin>>cmd; vs
char cmd;
Scanner scanner = new Scanner(System.in);
do {
date.show();
System.out.print("\tTotal: "+Account.getTotal()+"\tcommand> ");
int index,day;
double amount;
String decs;
cmd = scanner.next().charAt(0);
)