java银行管理系统总

文章目录

  • 0 自顶向下学习JAVA
  • 1 个人银行管理系统_myBank_1
    • 1.1 系统需求
    • 1.2 系统设计
    • 1.3 系统实现
    • 1.4 系统测试
    • 1.5 体会心得
  • 2 个人银行管理系统_myBank_2
    • 2.1 改进
      • 2.1.1 系统需求
      • 2.1.2 系统设计
      • 2.1.3 系统设计
    • 2.2 系统测试
    • 2.3 个人体会
  • 3 个人银行管理系统_myBank_3
    • 3.1 改进
      • 3.1.1 系统需求
      • 3.1.2 系统设计
      • 3.1.3 系统实现
    • 3.2 系统测试
    • 3.3 个人体会
  • 4 个人银行管理系统_myBank_4
    • 4.1 改进
      • 4.1.1 系统需求
      • 4.1.2 系统设计
        • 4.1.2.1 Account.java
        • 4.1.2.2 Accumulator.java
      • 4.1.3 系统实现
    • 4.2 系统测试
    • 4.3 个人体会
  • 5 个人银行管理系统_myBank_5
    • 5.1 改进
      • 5.1.1 系统需求
      • 5.1.2 系统实现
    • 5.2 系统测试
    • 5.3 个人体会
  • 6 个人银行管理系统_myBank_6
    • 6.1 改进
      • 6.1.1 系统需求
      • 6.1.2 系统实现
    • 6.2 个人体会


0 自顶向下学习JAVA

链接


1 个人银行管理系统_myBank_1


1.1 系统需求

operate.java

====================================================================================================

伪代码:operate.java

目的: 进行一系列操作检验个人银行账户管理系统

====================================================================================================

00:建立几个账目对象, 初始化对象:: new SavingsAccount(date, id, rate)

01:在不同时间进行不同金额的存钱和取钱, 调用对象方法:: sa.deposit(date, money) sa.withdraw(date, money);

02:在银行的计息日, 结算账户的年息, 调用对象方法:: sa.settle(90);

03:输出显示账户信息, 调用对象方法:: sa.show();

====================================================================================================

1.2 系统设计

SavingsAccount.java

====================================================================================================

伪代码:SavingsAccount.java

目的:实现个人银行账户管理系统

====================================================================================================

成员:

  • id      账号
  • balance   余额
  • rate     存款的年利率
  • lastdate   上次变更余额的时期
  • accumulation 余额按日累加之和

方法:

  • SavingsAccount(int date, int id, double rate)     //构造函数
  • record(int date, double amount)     //获得到指定日期为止的存款金额按日累积值:::
  • private double accumulate(int date)   //计算年息:::
  • getId()
  • getBalance()
  • getRate()
  • deposit(int date, double amount)    //存入现金
  • withdraw(int date, double amount)    //取出现金
  • settle(int date)            //结算年息, 于每年1.1
  • show()

====================================================================================================

1.3 系统实现

record函数介绍

  1. 系统银行账户的私有方法,
  2. 帮助计算到当前日期截止的存款按日累计值
  3. 在deposit, withdraw, settle三个函数中都有用到

====================================================================================================

伪代码:record

使用: 当存款金额将要改变时,调用record函数,计算帮助计算到当前日期截止的存款按日累计值,同时记录到当前日期的余额按日累加之和,用于结算利息

====================================================================================================

00:调用accumulate(int date),更新accumulation用于计算年利息,

01:更新lastDate = date;

02:更新当前账户金额, 要求保留小数点后两位

03:打印显示

====================================================================================================

1.4 系统测试

5	#21325302	5000.01	5000.01
25	#58320212	10000.01	10000.01
45	#21325302	5500.01	10500.02
60	#58320212	-3999.99	6000.02
90	#21325302	27.64	10527.66
90	#58320212	21.79	6021.81
#21325302	Balance: 10527.66

#58320212	Balance: 6021.81

分析:
结果有极小的差别是正常的,因为是在不同的语言下进行测试的结果

