完成功能:1、能够实现多种存储方式:包括活期存储,定期存储一年、两年、三年并且实现结算业务。
2、 能够模仿学生读书账号的借贷手续、借贷业务和结算业务
3、 能够查询某账号下的总资产和明细记录。
4、 能够查询银行的总存款额和总借贷额

类的设计:
Accumulator类用于存放按照时间累加后的值
Date类存放日期
Account 类 表明所有的账户的公共信息
Savingaccount表示存储账户的信息
Creditaccount 表示学生借贷账户的信息

代码实现:
// Accumulator类
#ifndef ACCUMULATOR_H_INCLUDED
#define ACCUMULATOR_H_INCLUDED
#include "date.h"
class Accumulator
{
private:
    Date lastDate;
    double value;
    double sum;
public:
    Accumulator(const Date &date1,double value)
        :lastDate(date1),value(value),sum(0) {}

    double getsum(const Date &date)
    {
        return sum+(value*date.distance(lastDate));
    }

    void change(const Date &date,double value)
    {
        sum=getsum(date);
        lastDate = date;
        this->value = value;
        sum=0;
    }
    void reset(const Date &date,double value)
    {
        lastDate=date;
        this->value=value;
        sum=0;
    }
};


#endif // ACCUMULATOR_H_INCLUDED

// Date类
#ifndef DATE_H_INCLUDED
#define DATE_H_INCLUDED
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int dayofmon[20]={0,31,59,90,120,151,181,212,243,273,304,334,365};
class Date{
private:
    int year,month,day;
    int totaldays;
public:
    Date(int y,int m,int d);
    int getyear()const
    {
        return year;
    }
    int getmon()const {return month;}
    int getday()const {return day;}
    int getmaxday()const;
    bool isleapyear()const
    {
        return (year%4==0&&year%100!=0)||(year%400==0);
    }
    void show()const;
    int distance(const Date &date)const
    {
        return abs(totaldays-date.totaldays);
    }
};
int Date::getmaxday()const
{
    if(isleapyear()&&month==2)
    {
        return 29;
    }
    else
    {
        return dayofmon[month]-dayofmon[month-1];
    }
}

Date::Date(int year,int month,int day):year(year),month(month),day(day)
{
    if(day<=0||day>getmaxday())
    {
        cout<<"Invalid date:";
        show();
        cout<<endl;
        exit(1);
    }
    int years=year-1;
    totaldays=years*365+years/4-years/100+years/400+dayofmon[month-1]+day;
    if(isleapyear()&&month>2)totaldays++;

}
void Date::show()const
{
    cout<<getyear()<<"-"<<getmon()<<"-"<<getday();
}
#endif // DATE_H_INCLUDED

// Account类

#ifndef ACCOUNT_H_INCLUDED
#define ACCOUNT_H_INCLUDED
#include "date.h"
#include "accumulator.h"
#include <string>
#include <cmath>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
string to_string(int x)
{
    string s;
    if(x == 0) s += '0';
    while(x)
    {
         s += (x%10)+'0';
         x /= 10;
    }
    reverse(s.begin(),s.end());
    return s;
}

class Account
{
private:
    string id;
    double balance;
    static double total1,total2;
    vector<string>rec;
protected:
    Account(const Date &date,const string &id);
    void record(const Date &date,double amount,const string &desc);
    void error(const string &msg)const;
public:
    const string &getid()
    {
        return id;
    }
    void changetotal1(double amount)
    {
        total1+=amount;
    }
    void changetotal2(double amount)
    {
        total2+=amount;
    }
    double getbalance()const
    {
        return balance;
    }
    static double gettotal1()
    {
        return total1;
    }
    static double gettotal2()
    {
        return total2;
    }
    void show()const;
};
class SavingAccount:public Account
{
private:
    Accumulator acc;
    double rate[5]={0,0.35*0.01/365,1.5*0.01/365,2.10*0.01/365,2.75*0.01/365};
    int index;

public:
    SavingAccount(const Date&date,const string &id,int index);
    double getrate(int i)
    {
        return rate[i];
    }
    void changerate(double rate1,int i)
    {
        rate[i]=rate1;
    }
    void changekind(int i)
    {
        index=i;
    }
    void deposit(const Date &date,double amount,const string &desc);
    void withdraw(const Date&date,double amount,const string &desc);
    void settle(const Date &date);
};

class CreditAccount:public Account
{
private:
    Accumulator acc;
    double credit;
    double rate;
    double fee;
    double getDebt()const
    {
        double balance=getbalance();
        return (balance<0?balance:0);
    }
public:
    CreditAccount(const Date&date,const string &id,double credit,double rate,double fee);
    double getcredit()const
    {
        return credit;
    }
    double getrate()const
    {
        return rate;
    }
    double getfee()const
    {
        return fee;
    }
    double getAvailableCredit()const
    {
        if(getbalance()<0)
        {
            return credit+getbalance();
        }
        else return credit;
    }
    void deposit(const Date &date,double amount,const string &desc);
    void withdraw(const Date &date,double amount,const string &desc);
    void settle(const Date &date);
    void show()const;
};

