您的位置:首页 > 其它

小项目之个人银行账户管理程序(3)

2018-03-17 15:21 417 查看
exit函数声明在cstdlib头文件中
本次增加了Date类,对日期的表示均替换为Date类型。广泛应用字符串,为每笔账目增加了说明文字,使输出信息更加丰富//date.h
#ifndef _DATE_H_
#define _DATE_H_
class Date//日期类
{
private:
int year;
int month;
int day;
int totalDays;//该日期是从公元元年1曰1日开始的第几天

public:
Date(int year,int month,int day);//用年月日构造日期
int getYear()const{return year;}
int getMonth()const{return month;}
int getDay()const{return day;}
int getMaxDay()const;//获取当月有多少天
//判断当年是否为闰年
bool IsLeapYear()const{return year%4==0 && year%100!=0||year%400==0;}
void show()const;//输出当前日期
//计算两个日期之间差多少天
int distance(const Date &date)const{return totalDays-date.totalDays;}
};
#endif

//date.cpp
#include"date.h"
#include<cstdlib>
#include<iostream>
using namespace std;
namespace
{ //namespace使下面的定义只在当前文件中有效
//存储平年中的某个月1日之前有多少天,为便于getMaxDay函数的实现,该数组多出一项
const int DAYS_BEFORE_MONTH[]={0,31,59,90,120,151,181,212,243,273,304,334,365};
}
Date::Date(int year,int month,int day):year(year),month(month),day(day)
{
if(day <=0||day>getMaxDay())
{
cout<<"Invalid date: ";
show();
cout<<endl;
exit(1);
}
int years=year-1;
totalDays=years*365+years/4-years/100+years/400+DAYS_BEFORE_MONTH[month-1]+day;
if(IsLeapYear()&&month>2)
totalDays++;
}
int Date::getMaxDay()const
{
if(IsLeapYear()&&month==2)
return 29;
else
return DAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1];
}
void Date::show()const
{
cout<<getYear()<<"-"<<getMonth()<<"-"<<getDay();
}

//account.h
#ifndef _ACCOUNT_H_
#define _ACCOUNT_H_
#include"date.h"
#include<iostream>
#include<string>
using namespace std;
class SavingsAccount //储蓄账户类
{
private:
string id;//账号
double balance;//余额
double rate;//存款年利率
Date lastdate;//上次变更余额的时期
double accumulation;//余额按日累加之和
static double total;//所有账户的总金额
//记录一笔账,日期,金额,说明
void record(const Date &date,double amount,const string &desc);
//报告错误信息
void error(const string &msg)const;
//获得到指定日期为止的存款金额按日累积值
double accumulate(const Date& date)const
{
return accumulation +balance*date.distance(lastdate);
}
public:
SavingsAccount(const Date&date,const string &id,double rate);
const string &getID()const{return id;}
double getBalance()const{return balance;}
double getRate()const{return rate;}
static double getTotal(){return total;}
void deposit(const Date &date,double amount,const string &desc);//存入现金
void withdraw(const Date &date,double dmount,const string &desc);//取出现金
void settle(const Date &date);//结算利息,每年1月1日调用一次该函数
void show()const;
};

#endif

//account.cpp
#include"account.h"
#include<cmath>
#include<iostream>
using namespace std;
double SavingsAccount::total=0;
SavingsAccount::SavingsAccount(const Date &date,const string &id,double rate):id(id),balance(0),rate(rate),lastdate(date),accumulation(0)
{
date.show();
cout<<"\t#"<<id<<"created"<<endl;
}
void SavingsAccount::record(const Date &date,double amount,const string &desc)
{
accumulation = accumulate(date);
lastdate=date;
amount=floor(amount*100+0.5)/100;//保留小数点后两位
balance+=amount;
total+=amount;
date.show();
cout<<"\t#"<<id<<"\t"<<amount<<"\t"<<balance<<"\t"<<desc<<endl;
}
void SavingsAccount::error(const string &msg)const
{
cout<<"Error(#"<<id<<"): "<<msg<<endl;
}
void SavingsAccount::deposit(const Date &date,double amount,const string &desc)
{
record(date,amount,desc);
}
void SavingsAccount::withdraw(const Date &date,double amount,const string &desc)
{
if(amount>getBalance())
error("not enough money");
else
record(date,-amount,desc);
}
void SavingsAccount::settle(const Date &date)
{
double interest=accumulate(date)*rate/date.distance(Date(date.getYear()-1,1,1));//计算年息
if(interest!=0)
record(date,interest,"interest");
accumulation=0;
}
void SavingsAccount::show()const
{
cout<<id<<"\tBalance: "<<balance;
}

//main.cpp
#include"account.h"
#include<iostream>
using namespace std;
int main()
{
Date date(2008,11,1);//起始日期
SavingsAccount accounts[]={
SavingsAccount(date,"03755217",0.015),
SavingsAccount(date,"02342342",0.015)
};
const int n=sizeof(accounts)/sizeof(SavingsAccount);//账户总数
accounts[0].deposit(Date(2008,11,5),5000,"salary");
accounts[1].deposit(Date(2008,11,25),10000,"sell stock 0323");
accounts[0].deposit(Date(2008,12,5),5500,"salary");
accounts[1].withdraw(Date(2008,12,20),4000,"buy a laptop");
cout<<endl;
for(int i=0;i<n;++i)
{
accounts[i].settle(Date(2009,1,1));
accounts[i].show();
cout<<endl;
}
cout<<"Total: "<<SavingsAccount::getTotal()<<endl;
return 0;
}运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: