本文共 20434 字,大约阅读时间需要 68 分钟。
#if 0 //1
#ifndef _ACCOUNTH#define _ACCOUNTHclass SavingsAccount //储蓄账户{ public:SavingsAccount(int date,int id,double rate);int getid()const{return id;}double getbalance()const{return balance;}double getrate(){return rate;}static double gettotal(){return total;}void deposit(int date,double amount); //存入现金void withdraw(int date,double amount); //取出现金void settle(int date); //结算利息,每年1月1日调用一次该函数void show()const; //显示账户信息private:int id; //账号double balance; //余额double rate; //存款的年利率int lastdate; //上次变更余额的日期double accumulation; //余额按日累加之和static double total; //所有账户的总金额void record(int date,double amount);//记录一笔账,date为日期,amount为金额double accumulate(int date)const//获得到指定日期位置的存款金额按日累积值{ return accumulation+balance*(date-lastdate);}};#endif
#endif#if 0 //2#ifndef _ACCOUNTH#define _ACCOUNTH#include"date.h"#include<string>class SavingsAccount //储蓄账户类{ public://构造函数SavingsAccount(const Date &date,const std::string &id,double rate);const std::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 std::string &desc);//取出现金void withdraw(const Date &date,double amount,const std::string &desc);//结算利息,每年的1月1日调用一次该函数void settle(const Date &date);void show()const;private:std::string id; //账号double balance; //余额double rate; //存款的年利率Date lastdate; //上次变更余额的日期double accumulation; //余额按日累加之和static double total; //所有账户的总金额//记录一笔账,date为日期,amount为金额,desc为说明void record(const Date &date,double amount,const std::string &desc);//报告错误信息void error(const std::string &msg)const;//获得到指定日期位置的存款金额按日累加值double accumulate(const Date &date)const{return accumulation+balance*date.distance(lastdate);}};#endif#endif#if 0 //3#ifndef _ACCOUNTH#define _ACCOUNTH#include "date.h"#include "accumulator.h"#include<string>class Account //账户类{ public:const std::string &getid()const{return id;}double getbalance()const{return balance;}static double gettotal(){return total;}void show()const; //显示账户信息protected://供派生类调用的构造函数,id为账户Account(const Date &date,const std::string &id);//记录一笔账,date为日期,amount为金额,desc为说明void record(const Date &date,double amount,const std::string &desc);//报告错误信息void error(const std::string &msg)const;private:std::string id; //账号double balance; //余额static double total; //所有账户的总金额};class SavingsAccount:public Account //储蓄账户类{ { public://构造函数SavingsAccount(const Date &date,const std::string &id,double rate);double getrate(){return rate;}//存入现金void deposit(const Date &date,double amount,const std::string &desc);//取出现金void withdraw(const Date &date,double amount,const std::string &desc);//结算利息,每年1月1日调用一次该函数void settle(const Date &date);private:Accumulator acc; //辅助计算利息的累加器double rate; //存款的年利率};class CreditAccount:public Account //信用账户类{ 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 getavailablecredit()const //获得可用信用额度{ if(getbalance()<0)return credit+getbalance();elsereturn credit;}//存入现金void deposit(const Date &date,double amount,const std::string &desc);//取出现金void withdraw(const Date &date,double amount,const std::string &desc);//结算利息,每年1月1日调用一次该函数void settle(const Date &date);void show()const;private:Accumulator acc; //辅助计算利息的累加器double credit; //信用额度double rate; //欠款的日利率double fee; //信用卡年费double getdebt()const //获得欠款额{ double balance=getbalance();return (balance<0?balance:0);}};#endif#endif#if 0 //4
#ifndef _ACCOUNTH#define _ACCOUNTH#include "date.h"#include "accumulator.h"#include<string>class Account //账户类{ private:std::string id; //账号double balance; //余额static double total; //所有账户的总金额protected://供派生类调用的构造函数,id为账户Account(const Date &date,const std::string &id);//记录一笔账,date为日期,amount为金额,desc为说明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;}double getbalance()const{return balance;}static double gettotal(){return total;}virtual void deposit(const Date &date,double amount,const std::string &desc)=0;virtual void withdraw(const Date &date,double amount,const std::string &desc)=0;//结算(计算利息,年费等),每月结算一次,date为结算日期virtual void settle(const Date &date)=0;virtual void show()const;};class SavingsAccount:public Account //储蓄账户类{ public://构造函数SavingsAccount(const Date &date,const std::string &id,double rate);double getrate(){return rate;}//存入现金void deposit(const Date &date,double amount,const std::string &desc);//取出现金void withdraw(const Date &date,double amount,const std::string &desc);//结算利息,每年1月1日调用一次该函数void settle(const Date &date);private:Accumulator acc; //辅助计算利息的累加器double rate; //存款的年利率};class CreditAccount:public Account //信用账户类{ 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 getavailablecredit()const{ if(getbalance()<0)return credit+getbalance();elsereturn credit;}//存入现金void deposit(const Date &date,double amount,const std::string &desc);//取出现金void withdraw(const Date &date,double amount,const std::string &desc);//结算利息,每年1月1日调用一次该函数void settle(const Date &date);void show()const;private:Accumulator acc; //辅助计算利息的累加器double credit; //信用额度double rate; //欠款的日利息double fee; //信用卡年费double getdebt()const //获得欠款额{ double balance=getbalance();return (balance<0?balance:0);}};#endif#endif#if 0 //2 3
#ifndef _DATEH#define _DATEHclass Date //日期类{ 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;}private:int year; //年int month; //月int day; //日int totaldays; //该日期是从公元元年1月1日开始的第几天};#endif#endif#if 0 //4#ifndef _DATEH#define _DATEHclass 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 operator-(const Date &date)const //计算两个日期之间差多少天{ return totaldays-date.totaldays;}};#endif#endif
#if 0 //2 3 4
#include"date.h"#include<iostream>#include<cstdlib>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;elsereturn DAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1];}void Date::show()const
{cout<<getyear()<<"-"<<getmonth()<<"-"<<getday();}#endif#if 0 //3
#ifndef _ACCUMULATORH#define _ACCUMULATORH#include"date.h"class Accumulator{ 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;}private:Date lastdate;double value;double sum;};#endif#endif
#if 0 //4
#ifndef _ACCUMULATORH#define _ACCUMULATORH#include"date.h"class Accumulator //将某个数值按日累加{ private: Date lastdate; //上次变更数值的日期double value; //数值的当前值double sum; //数值按日累加之和public://构造函数,date为开始累加的日期,value为初始值Accumulator(const Date &date,double value):lastdate(date),value(value),sum(0){}//获得日期date累加的结果double getsum(const Date &date)const{ return sum+value*(date-lastdate);}//在date将数值变更为valuevoid change(const Date &date,double value){ sum=getsum(date);lastdate=date;this->value=value;sum=0;}//初始化,将日期变更为date,数值变更为value,累加器清零void reset(const Date &date,double value){ lastdate=date;this->value=value;sum=0;}};#endif#endif#if 0 //0
#include<iostream>#include<cmath>using namespace std;class savingsaccount{ private:int id;double balance;double rate;int lastdate;double accumulation;void record(int date,double amount);double accumulate(int date)const{ return accumulation+balance(date-lastdate);}public:savingsaccount(int date,int id,double rate);int getID(){ return id;}double getbalance(){ return balance;}double getrate(){ return rate;}void deposit(int date,double amount);void withdraw(int date,double amount);void settle(int date);void show();};savingsaccount::savingsaccount(int date,int id,double rate):id(id),balance(0),rate(rate),lastdate(date),accumulation(0){ cout<<date<<"\t#"<<id<<"is created"<<endl;}void savingsaccount::record(int date,double amount){ accumulation=accumulate(date);lastdate=date;amount=floor(amount100+0.5)/100;balance+=amount;cout<<date<<"\t#"<<id<<"\t"<<amount<<"\t"<<balance<<endl;}void savingsaccount::deposit(int date,double amount){ record(date,amount);}void savingsaccount::withdraw(int date,double amount){ if(amount>getbalance())cout<<"error:not enough money"<<endl;elserecord(date,-amount);}void savingsaccount::settle(int date){ double interest=accumulate(date)*rate/365;if(interest!=0)record(date,interest);accumulation=0;}void savingsaccount::show(){ cout<<"#"<<id<<"\tbalance:"<<balance;}int main(){ savingsaccount sa0(1,21325302,0.015);savingsaccount sa1(1,58320212,0.015);sa0.deposit(5,5000);sa1.deposit(25,10000);sa0.deposit(45,5500);sa1.withdraw(60,4000);sa0.settle(90);sa1.settle(90);sa0.show();cout<<endl;sa1.show();cout<<endl;return 0;}#endif#if 0 //1#include"个人银行账户.h"#include<iostream>using namespace std;int main(){ //建立几个账户SavingsAccount sa0(1,21325302,0.015);SavingsAccount sa1(1,58320212,0.015);//几笔账目sa0.deposit(5,5000);sa1.deposit(25,10000);sa0.deposit(45,5500);sa1.withdraw(60,4000);//开户后第90天到了银行的计息日,结算所有账户的年息sa0.settle(90);sa1.settle(90);//输出各账户信息sa0.show(); cout<<endl;sa1.show(); cout<<endl;cout<<"total:"<<SavingsAccount::gettotal()<<endl;return 0;}#endif#if 0 //2#include"个人银行账户.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,"seii 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;}#endif#if 0 //3#include"个人银行账户.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,"salarly");//结算所有账户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;}#endif#if 0 //4#include"个人银行账户.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);Account accounts[]={&sa1,&sa2,&ca};const int n=sizeof(accounts)/sizeof(Account); //账户总数cout<<"(d)deposit(w)withdraw(s)show(c)change day(n)next month(e)exit"<<endl;char cmd;do{ //显示日期和总金额date.show();cout<<"\ttotal:"<<Account::gettotal()<<"\tcommand>";int index,day;double amount;string desc;cin>>cmd;switch(cmd){ case 'd': //存入现金cin>>index>>amount;getline(cin,desc);accounts[index]->deposit(date,amount,desc);break;case 'w': //取出现金cin>>index>>amount;getline(cin,desc);accounts[index]->withdraw(date,amount,desc);break;case 's': //查询各账户信息for(int i=0;i<n;i++){ cout<<"["<<i<<"]";accounts[i]->show();cout<<endl;}break;case 'c': //改变日期cin>>day;if(day<date.getday())cout<<"you cannot specify a previous day";else if(day>date.getmaxday())cout<<"invalid day";else date=Date(date.getyear(),date.getmonth(),day);break;case 'n': //进入下个月if(date.getmonth()==12)date=Date(date.getyear()+1,1,1);elsedate=Date(date.getyear(),date.getmonth()+1,1);for(int i=0;i<n;i++)accounts[i]->settle(date);break;}}while(cmd!='e');return 0;}#endif
#if 0 //1
#include"个人银行账户.h"#include<cmath>#include<iostream>using namespace std;double SavingsAccount::total=0;//SavingsAccount 类相关成员函数的实现SavingsAccount::SavingsAccount(int date,int id,double rate):id(id),balance(0),rate(rate),lastdate(date),accumulation(0){ cout<<date<<"\t#"<<id<<"is created"<<endl;}void SavingsAccount::record(int date,double amount){ accumulation=accumulate(date);lastdate=date;amount=floor(amount100+0.5)/100; //保留小数点后两位balance+=amount;total+=amount;cout<<date<<"\t#"<<id<<"\t"<<amount<<"\t"<<balance<<endl;}void SavingsAccount::deposit(int date,double amount){record(date,amount);}void SavingsAccount::withdraw(int date,double amount){ if(amount>getbalance()){cout<<"error:not endough money"<<endl;}elserecord(date,-amount);}void SavingsAccount::settle(int date){ double interest=accumulate(date)rate/365;if(interest!=0)record(date,interest);accumulation=0;}void SavingsAccount::show()const{ cout<<"#"<<id<<"\tbalance:"<<balance;}#endif#if 0 //2#include"个人银行账户.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(amount100+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");elserecord(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;}#endif#if 0 //3
#include"个人银行账户.h"#include<cmath>#include<iostream>using namespace std;double Account::total=0;//Account类的实现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(amount100+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)const{cout<<"error(#"<<id<<"):"<<msg<<endl;}//SavingsAccount类相关成员函数的实现SavingsAccount::SavingsAccount(const Date &date,const string &id,double rate):Account(date,id),rate(rate),acc(date,0){}void SavingsAccount::deposit(const Date &date,double amount,const string &desc){ record(date,amount,desc);acc.change(date,getbalance());}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::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 money");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();}#endif#if 0 //4
#include"个人银行账户.h"#include<cmath>#include<iostream>using namespace std;double Account::total=0;//Account类的实现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(amount100+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)const{cout<<"error(#"<<id<<"):"<<msg<<endl;}//SavingsAccount类相关成员函数的实现SavingsAccount::SavingsAccount(const Date &date,const string &id,double rate):Account(date,id),rate(rate),acc(date,0){}void SavingsAccount::deposit(const Date &date,double amount,const string &desc){ record(date,amount,desc);acc.change(date,getbalance());}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) //每年的1月计算一次利息{ if(date.getmonth()==1){ double interest=acc.getsum(date)rate/(date-Date(date.getyear()-1,1,1));if(interest!=0)record(date,interest,"interest");acc.reset(date,getbalance());}}//CreditAccount类相关成员函数的实现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 money");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();}#endif转载于:https://blog.51cto.com/13665347/2107009