1、1个人银行账户管理程序实验内容:设计一个程序,实现对个人银行账户的管理。银行账户有储蓄账户和信用账户两类。储蓄账户不可以透支,利息每年结算一次;信用账户允许在一定额度内透支,透支则需支付利息,并在每月 1 日进行一次结算。实验要求:1. 程序要实现的功能:a) 用户创建新账户需要提供基本的账号以及金额,如果是储蓄账户,还需定义年利率,如果是信用账户,则还需定义信用额度,日利率,年费b) 储蓄账户:在每年的 1 月 1 日结算利息,利息的计算: 将一年中每天的余额累积起来再除以一年总天数,得到日均余额,再乘以年利率c) 信用账户:在每年的 1 月 1 日扣取年费,信用账户没有利息,但透支则需要支
2、付利息,从透支那天开始计算利息(日均欠费金额利率),并在每月的 1 日进行一次结算d) 用户能查看账户信息以及账户余额的变动情况e) 用户存取款需要提供日期和金额,取款失败应提示输出失败原因2. 设计类并写出每个类的详细描述(包括构造函数,成员变量,成员函数的含义)和画出 UML 类图(体现类之间的关系和类内成员的访问权限 )3. 程序中使用的类应该做到类定义和实现分离(使用多文件结构)4. 设计测试用例对程序功能进行充分测试,并对运行结果进行截图实验分析:定义账户基类 Account 描述所有账户的共性,包含私有成员:账号 id、余额 balance、账户总金额静态数据成员 total;保护
3、成员:构造函数 Account()、记账函数 record()、错误信息报告常函数 error();公有成员:获取账号常函数getId()、获取余额常函数 getBalance()、获取总金额静态函数 getTotal()、显示账户信息 show()。再从账户基类中公有派生出储蓄账户类 SavingsAccount 和信用账户类CreditAccount,储蓄类账户中定义了私有成员:辅助计算利息的累加器 acc、存款的年利率 rate,公有成员:构造函数 SavingsAccount()、用于访问年利率的常函数 getRate()、存现金函数 deposit()、取现金函数 withdraw(
4、)、利息结算函数settle()。信用类账户中定义了私有成员:辅助计算利息的累加器 acc、信用额度credit、欠款的日利率 rate、信用卡年费 fee、获得欠款项函数 getDebt();公有成员:构造函数 CreditAccount()、获取信用额度常函数 getCredit()、获取日利率常函数 getRate()、获取年费常函数 getFee()、获得可用信用额度常函数getAvailableCredit()、存现金函数 deposit()、取现金函数 withdraw()、利息和年费结算函数 settle()。定义类 Accumulator,用于计算一项数值的按日累加之和的接口,
5、通过该类计算利息,包含三个数据成员表示被累加数值上次变更日期的 lastDate、被累加数值当前值 value 以及上次变更被累加数值为止的按日累加总和 sum,该类2同时包含四个函数成员构造函数 Accumulator()、用来计算到指定日期的累加结果的常函数 getSum()、用来在指定日期更改数值的函数 change()以及用来将累加器清零并重新设定初始日期和数值的函数 reset()。定义日期类 Date,该类的数据成员包含 year、month 、day 和 totalDays,其中 totalDays 表示这一天的相对日期。该类的成员函数除了构造函数和用来获得year、 month
6、、day 的函数外,还包括用来得到当前月的天数 getMaxDay()函数、用来判断当前年是否为闰年的 isLeapYear()函数、用来将当前日期输出的 show()函数、用来判断当前日期与指定日期相差天数的 distance()函数,这些函数都会被 Date 类的其他成员函数或 SavingsAccount 类的函数调用。以上各个类之间的 UML 类图如下:+ D a t e ( i n y e a r : i n t , i n m o n t h : i n t , i n d a y : i n t ) + g e t Y e a r ( ) : i n t + g e t M o
7、n t h ( ) : i n t + g e t D a y ( ) : i n t + g e t M a x D a y ( ) : i n t + i s L e a p T e a r ( ) : b o o l + s h o w ( ) + d i s t a n c e ( i n d a t e : D a t e ) : i n t- y e a r : i n t- m o n t h : i n t- d a y : i n t- t o t a l D a y s : i n tD a t e# A c c o u n t ( i n d a t e : D a t
8、e , i n i d : i n t )# r e c o r d ( i n d a t e : D a t e , i n a m o u n t : d o u b l e , i n d e s c : s t r i n g ) # e r r o r ( i n m s g : s t r i n g ) + g e t I d ( ) : i n t + g e t B a l a n c e ( ) : d o u b l e + s h o w ( ) + g e t T o t a l ( ) : d o u b l e- i d : s t r i n g- b a l
9、 a n c e : d o u b l e- t o t a l : d o u b l eA c c o u n t - g e t D e d t ( ) : d o u b l e+ C r e d i t A c c o u n t ( i n d a t e : D a t e , i n i d : i n t , i n c r e d i t : d o u b l e , i n r a t e : d o u b l e , i n f e e : d o u b l e ) + g e t C r e d i t ( ) : d o u b l e + g e t R
10、a t e ( ) : d o u b l e + g e t F e e ( ) : d o u b l e + g e t A v a i l a b l e C r e d i t ( ) : d o u b l e+ d e p o s i t ( i n d a t e : D a t e , i n a m o u n t : d o u b l e , i n d e s c : s t r i n g )+ w i t h d r a w ( i n d a t e : D a t e , i n a m o u n t : d o u b l e , i n d e s c
11、: s t r i n g )+ s e t t l e ( i n d a t e : D a t e ) + s h o w ( )- a c c : A c c u m u l a t o r- c r e d i t : d o u b l e- r a t e : d o u b l e- f e e : d o u b l eC r e d i t A c c o u n t+ A c c u m u l a t o r ( i n d a t e : D a t e , i n v a l u e : d o u b l e ) + g e t S u m ( i n d a t
12、 e : D a t e ) : d o u b l e+ c h a n g e ( i n d a t e : D a t e , i n v a l u e : d o u b l e )+ r e s e t ( i n d a t e : D a t e , i n v a l u e : d o u b l e )- l a s t D a t e : D a t e- v a l u e : d o u b l e- s u m : d o u b l eA c c u m u l a t o r+ S a v i n g s A c c o u n t ( i n d a t
13、e : D a t e , i n i d : i n t , i n r a t e : d o u b l e ) + g e t R a t e ( ) : d o u b l e+ d e p o s i t ( i n d a t e : D a t e , i n a m o u n t : d o u b l e , i n d e s c : s t r i n g )+ w i t h d r a w ( i n d a t e : D a t e , i n a m o u n t : d o u b l e , i n d e s c : s t r i n g )+ s
14、 e t t l e ( i n d a t e : D a t e )- a c c : A c c u m u l a t o r- r a t e : d o u b l eS a v i n g s A c c o u n t1113程序代码:账户类定义头文件:/Account.h#ifndef _ACCOUNT_H_ #define _ACCOUNT_H_ #include #include “Date.h“ #include “Accumulator.h“ class Account private: std:string id; double balance; static do
15、uble total; protected: Account(const Date void record(const Date void error(const Date public: const std:string double getBalance() constreturn balance; static double getTotal()return total; void show() const; ; class SavingsAccount:public Account private: Accumulator acc; double rate; public: Savin
16、gsAccount(const Date double getRate() const return rate;4 void deposit(const Date void withdraw(const Date void settle(const Date ; class CreditAccount:public Account private: Accumulator acc; double credit; double rate; double fee; double getDebt() const double balance = getBalance(); return (balan
17、ce #include #include #include “Account.h“ using namespace std; double Account:total = 0; Account:Account(const Date cout getBalance() error(date, amount, “you not enough money“); else record(date,-amount,desc); acc.change(date,getBalance(); void SavingsAccount:settle(const Date if(interest!=0) recor
18、d(date,interest,“interest“); acc.reset(date,getBalance(); CreditAccount:CreditAccount(const Date acc.change(date,getDebt(); void CreditAccount:withdraw(const Date else record(date,-amount,desc); acc.change(date,getDebt(); void CreditAccount:settle(const Date if(interest!=0) record(date,interest,“int
19、erest“); if(date.getMonth()=1)record(date,-fee,“annual fee“); 7acc.reset(date,getDebt(); void CreditAccount:show() const Account:show(); cout #include #include “Date.h“ using namespace std; namespace const int DAYS_BEFORE_MONTH=0,31,59,90,120,151,181,212,243,273,304,334,365; Date:Date(int year,int m
20、onth,int day):year(year),month(month),day(day) if(day getMaxDay() cout 2) totalDays+; int Date:getMaxDay() const if(isLeapYear() else return DAYS_BEFORE_MONTHmonth - DAYS_BEFORE_MONTHmonth-1; void Date:show() const cout value = value; void reset(const Date this-value = value; sum=0; ; #endif 测试用例及截图
21、:/main.cpp#include #include #include “Account.h“ using namespace std;int main() Date date(2016, 12, 22);cout“建立账户“endl;SavingsAccount sa1(date, “SA_2016“, 0.015);SavingsAccount sa2(date, “SA_2017“, 0.015);CreditAccount ca(date, “CA_2018“, 10000, 0.0005, 100);10cout“所有账户的交易记录 (存款、取款、结算 )“endl;cout“Ti
22、mett“Account_idt“setw(6)“Amountt“setw(11)“Balancet“Notes“endl;sa1.settle(Date(2017, 1, 1);sa2.settle(Date(2017, 1, 1);ca.settle(Date(2017, 1, 1);sa1.deposit(Date(2017, 1, 5), 5000, “salary“);ca.withdraw(Date(2017, 1, 15), 3000, “buy a cell“);sa2.deposit(Date(2017, 1, 25), 10000, “sell stock 0323“);c
23、a.settle(Date(2017, 2, 1);ca.settle(Date(2017, 3, 1);ca.settle(Date(2017, 4, 1);ca.deposit(Date(2017, 4, 1), 2018, “repay the credit“);ca.settle(Date(2017, 5, 1);sa1.deposit(Date(2017, 5, 5), 5500, “salary“);ca.settle(Date(2017, 6, 1);ca.settle(Date(2017, 7, 1);ca.withdraw(Date(2017, 7, 10), 10000,
24、“donation“);sa2.withdraw(Date(2017, 7, 20), 15000, “buy a cell phone“);ca.settle(Date(2017, 8, 1);ca.deposit(Date(2017, 8, 26), 1000, “repay the credit“);ca.settle(Date(2017, 9, 1);ca.settle(Date(2017, 10, 1);ca.settle(Date(2017, 11, 1);ca.settle(Date(2017, 12, 1);sa1.settle(Date(2018, 1, 1);sa2.settle(Date(2018, 1, 1);ca.settle(Date(2018, 1, 1);cout“所有账户信息 “endl;sa1.show();coutendl;sa2.show();coutendl;ca.show();coutendl;cout“所有账户总金额 Total:“ Account:getTotal() endl;return 0;11运行结果: