代码实现:
// Accumulator类
#ifndef ACCUMULATOR_H_INCLUDED
#define ACCUMULATOR_H_INCLUDED
#include "date.h"
class Accumulator
{
private:
Date lastDate;
double value;
double sum;
public:
Accumulator(const Date &date1,double value)
:lastDate(date1),value(value),sum(0) {}
double getsum(const Date &date)
{
return sum+(value*date.distance(lastDate));
}
void change(const Date &date,double value)
{
sum=getsum(date);
lastDate = date;
this->value = value;
sum=0;
}
void reset(const Date &date,double value)
{
lastDate=date;
this->value=value;
sum=0;
}
};
#endif // ACCUMULATOR_H_INCLUDED
// Date类
#ifndef DATE_H_INCLUDED
#define DATE_H_INCLUDED
#include
#include
#include
using namespace std;
int dayofmon[20]={0,31,59,90,120,151,181,212,243,273,304,334,365};
class Date{
private:
int year,month,day;
int totaldays;
public:
Date(int y,int m,int d);
int getyear()const
{
return year;
}
int getmon()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 abs(totaldays-date.totaldays);
}
};
int Date::getmaxday()const
{
if(isleapyear()&&month==2)
{
return 29;
}
else
{
return dayofmon[month]-dayofmon[month-1];
}
}
Date::Date(int year,int month,int day):year(year),month(month),day(day)
{
if(day<=0||day>getmaxday())
{
cout<
show();
cout<
exit(1);
}
int years=year-1;
totaldays=years*365+years/4-years/100+years/400+dayofmon[month-1]+day;
if(isleapyear()&&month>2)totaldays++;
}
void Date::show()const
{
cout<
}
#endif // DATE_H_INCLUDED
// Account类
#ifndef ACCOUNT_H_INCLUDED
#define ACCOUNT_H_INCLUDED
#include "date.h"
#include "accumulator.h"
#include
#include
#include
#include
using namespace std;
string to_string(int x)
{
string s;
if(x == 0) s += '0';
while(x)
{
s += (x%10)+'0';
x /= 10;
}
reverse(s.begin(),s.end());
return s;
}
class Account
{
private:
string id;
double balance;
static double total1,total2;
vectorrec;
protected:
Account(const Date &date,const string &id);
void record(const Date &date,double amount,const string &desc);
void error(const string &msg)const;
public:
const string &getid()
{
return id;
}
void changetotal1(double amount)
{
total1+=amount;
}
void changetotal2(double amount)
{
total2+=amount;
}
double getbalance()const
{
return balance;
}
static double gettotal1()
{
return total1;
}
static double gettotal2()
{
return total2;
}
void show()const;
};
class SavingAccount:public Account
{
private:
Accumulator acc;
double rate[5]={0,0.35*0.01/365,1.5*0.01/365,2.10*0.01/365,2.75*0.01/365};
int index;
public:
SavingAccount(const Date&date,const string &id,int index);
double getrate(int i)
{
return rate[i];
}
void changerate(double rate1,int i)
{
rate[i]=rate1;
}
void changekind(int i)
{
index=i;
}
void deposit(const Date &date,double amount,const string &desc);
void withdraw(const Date&date,double amount,const 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 string &id,double credit,double rate,double fee);
double getcredit()const
{
return credit;
}
double getrate()const
{
return rate;
}
double getfee()const
{
return fee;
}
double getAvailableCredit()const
{
if(getbalance()<0)
{
return credit+getbalance();
}
else return credit;
}
void deposit(const Date &date,double amount,const string &desc);
void withdraw(const Date &date,double amount,const string &desc);
void settle(const Date &date);
void show()const;
};
double Account::total1=0;
double Account::total2=0;
Account::Account(const Date &date,const string &id):id(id),balance(0)
{
date.show();
cout<
}
void Account::record(const Date &date,double amount,const string &desc)
{
amount=floor(amount*100+0.5)/100;
balance+=amount;
//total1+=amount;
date.show();
cout<
string t;
t=t+to_string(date.getyear())+"-"+to_string(date.getmon())+"-"+to_string(date.getday())+": ";
t=t+" #"+id+" "+to_string(amount)+" "+to_string(balance)+" "+desc;
rec.push_back(t);
}
void Account::show()const
{
cout<
for(int i=0;i
{
cout<
}
}
void Account::error(const string &msg)const
{
cout<
}
SavingAccount::SavingAccount(const Date &date,const string &id,int index)
:Account(date,id),index(index),acc(date,0) {}
void SavingAccount::deposit(const Date&date,double amount,const string &desc)
{
changetotal1(amount);
record(date,amount,desc);
acc.change(date,getbalance());
}
void SavingAccount::withdraw(const Date&date,double amount,const string &desc)
{
if(amount>getbalance())
{
error("not enough money");
}
else
{
changetotal1(-amount);
record(date,-amount,desc);
acc.change(date,getbalance());
}
}
void SavingAccount::settle(const Date &date)
{
double interest=acc.getsum(date)*rate[index];
// cout<
if(interest!=0)
{
record(date,interest,"interest");
changetotal1(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)
{
changetotal2(-amount);
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
{
changetotal2(amount);
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");
changetotal2(interest);
}
if(date.getmon()==1)
{
record(date,-fee,"annual fee");
changetotal2(fee);
}
acc.reset(date,getDebt());
}
void CreditAccount::show()const
{
Account::show();
cout<
}
#endif // ACCOUNT_H_INCLUDED
//主程序
#include
#include "date.h"
#include "accumulator.h"
#include "account.h"
using namespace std;
vectorst;
int main()
{
Date day1(2016,1,1);
printf("Choose your deposit method:n");
printf("1-Demand deposit 2-Fixed deposit for one yearn");
printf("3-Fixed deposit for two yearsn");
printf("4-Fixed deposit for three yearsn");
int n;
cin>>n;
SavingAccount a(day1,"1001",n);
cout<
Date day2(2018,3,5);
Date day3(2018,4,5);
a.deposit(day2,1000,"saving 1000 yuan");
a.withdraw(day3,20,"get 20 yuan");
Date day8(2019,5,6);
a.deposit(day8,8000,"salary");
a.settle(day8);
printf("This is the Student Credit accountn");
CreditAccount b(day2,"1006",50000,0.006/365,20);
Date day4(2019,9,1);
b.withdraw(day4,5000,"tuition");
b.getAvailableCredit();
Date day5(2020,10,5);
b.withdraw(day5,20000,"buy a cell");
Date day6(2035,10,9);
Date day7(2021,10,5);
b.deposit(day7,1000,"get salary");
b.settle(day6);
printf("show the details of student A:n");
st.push_back(a);
a.show();
printf("Total deposit:n");
cout<
printf("Total loans:n");
cout<
return 0;
}