面向对象程序设计实例——模拟网上购书的结帐功能

来源:互联网 发布:苹果电脑软件推荐 编辑:程序博客网 时间:2024/05/18 02:26

    首先得对这个问题进行分析,我们知道在网上买书的流程为输入会员号,如果不是会员则跳过,然后选择所要购买的书籍放如购书筐中,选择结束后,用户要求结帐,系统则根据用户的身份计算出他所需要付的钱数,整个系统很复杂,所以我在这里要解决的只是最后一步,既系统根据用户的身份计算出他所需要付的钱款。

    因为有三种不同身份的人,但是他们又有共同之处,比如姓名,购书人编号,地址,购书金额,因此我们设计一个基类buyer类,其他的类layfolk(普通人),member(会员),honoured_guest(贵宾)均由它派生而出。基类中定义构造函数和对所有购书者相同的操作,函数getbuyername()用于得到购书者的姓名,getaddress()用于得到购书者的地址,getpay()用来取出购书者应付的金额,getid()用来取出购书者的编号。由于各类购书者的数据内容不同,显示方法也不一样,因此在基类中将setpay&display定义为虚函数。基类定义如下:

class buyer

{

protected:

         char* name;

         int buyerID;

         char* address;

         double pay;

public:

         buyer();

         buyer(char* n,int b,char* a,double p);

         ~buyer();

         char* getbuyname();

         int getid();

         char* getaddress();

         double getpay();

         virtual void display()=0;

         virtual void setpay(double=0)=0;

};

    买书的过程中我们还需要得到关于书的一些基本情况,故我们还需要定义一个book类用来完成对书的一些基本操作。类book定义如下:

class book

{

protected:

         char* bookID;

         char* bookname;

         char* auther;

         char* publishing;

         double price;

public:

         book();

         book(char* bid,char* bn,char* au,char* pu,double pr);

         ~book();

         void display();

         char* getbookID();

         char* getbookname();

         char* getauther();

         char* getpublish();

         double getprice();

};

    在主函数中,我们建立了三个派生类的实例来证实程序的正确性,并假设已经选好两本书籍(book类对象),并将购书人的基本情况和书本的基本情况都显示出来,虽然在实际买书的过程中购书人的基本情况是不需要显示的,但我们将它显示出来只是为了证明程序的正确性和结果的可读性。

完整的程序如下:

//buy.h

#include <iostream.h>

#include <string.h>

class buyer

{

protected:

         char* name;

         int buyerID;

         char* address;

         double pay;

public:

         buyer();

         buyer(char* n,int b,char* a,double p);

         ~buyer();

         char* getbuyname();

         int getid();

         char* getaddress();

         double getpay();

         virtual void display()=0;

         virtual void setpay(double=0)=0;

};

 

class member:public buyer

{

         int leaguer_grade;

public:

         member(char* n,int b,int l,char* a,double p):buyer(n,b,a,p)

         {leaguer_grade=l;}

         void display();

         void setpay(double p);

};

 

class honoured_guest:public buyer

{

         double discount_rate;

public:

         honoured_guest(char* n,int b,double r,char* a,double p):buyer(n,b,a,p)

         {discount_rate=r;}

         void display();

         void setpay(double p);

};

 

class layfolk:public buyer

{

public:

         layfolk(char* n,int b,char* a,double p):buyer(n,b,a,p)

         {}

         void display();

         void setpay(double p);

};

 

buyer::buyer()

{

         name=" ";

         buyerID=0;

         address=" ";

         pay=0;

}

buyer::buyer(char* n,int b,char* a,double p)

{

         name=new char[strlen(n)+1];

         strcpy(name,n);

         buyerID=b;

         address=new char[strlen(a)+1];

         strcpy(address,a);

         pay=p;

}

buyer::~buyer()

{

         delete [] name;

         delete [] address;

}

double buyer::getpay()

{

         return pay;

}

char* buyer::getaddress()

{

         return address;

}

char* buyer::getbuyname()

{

         return name;

}

int buyer::getid()

{

         return buyerID;

}

void member::display()

{

         cout<<"购书人姓名:"<<name<<"/t";

         cout<<"购书人编号:"<<buyerID<<"/t";

         cout<<"购书人地址:"<<address<<"/t";

         cout<<"购书人为会员,级别:"<<leaguer_grade<<endl;

}