1.5 体会心得

  1. 区别
  • 项目的结构: c++是一层层写.h,.cpp文件,而java是闲创建一个project,然后再在包里写类
  • 代码的结构: java都是类(泪),main函数也是写在一个类里
  • 初始化对象就有不一样,要正确区分,不然很容易搞混
  1. 遇到的问题
  • 不同的ide,不同的语言好像都会容易乱码, 对中文注释会乱掉,所以.有可能试试用英语写注释
  • 对一个项目里的两个包, 要调试一个包,另一个包的错误也会显示,本来打算把几个版本的myBank放在一个项目的不同包中的,现在发现,还是算了放到不同的项目吧,但还是把系统放到一个myBank包里吧,方便以后可能要加什么东西.
  • 对包里的方法和成员给什么权限呢?还是就给private吧,实在需要用的时候在给方法接口吧,石少不要随便暴露出成员,对于方法,比如record是定义给类内方法用的就定义成private吧.

2 个人银行管理系统_myBank_2

2.1 改进

2.1.1 系统需求

+::增加输出所有账户的总金额

2.1.2 系统设计

====================================================================================================

伪代码:SavingsAccount.java

目的:实现个人银行账户管理系统

====================================================================================================

成员:
+::

  • total 所有账户的总金额

方法:
****+
::

  • getTotal

====================================================================================================

2.1.3 系统设计

学习并掌握java增添静态属性与方法

2.2 系统测试

1	#21325302 is created
1	#58320212 is created
5	#21325302	5000.01	5000.01
25	#58320212	10000.01	10000.01
45	#21325302	5500.01	10500.02
60	#58320212	-3999.99	6000.02
90	#21325302	27.64	10527.66
90	#58320212	21.79	6021.81
#21325302	Balance: 10527.66

#58320212	Balance: 6021.81

Total16549.47

2.3 个人体会

  1. 区别:
  • java定义静态对象好像比c++要接简单简洁一些
  • java静态对象的使用与其他一般类的调用格式是一致的
  1. 遇到的小问题
  • java没有return 0等一些个c++中没有的操作

3 个人银行管理系统_myBank_3

3.1 改进

3.1.1 系统需求

+:: 对日期的准确表达的要求-----设计Date类

+:: 对多账户的管理-------------构造SavingsAccount对象数组

+:: 对用户名选取的范围增加-----String类的id

3.1.2 系统设计

====================================================================================================

伪代码:Date.java

目的:实现个人银行账户管理系统的日期表达

====================================================================================================

成员:
+::

  • year
  • month
  • day
  • totalDays
  • DAYS_BEFORE_MONTH[]

方法:
****+
::

  • Date(int year, int month, int day)       //构造函数
  • int getYear()
  • getMonth()
  • getDay()
  • isLeapYear()                  //判断当年是否为闰年
  • getMaxDay()                   //这个月一共多少天
  • show()                      //显示当前日期
  • distance(final Date date)            //计算相隔多少天

====================================================================================================

3.1.3 系统实现

SavingsAccount对象数组的构造

    //建立几个账户
    SavingsAccount[] accounts = new SavingsAccount[5];
    accounts[0] = new SavingsAccount(date, "S3755217", 0.015);
    accounts[1] = new SavingsAccount(date, "02342342", 0.015);

Date类构造函数

    Date(int year, int month, int day){
        if (day <= 0 || day > getMaxDay()||month>12||month<1){
            System.out.println("Invalid date: ");
            show();
            System.out.println();
            System.exit(1);
        }

        this.year = year;
        this.month = month;
        this.day = day;

        int years = year - 1;

        //计算天数
        totalDays = years * 365 + years / 4 - years / 100 + years / 400
                + DAYS_BEFORE_MONTH[month - 1] + day;

        if (isLeapYear() && month > 2) totalDays++;
    }


3.2 系统测试

2008-11-1
#S3755217 created
2008-11-1
#02342342 created
2008-11-5
#S3755217 5000.01 5000.01 salary
2008-11-25
#02342342 10000.01 10000.01 sell stock 0323
2008-12-5
#S3755217 5500.01 10500.02 salary
2008-12-20
#02342342 -3999.99 6000.02 buy a laptop

