C++实验设计二模拟网上购书的结账功能.docx
《C++实验设计二模拟网上购书的结账功能.docx》由会员分享,可在线阅读,更多相关《C++实验设计二模拟网上购书的结账功能.docx(12页珍藏版)》请在冰豆网上搜索。
![C++实验设计二模拟网上购书的结账功能.docx](https://file1.bdocx.com/fileroot1/2023-4/17/972743d3-dd94-41bd-9e08-c455c5aee9b2/972743d3-dd94-41bd-9e08-c455c5aee9b21.gif)
C++实验设计二模拟网上购书的结账功能
北京信息科技大学
实验设计报告
课程名称面向对象程序设计实验设计
题目模拟网上购书的结帐功能
指导教师李春强
设计起止日期
设计地点
系别信息管理学院
专业____信息安全____
学生姓名____郭瑞________
班级/学号__信安0901/25_
成绩___________________
1.课程设计目的:
通过本实验使学生利用面向对象程序设计软件开发方法,即软件开发过程划分为明显的几个阶段:
问题分析和功能定义、对象设计及实现、核心控制设计、编码与测试、进化等实现模拟网上购书的结帐功能方面的应用。
2.课程设计内容:
用户在网上购书以后,系统根据购书人的不同类型计算出购书人的费用。
网上购书的一般过程:
用户首先输入会员号,然后,选择想要买的书籍放到购书筐中,选择结束后,用户要求系统结帐,系统便计算出费用通知用户。
注:
本例并不模拟网上购书的全部过程,所以把选择书的过程略去,假设用户已经选定了两本书。
3.课程设计要求:
(1)根据实际情况,确定购书人分为3类:
普通人、会员、贵宾。
①“普通人”的购书费用按照原价收取;
②“会员”购书费的计算方法是:
五星级会员按照原价的70%收取,四星级会员按照原价的80%收取,三星级会员按照原价的85%收取,二星级会员按照原价的90%收取,一星级会员按照原价的95%收取。
③“贵宾”的购书费根据特别指定的折扣率计算机收取的费用,例如折扣率40%,则按照实际书费的60%收取。
(2)对象(类)的设计
①根据
(1)分析,需要设计一个基类buyer和它的3各派生类member(会员)、layfolk(普通人)、honoured_guest(贵宾)。
基类中包括的数据成员是姓名、购书人编号、地址、购书金额。
member类中除了继承了buyer的数据,还增加了会员级别:
honoured_guest则增加了折扣率一项。
②在基类中定义了构造函数和对所有类型的购书人相同的操作,getbuyname()负责取出购书者的姓名;getaddress()负责取出购书者的地址;getpay()负责取出购书者应付出的金额;getid()负责取出购书者的编号。
由于对不同购书者的购书额的计算方法不同,所以不能在基类中确定计算方法;又由于各类购书者的数据内容不同,显示的方法也不一样.因此在基类中将setpay和display定义为虚函数。
4.实验条件:
(1)主要设备:
586或更高机型,256MB或更高的内存,40G或更大的硬盘。
(2)主要软件:
①操作系统可为Windows9X、WinMe、Win2000或更高版本等;
②开发环境为VC++或者TC++。
(3)参考书目:
①《C++面向对象程序设计》第10章面向对象设计方法与实例陈维兴等编着中国铁道出版社2004年6月第1版
②《C++面向对象程序设计》陈维兴等编着清华大学出版社2004年6月第1版
5.实验方法与步骤:
1首先确定基类成员函数,需要定义两个虚函数setpay和display作为重载。
2定义其派生类,member,layfolk,honoured_guest,完成初始化构造。
并且分别定义其私有成员计算对应的会员等级或3者折扣率,然后重新定义虚函数setpay和display
4定义book类返回书的编号和价格。
5定义主函数,通过基类指针调用派生类或者自身类对象成员函数的方式实现功能。
具体实现代码如下:
#include"iostream"
#include"string"
usingnamespacestd;
classbuyer//基类
{
protected:
stringname;//姓名
intbuyerid;//购书人编号
stringaddress;//地址
doublepay;//购书金额
public:
buyer();
buyer(stringn,intb,stringa,doublep);
stringgetbuyname();//取姓名
stringgetaddress();//取地址
doublegetpay();//取应付金额
intgetid();//取购书人编号
virtualvoiddisplay()=0;//显示对象
virtualvoidsetpay(double=0)=0;//计算购书金额
};
classmember:
publicbuyer//会员类
{
intgrade;//会员级别
public:
member(stringn,intb,intt,stringa,doublep):
buyer(n,b,a,p)
{grade=t;}//构造函数
voiddisplay();//显示对象
voidsetpay(doublep);//计算购书金额
};
classguest:
publicbuyer//贵宾类
{
doublediscount_rate;//贵宾折扣率
public:
guest(stringn,intb,doubler,stringa,doublep):
buyer(n,b,a,p)
{discount_rate=r;}//构造函数
voiddisplay();//显示对象
voidsetpay(doublep);//计算购书金额
};
classlayfolk:
publicbuyer//普通人员类
{
public:
layfolk(stringn,intb,stringa,doublep):
buyer(n,b,a,p)
{}//构造函数
voiddisplay();//显示对象
voidsetpay(doublep);//计算购书金额
};
//基类数据初始化
buyer:
:
buyer()//基类的构造函数
{
name="";
buyerid=0;
address="";
pay=0;
}
buyer:
:
buyer(stringn,intb,stringa,doublep)//基类的构造函数
{
name=n;
buyerid=b;
address=a;
pay=p;
}
doublebuyer:
:
getpay()//去购书人金额
{returnpay;}
stringbuyer:
:
getaddress()//去购书人地址
{returnaddress;}
stringbuyer:
:
getbuyname()//去购书人姓名
{returnname;}
intbuyer:
:
getid()//去购书人编号
{returnbuyerid;}
//member类数据初始化,成员函数的定义
voidmember:
:
display()//会员类的显示函数
{
cout<<"购书人姓名:
"<cout<<"购书人编号:
"<cout<<"购书人为会员,级别:
"<cout<<"地址:
"<
}
voidmember:
:
setpay(doublep)//会员类的计算购书金额
{
if(grade==1)//会员级别为1
pay=*p+pay;
elseif(grade==2)//会员级别为2
pay=*p+pay;
elseif(grade==3)//会员级别为3
pay=*p+pay;
elseif(grade==4)//会员级别为4
pay=*p+pay;
elseif(grade==5)//会员级别为5
pay=*p+pay;
else
cout<<"级别错误!
";
}
voidguest:
:
display()//贵宾类的显示函数
{
cout<<"购书人姓名:
"<cout<<"购书人编号:
"<cout<<"购书人为贵宾,折扣率为:
"<cout<<"地址:
"<
}
voidguest:
:
setpay(doublep)//贵宾类的计算购书金额
{
pay=pay+(1-discount_rate)*p;
}
voidlayfolk:
:
display()//普通类的显示函数
{
cout<<"购书人姓名"<cout<<"购书人编号:
"<cout<<"购书人为普通人"<<"\n";
cout<<"地址:
"<
}
voidlayfolk:
:
setpay(doublep)//普通类的计算购书金额
{pay=pay+p;}
classbook//图书类
{
protected:
stringbook_id;//书号
stringbook_name;//书名
stringauther;//作者
stringpublishing;//出版社
doubleprice;//定价
public:
book();//构造函数
book(stringb_id,stringb_n,stringau,stringpu,doublepr);
/*重载构造函数*/
voiddisplay();
stringgetbook_id();//取书号
stringgetbook_name();//取书名
stringgetauther();//取作者
stringgetpublishing();//取出版社
doublegetprice();//取定价
};
book:
:
book(stringb_id,stringb_n,stringau,stringpu,doublepr)
{
book_id=b_id;
book_name=b_n;
auther=au;
publishing=pu;
price=pr;
}
book:
:
book()
{
book_id="";
book_name="";
auther="";
publishing="";
price=0;
}
voidbook:
:
display()
{
cout<<"书号:
"<cout<<"书名:
"<cout<<"作者:
"<cout<<"出版社:
"<cout<<"定价:
"<}
stringbook:
:
getbook_id()//取书号
{returnbook_id;}
stringbook:
:
getbook_name()//取书名
{returnbook_name;}
stringbook:
:
getauther()//取作者
{returnauther;}
stringbook:
:
getpublishing()//取出版社
{returnpublishing;}
doublebook:
:
getprice()//取定价
{returnprice;}
/*intmenu()
{
intflag;
cout<<"是否继续:
继续为1,不继续为0"<cin>>flag;
returnflag;
}*/
voidmain()
{
inti=0,buyerid,flag;
book*c[2];//基类指针指向派生类对象!
layfolkb1("郭瑞",1,"安徽",8);
guestb2("丁珊珊",2,,"上海",0);
memberb3("张国荣",3,5,"香港",0);
buyer*b[3]={&b1,&b2,&b3};//!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
/*用指针数组存放了buyer类的3个对象的地址*/
bookc1("7-302-04504-6","程序设计","留在得","清华",25);
bookc2("7-402-03889-6","数据结构","华英美","北大",21);
c[0]=&c1;
c[1]=&c2;
cout<<"购书人信息"<for(i=0;i<3;i++)//显示3个继承了buyer类的对象
b[i]->display();//虚函数的重载!
cout<<"图书信息"<for(i=0;i<2;i++)//显示book对象的信息
c[i]->display();
logo:
cout<<"请输入购书人的编号:
"<cin>>buyerid;
flag=0;
for(i=0;i<3;i++)
if(b[i]->getid()==buyerid)
{flag=1;break;}
if(!
flag)
cout<<"编号不存在"<else
{
b[i]->setpay(c[0]->getprice());//计算购书金额
b[i]->setpay(c[1]->getprice());
cout<"<getpay()<}
gotologo;
}
6.实验总结:
通过此次试验,对于虚函数的应用进一步熟悉,特别是基类指针对于虚函数的调用,同时对于派生类的构造,继承等等知识点进一步巩固,对C++继承的理念的应用更具体的熟悉。
附录:
说明:
1.实验过程由学生记录实验的过程,包括画出流程图、操作过程、遇到哪些问题以及如何解决等;
2.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
3.源程序(带注释)、代码、具体语句等,若表格空间不足时可作为附录另外附页。
4.程序测试后,将多组测试结果附在程序后;
5.提交报告时请将说明部分去掉。