设计开发银行账户管理系统

设计开发银行账户管理系统,银行有多种账户,每个账户都包含账号(id),余额(balance)等基本信息,还为用户提供查询账户信息及余额(show())等服务。其中,储蓄账户包含定期储蓄账户和活期储蓄账户,定期储蓄账户采用每年结算一次利率,中间不可取出,否则按照活期利率计算,超期不计入利息计算。定期储蓄账户信息包含定期利率和活期利率,同时提供每年一次的利息结算,以及账户信息查询服务。活期储蓄账户信息中还包含年利率(rate),同时提供随时存款,取款等服务,每次存入或取出金额后,需要进行余额结算。活期利息按年结算,每年1月1日结算一次。由于账户的余额是不断变化的,因此年利的计算需要将一年当中每天的余额累计起来,再除以一年的总天数,得到一个日均余额,再乘以年利率。
详细要求如下:
(1)分析该系统中的继承关系,使用UML图表示类的属性方法及类之间的关系。
(2)完成系统所述的基本账户(Account)的开发。包括获取用户信息、余额、显示信息。
(3)完成定期储蓄账户(SavingsYearAccount)的开发,功能包括显示用户信息(show()),结算利率(settle()),变更账户信息(record()。
(4)完成活期储蓄账户(SavingsAccount)的开发,功能包括获取用户信息、余额、利率,存入现金(deposit()),取出现金(withdraw()),结算利息 (settle()),显示账户信息(show())和记录变更(record(变更日期,变更金额))。
1)为了简便,类中的日期,如余额变更日期(lastDate)均用一个整数表示,该整数是一个以日为单位的相对日期,例如第一次余额变更日期为1,那么余额在第3天再次变更后就用4表示变更日期。
2)计算利息(settle())的方法是由计算余额的按日累计值(accumulation)乘以利率并除以一年中的总日期数得出,公式如下:
利息=accumulation*rate/365
其中,按日累计值(accumulation)是由accumulate()函数计算出来的。accumulate()函数用来计算余额按日累积的值。即当余额变动时,将变动前的余额与该余额所持续的天数相乘,累加到按日累计值(accumulation)中,同时修改余额变更日期(lastDate)的值。
3)账户余额每次变更,需要记录下来(record(变更日期,变更金额))。记录工作包括获取并记录变更前余额的日累积值,记录此次变更日期存入lastDate,变更余额balance。
(5)设计几个账户实例测试系统功能,显示账户信息检验系统功能是否完备。

运行结果:

img

代码:

#include <iostream>
using namespace std;

#define MAXLEN 1000


//账户变动记录
class Record
{
public:
    int date;
    float money; //变动金额,正数表示收入,负数表示支出
};

//基本账户
class Account
{
public:
    string id; //账号
    float balance; //余额
    
    Account(string _id,float _b) {
        id = _id;
        balance = _b;
    }
    //显示账户信息及余额
    void show()
    {
        cout << "账号:" << id << "余额:" << balance << endl;
    }
};

//定期储蓄
class SavingsYearAccount :public Account {
public:
    float rateSta, rateDay; //定期利率和活期利率
    
    int year; //定期年限

    int lastDate; //最后变更日期
    Record rcd[MAXLEN]; //保存所有变更信息
    int nmb; //变更信息条数

    SavingsYearAccount(string _id, float _b, int _year,float _r1, float _r2) :Account(_id, _b) {
        year = _year;
        rateSta = _r1;
        rateDay = _r2;
        nmb = 0;
        //存款后,产生第一条变更信息
        lastDate = 1;
        rcd[nmb].date = 1;
        rcd[nmb].money = _b;
        nmb++;
    }
    //显示账户信息
    void show() {
        cout << "定期储蓄账户,账号:" << id << ",余额:" << balance << ",存款年限:" << year << ",定期利率:" << rateSta << ",活期利率:" << rateDay << endl;
    }
    //计算利率,输入取款时距离存款日期的时长
    void settle() {
        int day;
        int op;
        float tmp = balance; //暂存金额

        // 未到期,变为活期
        cout << "请输入存款时长(天):";
        cin >> day;
    

        if (day / 365 > year) { //到期
            cout << "已到期,";
            //按照整年计算,超期不算利息
            for (int i = 0; i < year; i++) {
                float lx = balance * rateSta;
                balance += lx;
                lastDate += 365;
                rcd[nmb].date = lastDate ;
                rcd[nmb].money = lx; //这里只记录利息
                nmb++;
            }
        }
        else {
            //未到期,转成活期计算
            cout << "未到期,";
            int n = day / 365;
            //整年的
            for (int i = 0; i < n; i++) {
                float lx = balance * rateDay;
                balance += lx;
                lastDate += 365;
                rcd[nmb].date = lastDate;
                rcd[nmb].money = lx; //这里只记录利息
                nmb++;
            }
            //不足一年的
            float lx = day % 365 * balance * rateDay / 365;
            balance += lx;
            /*rcd[nmb].date = day;
            rcd[nmb].money = lx; //这里只记录利息
            nmb++;*/
        }
        //显示
        cout << "本金:"<< tmp  << ",利息:" << balance - tmp << endl;

        cout << "是否取出:1.取出  2.不取出:";
        cin >> op;
        if (op == 1)
        {
            rcd[nmb].date = day;
            rcd[nmb].money = -balance; //这里只记录利息
            nmb++;
            balance = 0; //余额为0
            cout << "已全部取出,当前余额为 0" << endl;
        }
        else
            balance = tmp;
        
    }
    //变更账户信息
    void record() {
        cout << "变更日期  变更金额" << endl;
        for (int i = 0; i < nmb; i++)
        {
            if(rcd[i].money > 0)
                cout << rcd[i].date << "    +" << rcd[i].money << endl;
            else
                cout << rcd[i].date << "    " << rcd[i].money << endl;
        }
        cout << "当前账户余额:" << balance << endl;
    }
};

