C++实验报告12.docx
《C++实验报告12.docx》由会员分享,可在线阅读,更多相关《C++实验报告12.docx(13页珍藏版)》请在冰豆网上搜索。
C++实验报告12
课程名称:
C++语言程序设计
专业:
网络工程
指导教师:
肖巍
一、实验项目:
个人银行账户管理(C++课程设计)
二、实验目的:
这次课程设计的目的是总结及运用一学期来所学的知识,训练我们灵活应用所学C++知识,独立完成问题分析、总结设计、详细设计和编程实现等软件开发全过程的综合实践能力。
巩固、深化理论知识,提高编程水平,并在此过程中培养我们严谨的科学态度和良好的工作作风。
1、熟悉C++工程开发的过程、头文件和源文件之间的关系;
2、掌握类、继承及派生、虚函数、多态性在C++面向对象程序设计中的体现;
3、掌握一个类的对象作为另外一个类的成员的实现方法。
4、掌握子类对象与父类对象的关系。
5、熟悉C++中流的使用;
6、养成良好的编程习惯。
三、需求与功能分析:
随着社会的发展,信息化程度的不断深入,银行的传统业务已经不能满足我们的需要。
银行每天都要处理大量的存取款事件,做好存取款是银行工作重要的环节,但是要有效处理必须要有良好的程序还有数据管理系统来建立一个良好的软件系统来实现快速、有效、准确、安全的处理银行事物。
主要用于银行的储蓄卡管理系统,可以有效、准确的帮助我们高效实现完成存取事件。
自动取款机是我们学生经常用的,我们应该很熟悉,,就是用的账户管理系统。
四、实验环境:
计算机操作系统:
WindowsXP
软件:
MicrosoftVisualC++6.0
五、实验要求:
在掌握C++面向对象程序设计方法的基础上,使用VC++6.0结合课本内容完成以下内容的实现:
1、完成个人银行账户管理程序的编写、编译、调试、运行;
2、完成基类Account、子类SavingsAccount及CreditAccount的声明及定义。
3、实现Accumulator类及Date类。
4、利用C++中流的概念实现账户信息的存储。
5、在主函数中实现账户对象创建时从键盘输入构造函数需要的信息。
6、在输出及需要用户输入的时候要给出相应的提示信息。
六、程序代码:
#ifndef__DATE_H__
#define__DATE_H__
classDate{
private:
intyear;
intmonth;
intday;
inttotalDays;
public:
Date(intyear=1,intmonth=1,intday=1);
staticDateread();
intgetYear()const{returnyear;}
intgetMonth()const{returnmonth;}
intgetDay()const{returnday;}
intgetMaxDay()const;
boolisLeapYear()const{
returnyear%4==0&&year%100!
=0||year%400==0;
}
voidshow()const;
intoperator-(constDate&date)const{
returntotalDays-date.totalDays;
}
booloperator<(constDate&date)const{
returntotalDays}
};
#endif
#include"date.h"
#include
#include
usingnamespacestd;
namespace{
constintDAYS_BEFORE_MONTH[]={0,31,59,120,151,181,212,243,273,304,334,365};
}
Date:
:
Date(intyear,intmonth,intday):
year(year),month(month),day(day){
if(day<=0||day>getMaxDay()){
cout<<"Invaliddate:
";
show();
cout<exit
(1);
}
intyears=year-1;
totalDays=years*365+years/4-years/100+years/400+DAYS_BEFORE_MONTH[month-1]+day;
if(isLeapYear()&&month>2)totalDays++;
}
intDate:
:
getMaxDay()const{
if(isLeapYear()&&month==2)
return29;
else
returnDAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1];
}
voidDate:
:
show()const{
cout<DateDate:
:
read(){
intyear,month,day;
charc1,c2;
cin>>year>>c1>>month>>c2>>day;
returnDate(year,month,day);}
#ifndef__ACCUMULATOR_H__
#define__ACCUMULATOR_H__
#include"date.h"
classAccumulator{
private:
DatelastDate;
doublevalue;
doublesum;
public:
doublegetSum(constDate&date)const{
returnsum+value*(date-lastDate);
}
Accumulator(constDate&date,doublevalue):
lastDate(date),value(value),sum(0){}
voidchange(constDate&date,doublevalue){
sum=getSum(date);
lastDate=date;
this->value=value;
}
voidreset(constDate&date,doublevalue){
lastDate=date;
this->value=value;
sum=0;}
};
#endif
#ifndef__ACCOUNT_H__
#define__ACCOUNT_H__
#include"date.h"
#include"accumulator.h"
#include
#include
classAccount;
classAccountRecord{
private:
Datedate;
constAccount*account;
doubleamount;
doublebalance;
std:
:
stringdesc;
public:
AccountRecord(constDate&date,constAccount*account,doubleamount,doublebalance,conststd:
:
string&desc);
voidshow()const;
};
typedefstd:
:
multimapRecordMap;
classAccount{
private:
std:
:
stringid;
doublebalance;
staticdoubletotal;
staticRecordMaprecordMap;
protected:
Account(constDate&date,conststd:
:
string&id);
voidrecord(constDate&date,doubleamount,conststd:
:
string&desc);
voiderror(conststd:
:
string&msg)const;
public:
conststd:
:
string&getId()const{returnid;}
doublegetBalance()const{returnbalance;}
staticdoublegetTotal(){returntotal;}
virtualvoiddeposit(constDate&date,doubleamount,conststd:
:
string&desc)=0;
virtualvoidwithdraw(constDate&date,doubleamount,conststd:
:
string&desc)=0;
virtualvoidsettle(constDate&date)=0;
virtualvoidshow()const;
staticvoidquery(constDate&begin,constDate&end);
};
//savingAccount和creditAccount类
classSavingsAccount:
publicAccount{
private:
Accumulatoracc;
doublerate;
public:
//构造函数
SavingsAccount(constDate&date,conststd:
:
string&id,doublerate);
doublegetRate()const{returnrate;}
//存入现金
voiddeposit(constDate&date,doubleamount,conststd:
:
string&desc);
voidwithdraw(constDate&date,doubleamount,conststd:
:
string&desc);
voidsettle(constDate&date);
};
classCreditAccount:
publicAccount{
private:
Accumulatoracc;
doublecredit;
doublerate;
doublefee;
doublegetDebt()const{
doublebalance=getBalance();
return(balance<0?
balance:
0);
}
public:
//构造函数
CreditAccount(constDate&date,conststd:
:
string&id,doublecredit,doublerate,doublefee);
doublegetCredit()const{returncredit;}
doublegetRate()const{returnrate;}
doublegetFee()const{returnfee;}
doublegetAvailableCredit()const{
if(getBalance()<0)
returncredit+getBalance();
else
returncredit;
}
//存入现金
voiddeposit(constDate&date,doubleamount,conststd:
:
string&desc);
//取出现金
voidwithdraw(constDate&date,doubleamount,conststd:
:
string&desc);
voidshow()const;
voidsettle(constDate&date);
};
#endif
#include"account.h"
#include
#include
#include
usingnamespacestd;
usingnamespacestd:
:
rel_ops;
AccountRecord:
:
AccountRecord(constDate&date,constAccount*account,doubleamount,doublebalance,conststd:
:
string&desc)
:
date(date),account(account),amount(amount),balance(balance),desc(desc){}
voidAccountRecord:
:
show()const{
date.show();
cout<<"\t#"<getId()<<"\t"<}
doubleAccount:
:
total=0;
RecordMapAccount:
:
recordMap;
voidAccount:
:
query(constDate&begin,constDate&end){
if(begin<=end){
RecordMap:
:
iteratoriter1=recordMap.lower_bound(begin);
RecordMap:
:
iteratoriter2=recordMap.upper_bound(end);
for(RecordMap:
:
iteratoriter=iter1;iter!
=iter2;++iter)
iter->second.show();
}
}
Account:
:
Account(constDate&date,conststring&id):
id(id),balance(0){
date.show();cout<<"\t#"<}
voidAccount:
:
record(constDate&date,doubleamount,conststring&desc){
amount=floor(amount*100+0.5)/100;
balance+=amount;total+=amount;
date.show();
cout<<"\t#"<}
voidAccount:
:
show()const{cout<"<voidAccount:
:
error(conststring&msg)const{
cout<<"Error(#"<"<}
//SAVingAccount类的相关成员函数的实现
SavingsAccount:
:
SavingsAccount(constDate&date,conststring&id,doublerate):
Account(date,id),rate(rate),acc(date,0){}
voidSavingsAccount:
:
deposit(constDate&date,doubleamount,conststring&desc){
record(date,amount,desc);
acc.change(date,getBalance());
}
voidSavingsAccount:
:
withdraw(constDate&date,doubleamount,conststring&desc){
if(amount>getBalance()){
error("notenoughmoney");
}else{
record(date,-amount,desc);
acc.change(date,getBalance());
}
}
voidSavingsAccount:
:
settle(constDate&date){
if(date.getMonth()==1){
doubleinterest=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(constDate&date,conststring&id,doublecredit,doublerate,doublefee):
Account(date,id),credit(credit),rate(rate),fee(fee),acc(date,0){}
voidCreditAccount:
:
deposit(constDate&date,doubleamount,conststring&desc){
record(date,amount,desc);
acc.change(date,getDebt());
}
voidCreditAccount:
:
withdraw(constDate&date,doubleamount,conststring&desc){
if(amount-getBalance()>credit){
error("notenoughcredit");
}else{
record(date,-amount,desc);
acc.change(date,getDebt());
}
}
voidCreditAccount:
:
settle(constDate&date){
doubleinterest=acc.getSum(date)*rate;
if(interest!
=0)record(date,interest,"interest");
if(date.getMonth()==1)
record(date,-fee,"annualfee");
acc.reset(date,getDebt());
}
voidCreditAccount:
:
show()const{
Account:
:
show();
cout<<"\tAvailablecredit:
"<}
#include"account.h"
#include
#include
#include
usingnamespacestd;
structdeleter{
templatevoidoperator()(T*p){deletep;}
};
intmain(){
Datedate(2008,11,1);
vectoraccounts;
cout<<"(a)addaccount(d)deposit(w)withdraw(s)show(c)changeday(n)nextmonth(q)query(e)exit"<charcmd;
inti;
vector:
:
iteratoriter;
do{
date.show();
cout<<"\tTotal:
"<:
getTotal()<<"\tcommand>";
chartype;
intindex,day;
doubleamount,credit,rate,fee;
stringid,desc;
Account*account;
Datedate1,date2;
cin>>cmd;
switch(cmd){
case'a':
cin>>type>>id;
if(type=='s'){
cin>>rate;
account=newSavingsAccount(date,id,rate);
}else{
cin>>credit>>rate>>fee;
account=newCreditAccount(date,id,credit,rate,fee);
}
accounts.push_back(account);
break;
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(i=0;icout<<"["<
accounts[i]->show();
cout<}
break;
case'c':
cin>>day;
if(daycout<<"Youconnotspecifyapreviousday";
elseif(day>date.getMaxDay())
cout<<"Invalidday";
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(it