一、课程设计要求与目的

  1. 模仿个人银行账户管理系统的C++版本(第4章-第9章),使用Java语言重新实现该系统,比较C++与Java在实现上的异同,熟练掌握Java基础及语法。
  2. 根据业务需求的增加,对个人银行账户管理系统进行功能上的完善,利用面向对象的思想对代码进行重构,体会抽象、封装、继承、多态等特性在实际系统中的应用,掌握构造可复用、可扩展、可维护软件的基本技能。

二、课程版本记录

1.个人个人银行账户管理系统版本0.1(对应第4章记录)

系统需求

一个活期储蓄账户包括 账号(id) 、 余额(balance) 、 年利率(rate) 等信息,还包括 显示账户信息(show) 、 存款(deposit) 、取款(withdraw) 、 结算利息(settle) 等操作。

系统设计

设计一个 类 Bank , 其数据成员为 id, balance, rate , 类的方法有 show(), deposit(), withdraw(), settle()

系统实现

数据成员

class bank{int id;               //账号double balance;     //余额double rate;        //存款的年利率int lastDate;       //上次变更余额的时期double accumulation; //余额按日累加之和
}

类中方法

class bank{public bank(int _date,int _id,double _rate){lastDate=_date;id=_id;rate=_rate;}//记录一笔帐,date为日期,amount为金额,desc为说明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 double accumulate(int date) {return accumulation + balance * (date - lastDate);}int getId() { return id; }double getBalance() { return balance; }double getRate() { return rate; }//存入现金void deposit(int date, double amount){record(date, amount);}//取出现金void withdraw(int date, double amount){if (amount > getBalance())System.out.println("Error: not enough money");elserecord(date, -amount);}//结算利息,每年1月1日调用一次该函数void settle(int date){double interest = accumulate(date) * rate / 365;   //计算年息if (interest != 0)record(date, interest);accumulation = 0;}//显示账户信息void show(){System.out.println("#"+id+"\tBalance:"+balance);}}

系统测试

体会心得

java 在输出浮点数时,整数不经过处理时会输出小数点后一位的零,而 c++ 的输出会舍弃。java 在实例化对象时的语法与 c++ 相比有些不同,例如 className c; 在 c++ 中即表示实例化一个对象,而在 java 中虽然表达相同,但实际仅仅是对象的声明,此时并没有实例化真正的对象,同时 java 实例化对象时需要使用关键字 new

2.个人个人银行账户管理系统版本0.2(对应第5章记录)

系统需求

相较于上一版本,在活期账户中添加一个用来记录各个账户的总金额的功能,同时可以获取这个总金额(total)。

系统设计

在Account类中添加一个静态数据成员 total , 用来记录各个账户的总金额,并为其增加相应的静态成员方法 getTotal 用来对其进行访问。

系统实现

增加如下代码

private static double total=0;  //所有账户的总金额public static double getTotal() { return total; }

系统测试

体会心得

类中的静态变量只占用该类的一个空间,可以当作本类的一个计数器。静态数据成员仅由静态成员方法来访问。

3.个人个人银行账户管理系统版本0.3(对应第6章记录)

系统需求

新增一个日期类Date,具有输出当前日期,判断闰年,计算两个日期值之间相差天数等功能

增加了报告错误信息

系统设计

银行账户用字符串进行表示

用desc为账目进行了说明

新添Date类

系统实现

新增类

public class Date {private final int[] DAYS_BEFORE_MONTH={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){}//用年、月、日构造日期public final int getYear()  {  }public final int getMonth()  {  }public final int getDay()  { }public final int getMaxDay() {}      //获得当月有多少天public final boolean isLeapYear()  {} //判断当年是否为闰年public final void show() {}//输出当前日期//计算两个日期之间差多少天public final int distance(final Date date)  {}
}

Account的改动