void member::setpay(double p)

{

         if(leaguer_grade==1)

                  pay=0.95*p+pay;

         else if(leaguer_grade==2)

                  pay=0.9*p+pay;

         else if(leaguer_grade==3)

                  pay=0.85*p+pay;

         else if(leaguer_grade==4)

                  pay=0.8*p+pay;

         else if(leaguer_grade==5)

                  pay=0.7*p+pay;

         else

                   cout<<"级别错误!";

}

void honoured_guest::display()

{

         cout<<"购书人姓名:"<<name<<"/t";

         cout<<"购书人编号:"<<buyerID<<"/t";

         cout<<"购书人地址:"<<address<<"/t";

         cout<<"购书人为贵宾!折扣率为:"<<discount_rate<<endl;

}

void honoured_guest::setpay(double p)

{

         pay=pay+(1-discount_rate)*p;

}

 

void layfolk::display()

{

         cout<<"购书人姓名:"<<name<<"/t";

         cout<<"购书人编号:"<<buyerID<<"/t";

         cout<<"购书人地址:"<<address<<"/t";

         cout<<"购书人为普通人"<<endl;

}

void layfolk::setpay(double p)

{

         pay=pay+p;

}

//buy.h结束

//book.h

#include <iostream.h>

#include <string.h>

class book

{

protected:

         char* bookID;

         char* bookname;

         char* auther;

         char* publishing;

         double price;

public:

         book();

         book(char* bid,char* bn,char* au,char* pu,double pr);

         ~book();

         void display();

         char* getbookID();

         char* getbookname();

         char* getauther();

         char* getpublish();

         double getprice();

};

book::book()

{

         bookID=" ";

         bookname=" ";

         auther=" ";

         publishing=" ";

         price=0;

}

book::book(char* bid,char* bn,char* au,char* pu,double pr)

{

         bookID=new char[strlen(bid)+1];

         strcpy(bookID,bid);

         bookname=new char[strlen(bn)+1];

         strcpy(bookname,bn);

         auther=new char[strlen(au)+1];

         strcpy(auther,au);

         publishing=new char[strlen(pu)+1];

         strcpy(publishing,pu);

         price=pr;

}

char* book::getbookID()

{

         return bookID;

}

char* book::getbookname()

{

         return bookname;

}

char* book::getauther()

{

         return auther;

}

char* book::getpublish()

{

         return publishing;

}

double book::getprice()

{

         return price;

}

void book::display()

{

         cout<<"书号:"<<bookID<<endl;

         cout<<"书名:"<<bookname<<endl;

         cout<<"作者:"<<auther<<endl;

         cout<<"出版社:"<<publishing<<endl;

         cout<<"定价:"<<price<<endl;

}

book::~book()

{

         delete [] bookID;

         delete [] bookname;

         delete [] auther;

         delete [] publishing;

}

//book.h结束

//主函数buybook.cpp

#include <iostream.h>

#include "buy.h"

#include "book.h"

void main()

{

         int i=0,buyerid;

         book *c[2];

         layfolk b1("小王",1,"武汉",0);

         honoured_guest b2("小李",2,0.6,"郑州",0);

         member b3("小赵",3,5,"济南",0);

         buyer *b[3]={&b1,&b2,&b3};

         book c1("566-625-365","c++","richard","qinghua",25);

         book c2("655-365-654","c","zihan","beida",39);

         c[0]=&c1;

         c[1]=&c2;

         cout<<"购书人信息:/n/n";

         for(i=0;i<3;i++)

                  b[i]->display();

         cout<<"/n图书信息:/n/n";

         for(i=0;i<2;i++)

                  c[i]->display();

         cout<<"请输入购书人编号:";

         cin>>buyerid;

         for(i=0;i<3;i++)

                  if(b[i]->getid()==buyerid)

                   {

                            b[i]->setpay(c[0]->getprice());

                            b[i]->setpay(c[1]->getprice());

                            cout<<endl<<"购书人需要付费:"<<b[i]->getpay()<<endl;

                   }

                   else

                   {

                            cout<<"错误的编号!"<<endl;

                            break;

                   }

}