2009-1-1
#S3755217 17.77 10517.79 interest
#S3755217 Balance: 10517.79

2009-1-1
#02342342 13.2 6013.22 interest
#02342342 Balance: 6013.22

3.3 个人体会

  1. 区别
  • c++中文件的构造方式是,一个main文件,每类定义一类文件,每类实现一类文件,而java中核心思想是以构造类为核心
  • 创建类的对象一定是以**new 类名()**的形式来构造
  • java由于private和public不是分块定义,所以对每一个成员或方法都要严格的一个一个的去定义
  1. 遇到的问题
  • 对ArrayIndexOutOfBound,NullPointerException等异常的处理与抛出
  • 注释尽量简单明了

4 个人银行管理系统_myBank_4

4.1 改进

4.1.1 系统需求

+:: 辅助计算利息的累加器,将accumulate设置为类方便利息的计算

+:: 父类Account类,SavingsAcount和CreditAccount为继承的子类

+:: 对CreditAccount的设计方式的理解

4.1.2 系统设计

4.1.2.1 Account.java

====================================================================================================

伪代码:***Account.java*** 

目的:实现个人银行账户父类Account

====================================================================================================

**成员:**
**+**::
 - id
 - balance
 - total

 
**方法:
****+**::
 - Account(final Date date, String id)      //构造函数
 - record(final Date date, double amount, String desc)      //记录一笔帐
 - error(final String msg)        //报告错误信息
 - getId()
 - getBalance()
 - getTotal()
 - show()                      //显示账户信息


====================================================================================================

4.1.2.2 Accumulator.java

====================================================================================================



伪代码:***Accumulator.java*** 

目的:实现个人银行账户管理系统的辅助计算利息的累加器

====================================================================================================

**成员:**
**+**::
 - lastDate
 - value
 - sum
 
**方法:
****+**::
 - Accumulator(final Date date, double value)      //构造函数
 - getSum(final Date date)      //获得到日期date的累加结果
 - change(final Date date, double value)      //在date将数值变更为value
 - reset(final Date date, double value)  //初始化,将日期变为date,数值变为value,累加器清零

====================================================================================================

4.1.3 系统实现

//Credit.java取出现金
void withdraw(final Date date, double amount, final String desc){
   if (amount - getBalance() > credit) {
        error("not enough credit");
    } else {
        record(date, -amount, desc);
        //getDebt()<=0,change是改变,把前一段时间的利息算好,又取钱了,更新的负债传给利息累加器
        acc.change(date, getDebt());
        
    }
}

4.2 系统测试

2008-11-1
	#S3755217created
2008-11-1
	#02342342created
2008-11-1
	#C5392394created
2008-11-5
	#S3755217	5000.01	5000.01	salary
2008-11-15
	#C5392394	-1999.99	-1999.99	buy a cell
2008-11-25
	#02342342	10000.01	10000.01	sell stock 0323
2008-12-1
	#C5392394	-15.99	-2015.98	interest
2008-12-5
	#S3755217	5500.01	10500.02	salary
2008-12-20
	#02342342	-3999.99	6000.02	buy a laptop
2009-1-1
	#S3755217	17.77	10517.79	interest
2009-1-1
	#02342342	13.2	6013.22	interest
2009-1-1
	#C5392394	-31.24	-2047.22	interest
2009-1-1
	#C5392394	-49.99	-2097.21	annual fee

#S3755217	Balance: 10517.79
#02342342	Balance: 6013.22
#C5392394	Balance: -2097.21
	Available credit:7902.79
Total: 14433.800000000005

4.3 个人体会

  1. 遇到的问题
  • 父类方法如果想要子类继承,不想外界访问就设置为protected
  • 对系统设计的巧妙性,当巧妙运用面向对象的思想可以做出很多东西来
  • 当代码增多时,注意类间的关系

5 个人银行管理系统_myBank_5

5.1 改进

5.1.1 系统需求

+:: 学会使用java三大特性之多态

+:: 用do…while和switch语句实现系统高级操作

+:: 关于java的虚函数

