综合实例_个人银行账户管理程序

更新时间:2023-05-27 15:53:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

//date.h
#ifndef __DATE_H__
#define __DATE_H__
class Date
{ //日期类
private:

int year; // 年
int month; //月
int day; //日
int totalDays; //该日期是从公元年1月1日开始的第几天

public:
Date(int year,int minth,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__


//date.cpp
#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=year*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;
else
return DAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1];
}

void Date::show() const
{
cout<<getYear()<<"-"<<getMonth()<<"-"<<getDay();
}


//accout.h
#ifndef __ACCOUNT_H__
#define __ACCOUNT_H__
#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;}
//存入现金,date为日期,amount为金额,desc为款项说明
virtual void deposit(const Date &date,double amount,const std::string &desc)=0;
//取出现金,date为日期,amount为金额,desc为款项说明
virtual void withdraw(const D
ate &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);
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); //取出现金
void settle(const Date &date); //结算利息,每年1月1日调用一次该函数
void show() const; //显示账户信息

};
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);
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); //取出现金
void settle(const Date &date); //结算利息,每年1月1日调用一次该函数
void show() const; //显示账户信息
};
#endif//__ACOUNT_H__



//account.cpp
#include "account.h"
#include <cmath>
#include <iostream>
using namespace std;

double Account::total=0;
//Accout类的实现
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;
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-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();
}



//8_8.cpp
#include "account.h"
#include <iostream>
using namespace std;
void main()
{
Date date(2008,11,1); //起始日期
//建立几个账户
SavingsAccount sa1(date,"03755217",0.015);
SavingsAccount sa2(date,"02342342",0.015);
CreditAccount ca(date,"C5392394",1000,0.0005,50);
Account*accounts[]={&sa1,&sa2,&ca};
const int n=sizeof(accounts)/sizeof(Account*);//账户总数

cout<<"(d)desposit (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);
else

date=Date(date.getYear(),date.getMonth()+1,1);

for(i=0;i<n;i++)
accounts[i]->settle(date);
break;
}

}
while (cmd!='e');
}

本文来源:https://www.bwwdw.com/article/irb4.html

Top