return0;
}
程序运行结果
实训小结:
构造函数与析构函数的调用方式与执行顺序是:
先是构造函数然后是析构函数。
调用方式是自动调用,执行顺序是先执行构造函数,待程序完毕时再执行析构函数。
实训二:
个人银行账户管理程序的类设计
实训目的:
掌握面向对象中类、继承、多态性的开发思想;掌握流的概念;独立设计个人银行账户管理程序。
实训内容:
1、个人银行账户管理程序的类关系图
2、个人银行账户管理程序的个人账户设置和应用
3、个人银行账户管理程序
实训代码:
1、个人银行账户管理程序的类设计
classaccount{
private:
std:
:
stringid;
doublebalance;
staticdoubletotal;
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;}
voidshow()const;};
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();
Elsereturncredit;}
voiddeposit(constDate&date,doubleamount,conststd:
:
string&desc);
voidwithdraw(constDate&date,doubleamount,conststd:
:
string&desc);
voidsettle(constDate&date);
voidshow()const;};
classaccumulator{
private:
Datelastdate;doublevalue;doublesum;
public:
accumulator(constDate&date,doublevalue)
:
lastdate(date),value(value),sum(0){}
doublegetsum(constDate&date)const{
returnsum+value*date.distance(lastdate);}
voidchange(constDate&date,doublevalue){
sum=getsum(date);
lastdate=date;this->value=value;}
voidreset(constDate&date,doublevalue){
lastdate=date;this->value=value;sum=0;}};
classDate{
private:
intyear;intmonth;intday;inttotaldays;
public:
Date(intyear,intmonth,intday);
intgetyear()const
{returnyear;}
doublegetmonth()const
{returnmonth;}
intgetday()const
{returnday;}
intgetmaxday()const;
boolisleapyear()const{
returnyear%4==0&&year%100!
=0||year%400==0;}
voidshow()const;
intdistance(constDate&date)const{
returntotaldays-date.totaldays;}};
2、个人银行账户管理程序的类关系图
3、个人银行账户管理程序的个人账户设置和应用
SavingsAccountwutingming(date,"090102060101",0.015);
creditaccountwutingmin(date,"090102060101",2000,0.0005,50);
wutingming.deposit(Date(2008,11,5),1000,"buybook");
wutingmin.withdraw(Date(2008,11,5),2000,"buyMP3");
wutingming.settle(Date(2008,12,5));
wutingmin.settle(Date(2008,12,5));
wutingming.show();cout<wutingmin.show();cout<4、个人银行账户管理程序的重点代码
#include"account.h"
#include
usingnamespacestd;
intmain(){
Datedate(2008,11,1);
SavingsAccountsa1(date,"03755217",0.015);
SavingsAccountsa2(date,"02342342",0.015);
SavingsAccountwutingming(date,"090102060101",0.015);
creditaccountca(date,"C5392394",10000,0.0005,50);
creditaccountwutingmin(date,"090102060101",2000,0.0005,50);
sa1.deposit(Date(2008,11,5),5000,"salary");
sa2.deposit(Date(2008,11,25),10000,"sellstock0323");
wutingming.deposit(Date(2008,11,5),1000,"buybook");
wutingmin.withdraw(Date(2008,11,5),2000,"buyMP3");
ca.withdraw(Date(2008,11,15),2000,"buyacell");
ca.settle(Date(2008,12,1));
ca.deposit(Date(2008,12,1),2016,"repaythecredit");
sa1.deposit(Date(2008,12,5),5500,"salary");
sa1.settle(Date(2009,1,1));
sa2.settle(Date(2009,1,1));
wutingming.settle(Date(2008,12,5));
wutingmin.settle(Date(2008,12,5));
ca.settle(Date(2008,12,1));
cout<sa1.show();cout<sa2.show();cout<wutingming.show();cout<wutingmin.show();cout<ca.show();cout<cout<<"total:
"<:
gettotal()<return0;}
#include"account.h"
#include
usingnamespacestd;
intmain(){
Datedate(2008,11,1);
SavingsAccountsa1(date,"s3755217",0.015);
SavingsAccountsa2(date,"02342342",0.015);
SavingsAccountwutingming(date,"090102060101",0.015);
creditaccountca(date,"C5392394",10000,0.0005,50);
account*accounts[]={&sa1,&sa2,&wutingming,&ca};
constintn=sizeof(accounts)/sizeof(account*);
cout<<"(d)deposit(w)withdraw(s)show(c)changday(n)nextmonth(e)exit"<charcmd;
do{date.show();
cout<<"\ttotal:
"<:
gettotal()<cout<<"mand>";
intindex,day,i;
doubleamount;
stringdesc;
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(i=0;icout<<"["<
accounts[i]->show();
cout<case'c':
cin>>day;
if(daycout<<"youcannotspecifyapreviousday";
elseif(day>date.getmaxday())
cout<<"invalidday";
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;iaccounts[i]->settle(date);break;}
}while(cmd!
='e');
return0;
}
程序运行结果
实训小结:
通过本实训,应用虚函数和抽象类对程序进展改良:
1〕将show函数声明为虚函数,因此通过指向creditaccount类实例的account类型的指针来调用show函数时,被实际调用的将是creditaccount类定义的show函数。
这样,如果创建一个account指针类型的数组,使各个元素分别指向各个账户对象,就可以通过一个循环来调用它们的show函数。
2〕在account类中添加deposit,withdraw,settle这3个函数的声明,且将它们都声明为纯虚函数,这使得通过基类指针可以调用派生类的相应函数,而且无须给出它们在基类中的实现。
经过这一改动之后,account类就变成了抽象类。
实训三、图书信息管理系统主界面
实训目的:
能够较好的完成程序的主体设计,界面友好,功能齐全;程序思路清晰易懂,能够充分利用所学工具实现各项操作。
独立力完成实训报告,内容充实、观点明确、新颖。
实训内容:
图书信息管理系统,使之能提供以下功能:
1、 系统以菜单方式工作。
2、 借书
3、 还书
4、 图书维护
5、 读者维护
6、 退出:
包括返回主界面和退出系统等功能。
实训代码:
#include
#include
#include
#include
structbooks_list
{
charauthor[20];/*作者名*/
charbookname[20];/*书名*/
charpublisher[20];/*出版单位*/
charpbtime[15];/*出版时间*/
charloginnum[10];/*登陆号*/
floatprice;/*价格*/
charclassfy[10];/*分类号*/
structbooks_list*next;/*链表的指针域*/
};
structbooks_list*Create_Books_Doc();/*新建链表*/
voidInsertDoc(structbooks_list*head);/*插入*/
voidDeleteDoc(structbooks_list*head,intnum);/*删除*/
voidPrint_Book_Doc(structbooks_list*head);/*浏览*/
voidsearch_book(structbooks_list*head);/*查询*/
voidinfo_change(structbooks_list*head);/*修改*/
voidsave(structbooks_list*head);/*保存数据至文件*/
/*新建链表头节点*/
structbooks_list*Create_Books_Doc()
{
structbooks_list*head;
head=(structbooks_list*)malloc(sizeof(structbooks_list));/*分配头节点空间*/
head->next=NULL;/*头节点指针域初始化,定为空*/
returnhead;
}
/*保存数据至文件*/
voidsave(structbooks_list*head)
{
structbooks_list*p;
FILE*fp;
p=head;
fp=fopen("data.txt","w+");/*以写方式新建并打开data.txt文件*/
fprintf(fp,"┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━┳━━━━┓\n");/*向文件输出表格*/
fprintf(fp,"┃登录号┃书名┃作者┃出版单位┃出版时间┃分类号┃价格┃\n");
fprintf(fp,"┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━╋━━━━┫\n");
/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/
while(p->next!
=NULL)
{
p=p->next;
fprintf(fp,"┃┃┃┃┃┃┃%.2f┃\n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price);
}
fprintf(fp,"┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━┻━━━━┛\n");
fclose(fp);
printf("已将图书数据保存到data.txt文件\n");
}
/*插入*/
voidInsertDoc(structbooks_list*head)
{
/*定义结构体指针变量s指向开辟的新结点首地址p为中间变量*/
structbooks_list*s,*p;
charflag='Y';/*定义flag,方便用户选择重复输入*/
p=head;
/*遍历到尾结点,p指向尾结点*/
while(p->next!
=