5.1.2 系统实现

    public static void main(String[] args) throws IndexOutOfBoundsException, IOException {

        Date date = new Date(2008, 11, 1);    //起始日期

        //建立几个账户
        SavingsAccount[] sa = new SavingsAccount[5];
        sa[0] = new SavingsAccount(date, "S3755217", 0.015);
        sa[1] = new SavingsAccount(date, "02342342", 0.015);
        CreditAccount ca = new CreditAccount(date, "C5392394", 10000, 0.0005, 50);

        Account[] accounts = {sa[0], sa[1], 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;
        do {
            //显示日期和总金额
            date.show();
            System.out.println("\tTotal: " + getTotal() + "\tcommand> ");

            int index, day;
            double amount;
            String desc;
            Scanner sc;

            cmd = (char) System.in.read();
            switch (cmd) {
                case 'd':    //存入现金
                    sc = new Scanner(System.in);
                    index = sc.nextInt();
                    sc = new Scanner(System.in);
                    amount = sc.nextDouble();
                    sc = new Scanner(System.in);
                    desc = sc.next();

                    accounts[index].deposit(date, amount, desc);
                    break;
                case 'w':    //取出现金
                    sc = new Scanner(System.in);
                    index = sc.nextInt();
                    sc = new Scanner(System.in);
                    amount = sc.nextDouble();
                    sc = new Scanner(System.in);
                    desc = sc.next();
                    accounts[index].withdraw(date, amount, desc);
                    break;
                case 's':    //查询各账户信息
                    for (int i = 0; i < n; i++) {
                        System.out.println("[" + i + "]");
                        accounts[i].show();
                        System.out.println();
                    }
                    break;
                case 'c':    //改变日期
                    sc = new Scanner(System.in);
                    day = sc.nextInt();
                    if (day < date.getDay())
                        System.out.println("You cannot specify a previous day");
                    else if (day > date.getMaxDay())
                        System.out.println("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');
    }

5.2 系统测试

略:因为操作性比较高,简单显示几项

2008-11-1
	#S3755217created
2008-11-1
	#02342342created
2008-11-1
	#C5392394created
(d)deposit (w)withdraw (s)show (c)change day (n)next month (e)exit
2008-11-1
	Total: 0.0	command> 

d
1
1000
sdf
2008-11-1
	#02342342	1000.01	1000.01	sdf
2008-11-1
	Total: 1000.01	command> 
c
29
2008-11-29
	Total: 1000.01	command> 
n
2008-12-1
	Total: 1000.01	command> 
2008-12-1
	Total: 1000.01	command> 
n
2009-1-1
	#02342342	2.51	1002.52	interest
2009-1-1
	#C5392394	-49.99	-49.99	annual fee
2009-1-1
	Total: 952.53	command> 
2009-1-1
	Total: 952.53	command> 
n
2009-2-1
	#C5392394	-0.77	-50.760000000000005	interest
2009-2-1
	Total: 951.76	command> 
2009-2-1
	Total: 951.76	command> 
n
2009-3-1
	#C5392394	-0.71	-51.470000000000006	interest
2009-3-1
	Total: 951.05	command> 
2009-3-1
	Total: 951.05	command> 

5.3 个人体会

  1. 遇到的问题
  • java是不需要设置vitual
  • 百度java也放弃了运算符重载的操作
  • 对于java的一些用法还不是特别熟练
  • 有时间多看看书

6 个人银行管理系统_myBank_6

6.1 改进

6.1.1 系统需求

+:: 使用java对象数组Collection

6.1.2 系统实现

Collection c = new ArrayList();
        	//创建账户数组,元素个数为0
c.add(new Account);

更多操作见参考文章

6.2 个人体会

  1. 遇到的问题
  • 这一版本要改的地方其实不多,但是相对来说,难度可能要大一点
  • 主要的难点我觉得还是java的输入输出,个人来说还是不太熟,需要多做几种类型的例子试试
  • 这一版容器的使用比较简单,实际上要使用的时候,对于较复杂的算法,对各种操作还是都要好好掌握
Author
lance
2018.10.16

你可能感兴趣的:(❥java)