QianB哈哈哈 2018-05-28 13:33 采纳率: 100%
浏览 887
已结题

c++改进程序:添加借贷和活期与定期存款业务;能够查询某账号下的总资产和明细记录

这是原代码
#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_

  • 写回答

1条回答 默认 最新

  • devmiao 2018-05-28 16:28
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名