    private String id;       //帐号private Date lastDate;      //上次变更余额的时期//记录一笔帐,date为日期,amount为金额,desc为说明private void record(final Date date, double amount, final String desc){accumulation = accumulate(date);lastDate = date;amount = Math.floor(amount * 100 + 0.5) / 100;  //保留小数点后两位balance += amount;total += amount;date.show();System.out.println("\t#"+id+"\t"+amount+"\t"+balance+"\t"+desc);}//报告错误信息private final void error(final String msg){System.out.println("Error(#"+id+"): "+msg);}    //存入现金public void deposit(final Date date, double amount, final String desc){record(date, amount, desc);}//取出现金public void withdraw(final Date date, double amount, final String desc){if (amount > getBalance())error("not enough money");elserecord(date, -amount, desc);}//结算利息,每年1月1日调用一次该函数public void settle(final Date date){double interest = accumulate(date) * rate    //计算年息/ date.distance(new Date(date.getYear()-1,1,1));if (interest != 0)record(date, interest, "interest");accumulation = 0;}

系统测试

体会心得

组合类方便了一些功能的实现和管理,Date类使得有关日期的操作可以和Account类的实现相互独立,无需关心Date类的具体实现

4.个人个人银行账户管理系统版本0.4(对应第7章记录)

系统需求

新增信用账户

信用账户允许透支(要支付利息),但应在信用额度内。每月1日结算利息,每年1月1日结算年费

系统设计

基类Account派生SavingAccount和CreditAccount两个子类。

基类Account中,保留数据成员:id账号,balance余额,total静态数据成员账户总金额,成员方法show输出信息。原来的record,error 方法的访问控制权限修改为 protected,供派生类调用,同时还有一个protected的构造方法。

处理存款deposit、处理取款withdraw、结算settle方法因具体处理方式不同,放置在派生类中。

增加Accumulator类实现各个账户的按日累加和的功能

系统实现

Accumulator类

public class Accumulator {private Date lastDate; //上次变更数值的时期private double value;    //数值的当前值private double sum;     //数值按日累加之和//构造函数,date为开始累加的日期,value为初始值public Accumulator(final Date date, double value) {}//获得到日期date的累加结果public final double getSum(final Date date)  {}//在date将数值变更为valuepublic void change(final Date date, double value) {}//初始化,将日期变为date,数值变为value,累加器清零public void reset(final Date date, double value) {}
}

Account类


public class Account {private String id;    //帐号private double balance; //余额static double total=0; //所有账户的总金额//供派生类调用的构造函数,id为账户protected Account(final Date date, final String id){}//记录一笔帐,date为日期,amount为金额,desc为说明protected void record(final Date date, double amount, final String desc){}//报告错误信息protected final void error(final String msg) {}public final String getId()  { }public final double getBalance()  {  }public static double getTotal() { }//显示账户信息void show() {}
}

CreditAccount类

public class CreditAccount extends Account{private Accumulator acc;  //辅助计算利息的累加器private double credit;      //信用额度private double rate;      //欠款的日利率private double fee;         //信用卡年费private final double getDebt()  {}   //获得欠款额//构造函数public CreditAccount(final Date date, final String id, double credit, double rate, double fee){}public final double getCredit()  {  }public final double getRate()  {  }public final double getFee()  {  }public final double getAvailableCredit()  {} //获得可用信用//存入现金public void deposit(final Date date, double amount, final String desc){}//取出现金public void withdraw(final Date date, double amount, final String desc){}//结算利息和年费,每月1日调用一次该函数public void settle(final Date date){}public final void show() {}
}

SavingsAccount类

public class SavingsAccount extends Account{private Accumulator acc; //辅助计算利息的累加器private double rate;        //存款的年利率//构造函数public SavingsAccount(final Date date, final String id, double rate){}public final double getRate()  { }//存入现金public void deposit(final Date date, double amount, final String desc) {}//取出现金public void withdraw(final Date date, double amount, final String desc) {}//结算利息,每年1月1日调用一次该函数public void settle(final Date date){}}

系统测试

体会心得

设计一个共同的父类 Account 类来派生出需要的两个子类,继承派生使得同类不同功能的实现更加的容易

利用super()对父类初始化

5.个人个人银行账户管理系统版本0.5(对应第8章记录)

系统需求

新增了输入功能,让用户选择实现存取等功能。

系统设计

添加switch选择语句,完成让用户选择功能

用Scanner实现数据类型的输入

Account变为抽象类,deposit、withdraw、settle为抽象方法。可以通过父类的引用来调用子类的方法。这样可以通过一个父类的数组来实现不同的账户的存储操作。

系统实现

Account类修改

abstract public class Account {//存入现金,date为日期,amount为金额,desc为款项说明abstract public  void deposit(final Date date, double amount, final String desc) ;//取出现金,date为日期,amount为金额,desc为款项说明abstract public  void withdraw(final Date date, double amount, final String desc) ;//结算(计算利息、年费等),每月结算一次,date为结算日期abstract public  void settle(final Date date) ;}

CreditAccount类修改

public final void show() {super.show();System.out.println("\tAvailable credit:" + getAvailableCredit());}

BANK类输入和switch语句

import java.util.Scanner;public class BANK5 {public static void main(String[] args){char cmd;Scanner scanner=new Scanner(System.in);do {//显示日期和总金额date.show();System.out.println("\tTotal: "+Account.getTotal()+"\tcommand>");int index, day;double amount;String desc;cmd=scanner.next().charAt(0);switch (cmd) {case 'd': //存入现金index=scanner.nextInt();amount=scanner.nextDouble();desc=scanner.nextLine();accounts[index].deposit(date, amount, desc);break;case 'w':  //取出现金index=scanner.nextInt();amount=scanner.nextDouble();desc=scanner.nextLine();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=scanner.nextInt();if (day < date.getDay())System.out.println("You cannot specify a previous day");else if (day > date.getMaxDay())System.out.println("Invalid day");elsedate =new Date(date.getYear(), date.getMonth(), day);break;case 'n':    //进入下个月if (date.getMonth() == 12)date =new Date(date.getYear() + 1, 1, 1);elsedate =new Date(date.getYear(), date.getMonth() + 1, 1);for (int i = 0; i < n; i++)accounts[i].settle(date);break;}} while (cmd != 'e');scanner.close();}
}

系统测试

体会心得

Java中没有c++的运算符重载功能,需要通过具体方法来实现。

抽象类不能有对象但是可以声明引用其子类。

6.个人个人银行账户管理系统版本0.6(对应第9章记录)

系统需求

使得测试程序操作更便捷

系统设计

使用ArrayList创建账户数组,动态改变数组大小,添加新账户的功能。

系统实现

BANK类

import java.util.ArrayList;
public class BANK6 {public static void main(String[] args) {ArrayList<Account> accounts=new ArrayList<Account>();//创建账户数组,元素个数为0}
}

系统测试

体会心得

学习了Java类库中的 ArrayList 实现了类的对象数组功能

一个共同的父类的对象数组可以统一管理其子类的对象

三、总结

最终功能:

1.一个简单的switch语句,供用户测试各个功能

2.一个日期累加器功能,记录日期的累加值

3.由Account类派生SavingsAccount和CreditAccount两个子类。第一个子类实现基本信息的存储、每月利息计算等功能,第二个子类实现扣除年费、信用卡透支等功能

Java中的输入问题,通过CSDN上各路大佬罗列的输入方法,选择了Scanner来实现不同数据的读入。

Java中没有C++的运算符重载功能,只能通过具体方法来实现。

C++中的floor在Java中需要通过Math.floor调用。

Arrylist声明的对象数组不必关心空间分配问题。

银行系统的六个版本,让我熟悉了Java的基本语法,也体会到了Java和C++的不同的程序设计思想。我也更加了解了面向对象的封装性、继承性、多态性。各种访问权限的定义,继承的使用,父类方法的覆写……

个人银行账户管理系统课程设计报告相关推荐

  1. 物资管理系统 c语言,物资管理系统课程设计报告.doc

    物资管理系统课程设计报告 中 国 地 质 大 学 本科生课程论文封面 课程名称 c语 言 课 程 设 计课程设计评语2 目 录3 1.课程论文题目4 2.程序设计思路4 3.功能模块图5 4.数据结构 ...

  2. java技术计算机机房管理系统文档,计算机机房管理系统课程设计报告

    计算机机房管理系统课程设计报告 课课 程程 设设 计计 题题 目目 计算机机房管理系统 学学 院院 专专 业业 信电分院计算机科学与技术 班班 级级 计算机 1101 姓姓 名名 指导教师指导教师 2 ...

  3. c语言航班管理系统报告,c航班管理系统课程设计报告.doc

    c航班管理系统课程设计报告 北华航天工业学院课程设计报告 PAGE 课程设计报告 报告(论文)题目: 1航班信息查询系统 2迷宫问题 作者所在系部: 计算机科学与工程系 作者所在专业: 计算机科学与技 ...

  4. c语言学生成员管理代码报告怎么写,C语言学生通信录管理系统课程设计报告

    <C语言学生通信录管理系统课程设计报告>由会员分享,可在线阅读,更多相关<C语言学生通信录管理系统课程设计报告(18页珍藏版)>请在人人文库网上搜索. 1.实验名称 :学生通信 ...

  5. 图书馆系统c语言作业,C语言图书馆管理系统课程设计报告

    <C语言图书馆管理系统课程设计报告>由会员分享,可在线阅读,更多相关<C语言图书馆管理系统课程设计报告(16页珍藏版)>请在人人文库网上搜索. 1.高级语言程序设计课程设计报告 ...

  6. c语言课程设计北京电子工业出版社,c语言图书管理系统课程设计报告

    c语言图书管理系统课程设计报告 五.小节: 在这一个星期的实践中,通过编写这个图书管理系统,我体会到了c语言学习的实用性.将理论和实践结合在一起,用先进的计算机工具方便人们的生活.C语言程序的编写首先 ...

  7. c语言课程设计图书管理系统报告,C语言图书管理系统课程设计报告[1]

    C语言图书管理系统课程设计报告[1] 第三章 图书管理系统的设计与实现3.1 系统的需求分析图书登记管理系统作为一个应用软件将为学校的老师和学生提供一个对学校图书馆深入了解并借阅.还书的平台.根据系统 ...

  8. C语言学生成绩信息管理系统课程设计报告

    C语言课程设计报告 一 .设计目的 学生成绩管理系统 主要功能: (1)能按学期.按班级完成对学生成绩的录入. 修改,删除 (2)能按班级统计学生的成绩,求学生的总分及 平均分,并能根据学生的平均成绩 ...

  9. 基于java与sqlserver2008的班级信息管理系统源代码,图书管理系统课程设计报告(基于JAVA和SQL.Server).doc...

    可编辑版 PAGE Word完美格式 可编辑版 Word完美格式 课程设计报告 设计名称:<数据库原理与应用>课程设计 设计题目: 图书管理系统的设计与开发 学生学号: 专业班级: 学生姓 ...

  10. 班费管理系统c语言报告,班费管理系统课程设计报告.doc

    计算机科学与技术系 课程设计报告 20 -20 学年第 学期 课程 C语言课程设计 课程设计名称 班级班费管理系统 学生姓名 学号 专业班级 指导教师 20 年 月 班级班费管理系统 目录 班级班费管 ...

最新文章

  1. 设备漏电对计算机影响,电脑机箱漏电对电脑有影响吗
  2. 504 Gateway Time-out错误的解决方法
  3. java中索引超出怎么办_Java-字符串索引超出范围异常“字符串索引超出范围”
  4. Android属性动画进阶用法
  5. CentOS FireFox Flash Player
  6. C:/WINDOWS/system32/drivers/etc/hosts文件无法访问
  7. 矩阵分析 (四)向量和矩阵的范数
  8. 《百家讲坛》之战国七雄
  9. Unity chan下载
  10. 江阴:智慧融入城市血液,打造创新发展新名片
  11. Unity Remote5 使用
  12. 成都可以打狂犬疫苗的地方
  13. 一个智能省心的空空java代码生成平台上线了——前后端代码生成
  14. eclipse32位安装教程_Maya2015 (64位) 软件安装教程
  15. 锁定计算机是什么意思6,文件处于锁定状态是什么意思?
  16. 数学建模——MATLAB基础知识
  17. 数据库作业4——数据查询
  18. 微信小程序预览文件,word、xlsx文件打不开?
  19. 跨境电商如何找代运营公司?星之河
  20. 斐波那契数列编程C语言

热门文章

  1. 【大学物理·早期通子论和量子力学基础】德布罗意波微观粒子的波粒二象性
  2. background属性用法总结
  3. Android 画笔演示功能的实现
  4. java高并发解决方案
  5. dBm和dB(纯计数单位)
  6. java 国际象棋_java – 自我项目:使用GUI创建国际象棋游戏
  7. 炼丹笔记一——基于TensorFlow的vgg16的cifar10和100简单探究超参数对训练集收敛情况的影响
  8. c语言趣味菜单实验报告,DSP实验报告+心得体会
  9. html书签制作方法图片大全,简单纸书签的折法 纸书签制作方法步骤图
  10. 磁盘介质受写入保护解决办法