银行账户管理系统
#ifndef __DATE_H__
#define __DATE_H__
class Date
{
private:
int year;
int month;
int day;
int totalDays;
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(Date& date) const{
return totalDays-date.totalDays;
}
}
#endif
#include"date.h"
#include<iostream>
#include<cstdlib>
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 month,int day):year(year),month(month),day(day){
if(day<=0 || day>getMaxday()){
cout<<"Invlid 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();
}
#ifndef __ACCUMULATOR_H__
#define __ACCUMULATOR_H__
#include "date.h"
class Accumulator{
private:
Date lastDate;
double value;
double sum;
public:
Accumulator(const Date& date,double value):lastDate(date),value(value),sum(0){}
double getSum(const Date& date) const{
return sum+value*date.distance(lastDate);
}
void change(const Date& date,double value){
sum=getSum(date);
lastDate=date;
this->value=value;
}
void reset(const Date& date, double value){
lastDate=date;
this->value=value;
sum=0;
}
};
#endif
#ifndef __ACCOUNT_H__
#define __ACCOUNT_H__
#include"date.h"
#include"accumulator.h"
#include<string>
class Account{
private:
std::string id;
double balance;
static double total;
protected:
Account(const Date& date, const std::string& id);
void record(const Date& date, double amount, const std::string& desc);
void error(const std::string& msg) const;
public:
const std::string& getId() const { return id; }
const getBalance() const { return balance; }
static double getTotal() { return total; }
void show() const;
};
class SavingsAccount : public Account{
private:
Accumulator acc;
double rate;
public:
SavingsAccount(const Date& date, const std::string& id, double rate);
double getRate() const { return rate; }
void deposit(const Date& date, double amount,const std::string& desc);
void withdraw(const Date& date, double amount, const std::string& desc);
void settle(const Date& date);
};
class CreditAccount : public Account {
private:
Accumulator acc;
double credit;
double rate;
double fee;
double getDebt() const{
double balance = getBalance();
return (balance < 0 ? balance:0);
}
public:
CreditAccount(const Date& date, const std::string& id,
double credit, double rate,double fee);
double getCredit() const { return credit; }
double getRate() const { return rate; }
double getFee() const { return fee; }
double getAvaliableCredit() const {
if(getBalance()<0)
return credit + getBalance();
else
return credit;
}
void deposit(const Date& date, double amount, const std::string& desc);
void withdraw(const Date& date, double amount, const std::string& desc);
void settle(const Date& date);
void show() const;
};
#endif
#include "account.h"
#include <cmath>
#include <iostream>
using namespace std;
double Account::total=0;
Account::Account(const Date& date, const string& id): id(id),balance(0){
date.show();
cout<<"\t#"<<id<<"created"<<endl;
}
void Account::record(const Date& date, double amount, const string& desc){
amount=floor(amount*100+0.5)/100;
balance+=amount;
total+=amount;
date.show();
cout<<"\t#"<<id<<"\t"<<amount<<"\t"<<balance<<"\t"<<desc<<endl;
}
void Account::show() const{
cout<<id<<"\tBalance:"<<balance;
}
void Account::error(const string& msg) cosnt{
cout<<"Error(#"<<id<<"):"<<msg<<endl;
}
SavingsAccount::SavingsAccount(const Date& date, const string& id, double rate)
:Account(date,id),rate(rate),acc(date,0){}
void SavingsAccount::withdraw(const Date& date, double amount, const string& desc){
if(amount>getBalance()){
error("not enough money");
}
else {
record(date,-amount,desc);
acc.change(date,getBalance());
}
}
void SavingsAccount::settle(const Date& date){
double interest=acc.getSum(date)*rate
/ date.distance(Date(date.getYear()-1,1,1));
if(interest!=0)
record(date,interest,"interest");
acc.reset(date,getBalance());
}
CreditAccount::CreditAccount(const Date& date,const string& id, double credit,
double rate, double fee):Account(date,id),credit(credit),
rate(rate),fee(fee),acc(date,0){}
void CreditAccount::deposit(const Date& date, double amount, const string& desc){
record(date,amount,desc);
acc.change(date,getDebt());
}
void CreditAccount::withdraw(const Date& date, double amount, const string& desc) {
if (amount - getBalance() > credit) {
error("not enough credit");
}
else {
record(date, -amount, desc);
acc.change(date, getDebt());
}
}
void CreditAccount::settle(const Date& date) {
double interest = acc.getSum(date) * rate;
if (interest != 0)
record(date, interest, "interest");
if (date.getMonth() == 1)
record(date, -fee, "annual fee");
acc.reset(date, getDebt());
}
void CreditAccount::show() const {
Account::show();
cout << "\tAvailable credit:" << getAvailableCredit();
}
#include "account.h"
#include <iostream>
using namespace std;
int main() {
Date date(2008, 11, 1);
SavingsAccount sa1(date, "S3755217", 0.015);
SavingsAccount sa2(date, "02342342", 0.015);
CreditAccount ca(date, "C5392394", 10000, 0.0005, 50);
sa1.deposit(Date(2008, 11, 5), 5000, "salary");
ca.withdraw(Date(2008, 11, 15), 2000, "buy a cell");
sa2.deposit(Date(2008, 11, 25), 10000, "sell stock 0323");
ca.settle(Date(2008, 12, 1));
ca.deposit(Date(2008, 12, 1), 2016, "repay the credit");
sa1.deposit(Date(2008, 12, 5), 5500, "salary");
sa1.settle(Date(2009, 1, 1));
sa2.settle(Date(2009, 1, 1));
ca.settle(Date(2009, 1, 1));
cout << endl;
sa1.show(); cout << endl;
sa2.show(); cout << endl;
ca.show(); cout << endl;
cout << "Total: " << Account::getTotal() << endl;
return 0;
}