完成功能:1、能够实现多种存储方式:包括活期存储,定期存储一年、两年、三年并且实现结算业务。
2、 能够模仿学生读书账号的借贷手续、借贷业务和结算业务
3、 能够查询某账号下的总资产和明细记录。
4、 能够查询银行的总存款额和总借贷额
类的设计:
Accumulator类用于存放按照时间累加后的值
Date类存放日期
Account 类 表明所有的账户的公共信息
Savingaccount表示存储账户的信息
Creditaccount 表示学生借贷账户的信息
代码实现:
// 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 <iostream>
#include <cstdlib>
#include <cmath>
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<<"Invalid date:";
show();
cout<<endl;
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<<getyear()<<"-"<<getmon()<<"-"<<getday();
}
#endif // DATE_H_INCLUDED
// Account类
#ifndef ACCOUNT_H_INCLUDED
#define ACCOUNT_H_INCLUDED
#include "date.h"
#include "accumulator.h"
#include <string>
#include <cmath>
#include <iostream>
#include <bits/stdc++.h>
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;
vector<string>rec;
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<<"\t#"<<id<<" created"<<endl;
}
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<<"\t#"<<id<<"\t"<<amount<<"\t "<<balance<<"\t"<<desc<<endl;
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<<id<<"\tBalance:"<<balance<<endl;;
for(int i=0;i<rec.size();i++)
{
cout<<rec[i]<<endl;
}
}
void Account::error(const string &msg)const
{
cout<<"Error(#"<<id<<"):"<<msg<<endl;
}
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<<interest<<endl;
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<<"\tAvailable credit:"<<getAvailableCredit();
}
#endif // ACCOUNT_H_INCLUDED
//主程序
#include <iostream>
#include "date.h"
#include "accumulator.h"
#include "account.h"
using namespace std;
vector<SavingAccount>st;
int main()
{
Date day1(2016,1,1);
printf("Choose your deposit method:\n");
printf("1-Demand deposit 2-Fixed deposit for one year\n");
printf("3-Fixed deposit for two years\n");
printf("4-Fixed deposit for three years\n");
int n;
cin>>n;
SavingAccount a(day1,"1001",n);
cout<<a.getrate(n)*100*365<<"%"<<endl;
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 account\n");
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<<a.gettotal1()<<endl;
printf("Total loans:\n");
cout<<a.gettotal2()<<endl;
return 0;
}