#include "stdafx.h"
#include<cmath>//关于数学运算的文件,要添加复杂的数学运算要用到
#include<iostream>
using namespace std;
class SavingAccount {
private:
int id;//账号
double balance;//账户余额
double rate;//存款的年利率
int lastDate;//上次变更余额的时期
double accumulation;//余额按日累加之和
void record(int date, double amount);//记录
double accumulate(int date)const//获得到指定日期为止的存款金额按日累计值
{
return accumulation + balance * (date - lastDate);//计算公式,不必在意(就不能来个简单易懂的数学公式吗?我数学不好)
}
public:
SavingAccount(int date, int id, double rate);//构造函数
int GetId() { return id; }//获得账号id
double GetBalance() { return balance; }//获得账户余额
double GetRate() { return rate; }//获得年利率
void Show();//显示账户信息函数的声明
void Depossit(int date, double amount);//存入现金的函数声明
void Withdraw(int date, double amount);//取出现金的函数声明
void Settle(int date);//结算利息,每年1月1日调用一次该函数
};
//相关成员函数的实现
//构造函数地的实现
SavingAccount::SavingAccount(int date, int id, double rate):id(id), balance(0), rate(rate), lastDate(date), accumulation(0)//初始化数据
{
cout << date << "\t#" << id << " is created " << endl;//\t 为制表符是数据看起来像是表格,产生空白
}
//余额变动记录的函数实现
void SavingAccount::record(int date, double amount)//amount 为取出或存入的金额
{
accumulation = accumulate(date);//获得按日累计后的余额之和
lastDate = date;//获得最后一次变动余额的时间
amount = floor(amount * 100 + 0.5) / 100;//floor 是cmath中的函数,是向下取整函数//保留小数点后面两位(真是高端大气上档次的保留小数点的方法,我都不懂)
balance += amount;//将取出和存入的金额与账户余额进行加减
cout << date << "\t#" << id << "\t" << amount << "\t" << balance << endl;
}
//存款函数的实现
void SavingAccount::Depossit(int date, double amount)
{
record(date, amount);//调用余额变动的函数
}
//取款的函数实现
void SavingAccount::Withdraw(int date, double amount)
{
//要先加判断是否取得数额大于余额
if (amount > GetBalance())//调用GetBalance函数得到账户的余额
{
cout << "Error: not enough money" << endl;
}
else
{
record(date, -amount);//因为取钱时余额会少所以是负的,但用户操作时是正数
}
}
//计算利息的函数实现
void SavingAccount::Settle(int date)
{
double interest = accumulate(date)*rate / 365;//同样是不懂的数学公式,貌似这样就得到利息了??
//将利息加到余额中
if (interest != 0)//现在程序员的简便写法,真是越来越懒了
record(date, interest);
accumulation = 0;//将accumulation置为0
}
//显示账户信息的函数实现
void SavingAccount::Show()
{
cout << "#" << id << "\tBalance" << balance;//井号就是个符号不要多想
}
int main(){ //函数有返回值
//创建两个账户
SavingAccount sa1(1, 20137659, 0.015);
SavingAccount sa2(1, 20137660, 0.015);
//几次存款操作和取款操作
sa1.Depossit(5, 5000);
sa2.Depossit(25, 10000);
sa1.Depossit(45, 5500);
sa2.Withdraw(60, 4000);//就是这里取款金额也是正数
//假设在开户后第90天结算利息
sa1.Settle(90);
sa2.Settle(90);
//输出各个账户的信息
sa1.Show(); cout << endl;//换行
sa2.Show(); cout << endl;
return 0;
}