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

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;
}

运行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值