设计开发银行账户管理系统,银行有多种账户,每个账户都包含账号(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)设计几个账户实例测试系统功能,显示账户信息检验系统功能是否完备。
运行结果:
代码:
#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