这是原代码
#include "account.h"
#include
using namespace std;
int main(){
cout<<" --------个人银行账户管理系统!------- "<
Date date(2011,6,1); //起始日期
//初始账户
SavingsAccount sa1(date,"S3755271",0.015,"123");
SavingsAccount sa2(date,"02342342",0.015,"456");
CreditAccount ca(date,"C5392394",10000,0.0005,50,"789");
Account *accounts[]={&sa1,&sa2,&ca};
const int n=sizeof(accounts)/sizeof(Account*);
cout
cout
cout
cout
cout
cout
char cmd;
do{ //显示日期和总金额
cout
date.show();
cout
cout
cout
int index,day,i;
double amount;
string desc,pwd,pass;
cin>>cmd;
switch(cmd){
case'd': //存入现金
cout<<"请选择您的账户序号(0/1/2):";
cin>>index;
if(index==0||index==1||index==2){
cout<<"请输入您的存款金额:";
cin>>amount;
accounts[index]->deposit(date,amount,desc);
}
else
cout<<"账户号错误!";
break;
case'w': //取出现金
cout<<"请选择您的账户序号(0/1/2):";
cin>>index;
cout<<"请输入您的密码:";
cin>>pwd;
pass=accounts[index]->getPassword();
if(pass.compare(pwd)==0){
cout<<"密码正确!"<
cin>>amount; accounts[index]->withdraw(date,amount,desc);
} else
cout<<"您输入的密码错误!"<<endl;
break;
case's': //查询各账户信息
for( i=0;i
cout
accounts[i]->show();
cout<
}
break;
case'c': //改变日期
cout
cin>>day;
cout<
if(day
cout
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);
else
date=Date(date.getYear(),date.getMonth()+1,1);
for(int k=0;k
accounts[k]->settle(date);
break;
}
}while(cmd!='e');
return 0;
} 333333333333333
#include "account.h"
#include
#include
using namespace std;
double Account::total=0;
//Account类的实现
Account::Account(const Date &date,const string &id,const string &pwd):id(id),balance(0),password(pwd){
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)const{
cout<<"Error(#"<<id<<"):"<<msg<<endl;
}
//SavingsAccount类相关成员函数的实现
SavingsAccount::SavingsAccount(const Date &date,const std::string &id,double rate,const std::string &password)
:Account(date,id,password),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){
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,const std::string &password)
:Account(date,id,password),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,getBalance());
}
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:"<
}
#include "date.h"
#include
#include
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<
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++;
} //DATE::DATE
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<
}
#ifndef _ACCOUNT_H_
#define _ACCOUNT_H_
#include "date.h"
#include "accumulator.h"
#include
using namespace std;
class Account //账户类
{
private:
std::string id; //账号 std::string password;
double balance; //余额
static double total; //所有账户的总金额
protected:
//供派生类调用的构造函数,id为账户
Account(const Date &date,const std::string &id,const std::string &pwd);
//记录一笔账,data为日期,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;}
const std::string getPassword() {return password;}
double getBalance() const {return balance;}
static double getTotal(){return total;}
//存入现金,date为日期,amount为金额,desc为款项说明
virtual void deposit(const Date &date,double amount,const std::string &desc)=0;
//取出现金,date为日期,amount为金额,desc为款项说明
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{
private:
Accumulator acc;
double rate;
public:
//构造函数
SavingsAccount(const Date &date,const std::string &id,double rate,const std::string &passwod);
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);
//结算利息,每年1月1日调用一次该函数
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,const std::string &passwod);
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 std::string &desc);
void withdraw(const Date &date,double amount,const std::string &desc);
//结算利息和年费,每月1日调用一次该函数
void settle(const Date &date);
void show() const;
};
#endif//_ACCOUNT_H_
#ifndef ACCUMULATOR_H
#define ACCUMULATOR_H
#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将数值变更为value
void change(const Date &date,double value){
sum=getSum(date);
lastDate=date;this->value=value;
}
//初始化,将日期变为date,数值变为value,累加器清零
void reset(const Date &date,double value){
lastDate=date;this->value=value;sum=0;
}
};
#endif
#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 operator-(const Date &date) const{ //计算两个日期之间差多少天
return totalDays-date.totalDays;
}
};
#endif //_Date_H_