|
楼主 |
发表于 2022-6-5 17:42:19
|
显示全部楼层
这是书上的参考
4.8综合实例--个人银行账户管理程序
我们以一个面向个人的银行账户管理程序为例,说明类及成员函数的设计。
4.8.1 类的设计
一个人可以有多个活期储蓄账户,一个活期储蓄账户包括账号(id)余额(balance)、年利率(rate)等信息,还包括显示账户信息(show)、存款(deposit)、取款(withdraw)、结算和(settle)等操作,为此,设计一个类SavingsAccount,将id balancerate均作为其成员数将deposit、withdraw、settle均作为其成员函数。类图设计如图4-13所示。
SavingsAccount
-id:int
-balance: double -rate: double -lastDate:int
-accumulation:double
-record(date:int,amount:double) -accumulate(date:int):double
+SavingsAccount(date:int,id:int,rate:double)+getId(): int
+getBalance(): double+getRate(): double+show()
+deposit(date:int,amount:double)+withdraw(date:int,amount:double)+settle(date:int)
图4-13个人银行账户管理程序的SavingsAccount类的UML图
无论是存款、取款还是结算利息,都需要修改当前的余额并且将余额的变动输出,这些公共操作由私有成员函数record来执行。
我:
第4章类与对象 ·139·
实现该类的难点在于利息的计算。由于账户的余额是不断变化的,因此不能通过余额与年利率相乘的办法来计算年利,而需将一中每天的余额累积起来再除以一年的总天数,得到一个日均余额,再乘以年利率。为了计算余额的按日累积值,SavingsAccou引入了私有数据成员lastDateaccumulation 和私有成员函数accumulate。lastDate 用来储上一次余额变动的日期,accumulation 用来存储上次计算利息以后直到最近一次余额变动时余额按日累加的值,accumulate成员函数用来计算截至指定日期的账户余额按日累积值。这样,当余额变动时,需要做的是将变动前的余额与该余额所持续的天数相乘,累加 accumulation 中,再修改lastDate
为简便起见,该类中的所有日期均用一个整数来表示,该整数是一个以日为单位的相对日期。例如,如果以开户日为1,那么开户日后的第3天就用4来表示,这样通过将两个日期相减就可得到两个日期相差天数,在计算利息时非常方便。
4.8.2源程序及说明
例4-10个人银行账户管理程序。
//4 10.cpp
#include<iostream>#include <cmath>
using namespace std;
class SavingsAccount{ //储蓄账户类
private:
int id; //账号
double balancer /余额
double rate; //存款的年利率
int lastDates //上次变更余额的时期
double accumulation; //余额按日累加之和
//记录一笔账,date为日期,amount为金额,desc为说明 void record(int date,doubleamount)i//获得到指定日期为止的存款金额按日累积值 double accumulate(int date)const{
return accumulation+balance*(date-lastDate);}
public:
//构造函数
SavingsAccountlint date, intiddoublerate); int getid() (return id;)
double getBalance() (return balance;l double getRate()(return rate;!
void deposit(int date, double amount); //存人现金
void withdraw(int date, double amount) //取出现金
//结算利息,每年1月1日调用一次该函数 void settle(int date);//显示账户信息
我:
C++语言程序设计(第5版,
·140·
void show();};
//SavingsAccount
SavingsAccount::SavingsAccount(int date, int id, double rate)
:id(id),balance(0),ratelrate),lastDate(date),accumulation(0) cout<<date<<"\t#"<<id<<" is created"<<endl;
void SavingsAccount::record(int date, double amount){
accumulation=accumulate(date);
lastDate=date //保留小数点后两位
amount=floor(amount*100+0.5)/100; balance+=amount;
cout<<date<<"\tf"<<id<<"\t"<<amount<<"\t"<<balance<<endl;
void SavingsAccount:deposit(int date, double amount){
record(date,amount);
}
void SavingsAccount:withdraw(int datedoubleamount){
if(amount> getBalance())
cout<<"Error: not enough money"<<end; else
record(date,-amount);
void SavingsAccountsettle(intdate){
doubleinterest=accumulate(date)*rate/365; //计算息
if(interest!-0)
record(date,interest); accumulation=0:
void SavingsAccount;show(){
cout<<"#"<<id<<"\tBalance: "<<balances}
int main() {
//建立几个账户
SavingsAccount sa0(1213253020.015) SavingsAccount sal(1,58320212,0.015);//几笔账目
sa0deposit(5,5000); saldeposit(25,10000); sa0deposit(45,5500); sa1withdraw(60,4000);
1/开户后第90天到了银行的计息日,结算所有账户的年息 sa0.settle(90); sal.settle(90);//输出各个账户信息
我:
·141·
第4章类与对象
sa0.show(); cout<<endl;
salshow(); cout<<endl;
return 0;}
运行结果:
#21325302 is created
1 #58320212 is created
5 #21325302 5000 5000
25 #58320212 10000 10000
45 #21325302 5500 10500
60 #58320212 -4000 6000
90 #21325302 27.64 10527.6
90 #58320212 21.78 6021.78
#21325302 Balance:10527.6
#58320212 Balance:6021.78
在上面程序中,首先给出了SavingsAccount类的定义,只有几个简短的函数实现写在了类定义中,大部分函数的实现代码写在了类定义后。在主程序中,定义了两个账户实例 saO和sal,它们的年利率都是15%,随后分别在第5天、45天向账户sa0存人5000元和5500元,在第25天向账户sal存入10000元,在第60天从账户sa1取出4000元,账户开户后的第90天是银行的计息日,两个账户分别得到了27.64元和21.78元的利息。以账户 sa0为例,它在第5天到第45天的余额为5000元,第45天到第90天的余额为10500元,因此它的利息是(40x5000+45x10500)/365x15%=27.64元。
细节 以上程序的SavingsAccount::record函数中使用了floor函数,该函数是向下取整函数(在数学上称为高斯函数),用来得到不大于一个数的最大整数,声明在头文件 cmath中。一般来说,如果需要对一个数x做四舍五入取整,可以通过表达式floor(x+0.5)进行。而record 函数中的表达式将原数事先乘以了 100,取整完毕后再除以100,因此原数的小数点后两位得以保留。另外,cmath 中还提供了 floor 的姊妹函数--ceil,该函数为向上取整函数,用来得到不小于一个数的最小整数。
在开户(构造账户)、存款、取款、计息的过程中,每一笔记录都被输出出来了。最后分别输出两个账户的信息。 |
|