//活期储蓄
class SavingsAccount : public Account {
public:
    float rate; //利率

    int lastDate; //最后变更日期
    Record rcd[MAXLEN]; //保存所有变更信息
    int nmb; //变更信息条数

    
    SavingsAccount(string _id, float _b, float _r) :Account(_id, _b) {
        rate = _r;
        nmb = 0;
        lastDate = 1;
        //创建账户后自动生成一条记录
        rcd[nmb].date = 1;
        rcd[nmb].money = _b; 
        nmb++;
    }

    //计算利息
    float accumulation(int day) {
        float lx = balance * rate * day / 365;
        return lx;
    }


    //存入现金
    void deposit() {
        cout << "请输入存入金额:";
        float m;
        cin >> m;

        cout << "请输入上一次金额变更距离当前时长:";
        int day;
        cin >> day;
        float lx = settle(day);

        lastDate += day;

        //计算存入前的余额
        balance += lx;

        lastDate += day;

        //保存变更记录 --这里是利息
        rcd[nmb].date = lastDate;
        rcd[nmb].money = lx;
        nmb++;
        balance += m;

        //保存变更记录 --这里是新存入金额
        rcd[nmb].date = lastDate;
        rcd[nmb].money = m;
        nmb++;

        cout << "存入成功,当前余额:"<< balance << endl;
    }

    //取出现金
    void withdraw() {
        cout << "请输入取款金额:";
        float m;
        cin >> m;

        cout << "请输入上一次金额变更距离当前时长:";
        int day;
        cin >> day;
        float lx = settle(day);

        //计算取款前的余额
        balance += lx;

        lastDate += day;

        //保存变更记录 --这里是利息
        rcd[nmb].date = lastDate;
        rcd[nmb].money = -lx; //负数表示取款
        nmb++;
        balance -= m;

        //保存变更记录 --这里是新存入金额
        rcd[nmb].date = lastDate;
        rcd[nmb].money = -m;
        nmb++;

        cout << "取款成功,当前余额:"<< balance << endl;
    }

    //利息结算
    float settle(int day) {
        
        float lx = accumulation(day);
        return lx;
    }

    void show() {
        cout << "活期储蓄账户,账号:" << id << "余额:" << balance << endl;
    }

    //记录变更,变更日期、变更金额
    void record() {
        cout << "变更日期  变更金额" << endl;
        for (int i = 0; i < nmb; i++)
        {
            if (rcd[i].money > 0)
                cout << rcd[i].date << "    +" << rcd[i].money << endl;
            else
                cout << rcd[i].date << "    " << rcd[i].money << endl;
        }
        cout << "当前账户余额:" << balance << endl;
    }
};

int main()
{
    float money, r1, r2;
    int y;
    cout << "创建定期储蓄账户..." << endl;
    cout << "    >> 请输入存款年限:";
    cin >> y;
    cout << "    >> 请输入定期利率:";
    cin >> r1;
    cout << "    >> 请输入活期利率:";
    cin >> r2;
    cout << "    >> 请输入存款金额:";
    cin >> money;

    
    SavingsYearAccount ac1("600001", money, y, r1, r2);
    cout << "    定期账户创建成功!";
    ac1.show();

    cout <<endl << "定期账户计算利率..." << endl;
    ac1.settle();
    cout << "本账户变动情况如下:" << endl;
    ac1.record(); 

    cout << endl << endl;
    cout << "创建活期储蓄账户..." << endl;
    cout << "    >> 请输入活期利率:";
    cin >> r1;
    cout << "    >> 请输入存款金额:";
    cin >> money;
    SavingsAccount ac2("700001", money, r1);
    cout << "    活期账户创建成功!";
    ac2.show();
    ac2.deposit(); //存款
    ac2.withdraw(); //取款
    cout << "本账户变动情况如下:" << endl;
    ac2.record(); //显示记录
    return 0;
}

https://blog.csdn.net/qq_35960743/article/details/124621766

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632