综合实例个人银行账户管理程序(共15页).docx
精选优质文档-倾情为你奉上_综合实例_个人银行账户管理程序 /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_MONTHmonth-1+day;if(isLeapYear()&&month>2)totalDays+;int Date:getMaxDay() constif (isLeapYear()&&month=2)return 29;elsereturn DAYS_BEFORE_MONTHmonth-DAYS_BEFORE_MONTHmonth-1;void Date:show() constcout<<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() constreturn 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 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);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() constreturn credit;double getRate() constreturn rate;double getFee() constreturn 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); /取出现金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() constcout<<id<<"tBalance:"<<balance;void Account:error(const string &msg)constcout<<"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() constAccount: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,"",0.015);SavingsAccount sa2(date,"",0.015);CreditAccount ca(date,"C",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;dodate.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);accountsindex->deposit (date,amount,desc);break;case 'w':/取出现金cin>>index>>amount;getline(cin,desc);accountsindex->withdraw (date,amount,desc);break;case 's':/查询各账户信息for (int i=0; i<n; i+)cout<<""<<i<<""accountsi->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"elsedate=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(i=0;i<n;i+)accountsi->settle(date);break;while (cmd!='e');专心-专注-专业