double Account::total1=0;
double Account::total2=0;
Account::Account(const Date &date,const string &id):id(id),balance(0)
{
    date.show();
    cout<<"\t#"<<id<<" created"<<endl;
}
void Account::record(const Date &date,double amount,const string &desc)
{
    amount=floor(amount*100+0.5)/100;
    balance+=amount;
    //total1+=amount;
    date.show();
    cout<<"\t#"<<id<<"\t"<<amount<<"\t "<<balance<<"\t"<<desc<<endl;
    string t;
    t=t+to_string(date.getyear())+"-"+to_string(date.getmon())+"-"+to_string(date.getday())+": ";
    t=t+" #"+id+" "+to_string(amount)+" "+to_string(balance)+" "+desc;
    rec.push_back(t);
}
void Account::show()const
{
    cout<<id<<"\tBalance:"<<balance<<endl;;
    for(int i=0;i<rec.size();i++)
    {
        cout<<rec[i]<<endl;
    }
}
void Account::error(const string &msg)const
{
    cout<<"Error(#"<<id<<"):"<<msg<<endl;
}

SavingAccount::SavingAccount(const Date &date,const string &id,int index)
    :Account(date,id),index(index),acc(date,0) {}

void SavingAccount::deposit(const Date&date,double amount,const string &desc)
{
    changetotal1(amount);
    record(date,amount,desc);
    acc.change(date,getbalance());
}
void SavingAccount::withdraw(const Date&date,double amount,const string &desc)
{
    if(amount>getbalance())
    {
        error("not enough money");
    }
    else
    {
        changetotal1(-amount);
        record(date,-amount,desc);
        acc.change(date,getbalance());
    }
}
void SavingAccount::settle(const Date &date)
{
    double interest=acc.getsum(date)*rate[index];
   // cout<<interest<<endl;
    if(interest!=0)
    {
        record(date,interest,"interest");
        changetotal1(interest);
    }
    acc.reset(date,getbalance());
}


CreditAccount::CreditAccount(const Date&date,const string &id,double credit,double rate,double fee)
    :Account(date,id),credit(credit),rate(rate),fee(fee),acc(date,0){};
void CreditAccount::deposit(const Date&date,double amount,const string &desc)
{
    changetotal2(-amount);
    record(date,amount,desc);
    acc.change(date,getDebt());
}
void CreditAccount::withdraw(const Date&date,double amount,const string &desc)
{
    if(amount-getbalance()>credit)
    {
        error("not enough credit");
    }
    else
    {
        changetotal2(amount);
        record(date,-amount,desc);
        acc.change(date,getDebt());
    }
}
void CreditAccount::settle(const Date &date)
{
    double interest=acc.getsum(date)*rate;
    if(interest!=0)
    {record(date,interest,"interest");
    changetotal2(interest);
    }
    if(date.getmon()==1)
    {
        record(date,-fee,"annual fee");
        changetotal2(fee);
    }
    acc.reset(date,getDebt());
}
void CreditAccount::show()const
{
    Account::show();
    cout<<"\tAvailable credit:"<<getAvailableCredit();
}
#endif // ACCOUNT_H_INCLUDED

//主程序
#include <iostream>
#include "date.h"
#include "accumulator.h"
#include "account.h"
using namespace std;
vector<SavingAccount>st;
int main()
{
    Date day1(2016,1,1);
    printf("Choose your deposit method:\n");
    printf("1-Demand deposit 2-Fixed deposit for one year\n");
    printf("3-Fixed deposit for two years\n");
    printf("4-Fixed deposit for three years\n");
    int n;
    cin>>n;
    SavingAccount a(day1,"1001",n);
    cout<<a.getrate(n)*100*365<<"%"<<endl;
    Date day2(2018,3,5);
    Date day3(2018,4,5);
    a.deposit(day2,1000,"saving 1000 yuan");
    a.withdraw(day3,20,"get 20 yuan");
    Date day8(2019,5,6);
    a.deposit(day8,8000,"salary");
    a.settle(day8);
    printf("This is the Student Credit account\n");
    CreditAccount b(day2,"1006",50000,0.006/365,20);
    Date day4(2019,9,1);
    b.withdraw(day4,5000,"tuition");
    b.getAvailableCredit();
    Date day5(2020,10,5);
    b.withdraw(day5,20000,"buy a cell");
    Date day6(2035,10,9);
    Date day7(2021,10,5);
    b.deposit(day7,1000,"get salary");
    b.settle(day6);
    printf("show the details of student A:\n");
    st.push_back(a);
    a.show();
    printf("Total deposit:\n");
    cout<<a.gettotal1()<<endl;
     printf("Total loans:\n");
     cout<<a.gettotal2()<<endl;
    return 0;
}