#include<bits/stdc++.h>
using namespace std;
double totalMoney=0; //记录销售总额
double profit=0;
class Bread
{
public:
Bread(); //无参构造函数
Bread(int num,string name,double price); //有参构造函数
int GetBreadNumber(){return breadNumber;} //得到面包编号
string GetBreadName(){return breadName;} //得到面包名称
double GetPrice(){return costPrice;} //得到面包制作成本
virtual void DispBread();
protected:
int breadNumber; //定义面包编号
string breadName; //定义面包名称
double costPrice; //定义面包制作成本
};
Bread::Bread() //无参构造函数 定义初始值
{
breadNumber=0;
breadName=" ";
costPrice=0;
}
Bread::Bread(int num,string name,double price) //有参构造函数
{
breadNumber=num; //接受数值,赋给bNum
breadName=name; //接收字符串,赋给bNam
costPrice=price; //接收数值,赋给cP
}
void Bread::DispBread() //定义无返回值的成员函数,进行信息输出
{
cout<<"面包编号:"<<breadNumber<<endl<<"名称:"<<breadName;
} //虚函数 显示面包信息
class DiscountBread:public Bread //特价面包 由基类Bread类派生而来
{
private:
double originalPrice; //定义原始价
double discountPrice; //定义折扣价
public:
DiscountBread(); //无参构
DiscountBread(int num,string name,double price,double oldPrice,double discPrice); //有参构 比基类多了 老价和折扣价
void DispBread(); //显示特价面包信息
double GetDiscountPrice() {return discountPrice;}//得到特价信息
double GetOriginalPrice(){return originalPrice;}//得到正价信息
};
DiscountBread::DiscountBread():Bread() //无参构 定义初始值
{
originalPrice=0; //面包原价
discountPrice=0; //面包折扣价
}
DiscountBread::DiscountBread(int num,string name,double price,double oldPrice,double discPrice):Bread(num,name,price)
{ //有参构 用基类数据对派生类的num,name,price进行赋值
originalPrice=oldPrice; //接收oP的数值,赋给originP
discountPrice=discPrice; //接收dcP的数值,赋给dP
}
void DiscountBread::DispBread() //显示特价面包信息
{
cout<<"特价面包编号:"<<breadNumber<<endl<<"名称:"<<breadName<<endl<<"售价(单位:元):"<<discountPrice<<endl<<"**********************************"<<endl;
}
class RegularBread:public Bread //正价面包 从Bread类继承来
{
private:
double regularPrice; //正常售价
public:
RegularBread(); //无参构
RegularBread(int num,string name,double price,double salePrice); //有参构 比基类多了一个销售价
void DispBread(); //显示正价面包信息
double GetRegularPrice(){return regularPrice;} //得到正常售价
};
RegularBread::RegularBread():Bread() //无参构 定义初始值
{
regularPrice=0;
}
RegularBread::RegularBread(int num,string name,double price,double salePrice):Bread(num,name,price)
{ //有参构,用基类数据对派生类的num,name,price进行赋值
if (salePrice > price) //判断售价是否大于进价
regularPrice = salePrice;
else
{
cout<<"正价面包的售价应高于进价,否则应设为特价面包!";
return;
}
}
void RegularBread::DispBread() //显示正价面包信息
{
cout<<"正价面包编号:"<<breadNumber<<endl<<"名称:"<<breadName<<endl<<"售价(单位:元):"<<regularPrice<<endl<<"**********************************"<<endl;
}
//########################################################################################
class BreadKind //面包种类
{
public:
BreadKind();
void AddDiscKind(int num,string name,double inPrice,double oldPrice,double outPrice); //增加特价面包种类 iP输入价格 outP输出价格
void AddReguKind(int num,string name,double inPrice,double outPrice); //增加正价面包种类
void InitBreadKind(); //初始化面包种类列表
void DispBreadKind(); //显示店铺所有面包种类列表
DiscountBread GetDiscBread(int num); //返回第num种面包(特价)
RegularBread GetReguBread(int num); //返回第num种面包(正价)
void DispReguBreadKind(); //显示正价面包信息
void DispDiscBreadKind(); //显示特价面包信息
private:
DiscountBread discKind[100]; //保存特价面包种类 以数组储存
RegularBread reguKind[100]; //保存正价面包种类 以数组储存
int discKindLength; //保存特价面包种类数
int reguKindLength; //保存正价面包种类数
};
BreadKind::BreadKind() //无参构 定义初始值
{
discKindLength=0;
reguKindLength=0;
}
DiscountBread BreadKind::GetDiscBread(int num) //返回第num种特价面包
{
for(int i=1;i<=discKindLength;i++)
{
if(discKind[i-1].GetBreadNumber()==num)
return discKind[i-1];
}
}
RegularBread BreadKind::GetReguBread(int num) //返回第num种正价面包
{
for(int i=1;i<=reguKindLength;i++)
{
if(reguKind[i-1].GetBreadNumber()==num)
return reguKind[i-1];
}
}
void BreadKind::InitBreadKind() //初始化面包总类列表
{
cout<<"请先输入初始化面包种类,首先请输入正价面包的种类"<<endl;
cout<<"请先输入要添加的正价面包种类的数量:";
int kindNumber;
cin>>kindNumber;
string name;
double inPrice;
double oldPrice;
double outPrice;
for(int i=1;i<=kindNumber;i++)
{
cout<<"请输入第"<<i<<"种正价面包的名称:";
cin>>name;
cout<<"请输入第"<<i<<"种正价面包的进价(单位:元):";
cin>>inPrice;
cout<<"请输入第"<<i<<"种正价面包的售价(单位:元):";
cin>>outPrice;
AddReguKind(i,name,inPrice,outPrice); //数值传输
}
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
cout<<"正价面包种类已录入完毕,请添加特价面包的种类:"<<endl;
cout<<"请输入要添加特价面包种类的数量";
cin>>kindNumber;
for(int i=1;i<=kindNumber;i++)
{
cout<<"请输入第"<<i<<"种特价面包的名称:";
cin>>name;
cout<<"请输入第"<<i<<"种特价面包的进价(单位:元):";
cin>>inPrice;
do
{
cout<<"请输入第"<<i<<"种特价面包的原价(单位:元):";
cin>>oldPrice;
cout<<"请输入第"<<i<<"种特价面包的折扣价【折扣价需低于原价,否则重新输入】(单位:元):";
cin>>outPrice;
}while(oldPrice<outPrice);
AddDiscKind(i,name,inPrice,oldPrice,outPrice); //数值传输
}
}
void BreadKind::AddReguKind(int num,string name,double inPrice,double outPrice)
{ //增加正价面包种类
reguKind[reguKindLength]=RegularBread(num,name,inPrice,outPrice);
reguKindLength++;
}
void BreadKind::AddDiscKind(int num,string name,double inPrice,double oldPrice,double outPrice)
{ //增加特价面包种类
discKind[discKindLength]=DiscountBread(num,name,inPrice,oldPrice,outPrice);
discKindLength++;
}
void BreadKind::DispReguBreadKind() //显示正价面包信息
{
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
cout<<"正价面包有:"<<endl;
for(int i=0;i<reguKindLength;i++)
{
cout<<"面包编号:"<<reguKind[i].GetBreadNumber()<<endl<<"面包名称:"<<reguKind[i].GetBreadName()<<endl<<"售价(单位:元):"<<reguKind[i].GetRegularPrice()<<endl;
}
cout<<"* * * * * * * * * * * * * * *"<<endl;
}
void BreadKind::DispDiscBreadKind() //显示特价面包信息
{
cout<<"特价面包有:"<<endl;
for(int i=0;i<discKindLength;i++)
{
cout<<"面包编号:"<<discKind[i].GetBreadNumber()<<endl<<"面包名称:"<<discKind[i].GetBreadName()<<endl<<"正常售价(单位:元):"<<discKind[i].GetOriginalPrice()<<endl<<"折扣价(单位:元):"<<discKind[i].GetDiscountPrice()<<endl;
}
cout<<"* * * * * * * * * * * * * * *"<<endl;
}
void BreadKind::DispBreadKind() //显示超市所有面包列表
{
DispReguBreadKind();
DispDiscBreadKind();
}
//########################################################################################
class CartItem //购买面包单项信息
{
private:
Bread * b; //面包基本信息
int shuliang; //购买的数量
double money; //价钱
public:
CartItem(){ }; //无参构
CartItem(Bread * pb,int sl,double m); //单项购物清单的构造函数
void DispCartItem(); //显示单项购物信息:名称、数量、金额
double GetMoney(){return money;} //返回单项金额
Bread * GetBread(){return b;} //返回购买面包种类
int GetShuliang(){return shuliang;} //返回购买的数量
};
CartItem::CartItem(Bread * pb,int sl,double m) //单项购货清单的 构造函数
{
b=pb;
shuliang=sl;
money=m;
}
void CartItem::DispCartItem() //显示单项购货信息
{
b->DispBread(); //调用单项购货信息
cout<<"# "<<"数量(单位:个):"<<shuliang<<" || 金额(单位:元):"<<money<<endl;
}
//#######################################################################################
class Cart //购物车
{
public:
Cart(){count=0;} //购物车的初始化
void AddItem(CartItem c); //向购物车中添加购买信息
void DeleteItem(int i); //从购物车中删除商品
void CheckOut(); //购物车结账 ##############################################################################
void DispCart(); //显示购物车中所购买的商品信息
private:
CartItem car[100]; //记录购物车中所买的商品信息
int count; //记录购物车中所买商品个数
};
void Cart::AddItem(CartItem c) //向购物车中添加购物信息
{
car[count]=c;
count=count+1;
}
void Cart::DeleteItem(int i) //从购物车中删除商品
{
for(int j=i;j<count-1;j++)
car[j]=car[j+1];
count=count-1;
}
void Cart::CheckOut() //购物车结账
{
double sum=0;
for(int i=0;i<count;i++)
{
sum+=car[i].GetMoney();
profit+=car[i].GetMoney()-(car[i].GetBread()->GetPrice()*car[i].GetShuliang()); //计算单笔商品的利润,添加到全局变量profit中
}
totalMoney+=sum; //将单个购物车的销售总额添加到全局变量的销售总额中
cout<<"合计金额为(单位:元):"<<sum<<endl;
count=0; //完成一次交易后购物车清空
}
void Cart::DispCart() //显示购物车中所购买的商品信息
{
for(int i=0;i<count;i++)
{
cout<<"第"<<i+1<<"条:";
car[i].DispCartItem(); //调用单项购物清单CartItem类中的函数
}
}
void DispMenu() //显示主菜单
{
cout<<"***********************************************************************"<<endl;
cout<<"***********************************************************************"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** 欢迎来到 dio 面包店 ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"***********************************************************************"<<endl;
cout<<"****** 请选择相应模块 ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** A/a 买面包 ******"<<endl;
cout<<"****** D/d 退面包 (请确保面包不影响二次销售) ******"<<endl;
cout<<"****** C/c 结账 ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"******* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *******"<<endl;
cout<<"****** 管理员模块 ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** M/m 查看销售总额 ******"<<endl;
cout<<"****** P/p 查看利润 ******"<<endl;
cout<<"****** Q/q 退出系统 ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"***********************************************************************"<<endl;
cout<<"***********************************************************************"<<endl;
}
Cart c; //记录总利润
int main()
{
BreadKind kind; //管理员初始化商店所有商品的信息
kind.InitBreadKind();
kind.DispBreadKind();
DispMenu(); //显示主菜单
char ch;
cin>>ch;
while(1)
{
switch(ch){
case 'A':case 'a': { //购买面包
kind.DispBreadKind(); //显示面包信息
cout<<"****** ******"<<endl;
cout<<"****** 购买正价面包 / 购买特价面包? ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** Z/z 正价面包 ******"<<endl;
cout<<"****** T/t 特价面包 ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"***********************************************************************"<<endl;
cout<<"***********************************************************************"<<endl;
char zl;
cin>>zl;
switch(zl){
case 'Z':case 'z':{ //购买正价面包
cout<<"****** ******"<<endl;
cout<<"****** 请选择面包种类编号: ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** ";
int bk;
cin>>bk;
cout<<"****** 请输入购买数量(单位:个): ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** ";
int sl;
cin>>sl;
double price;
price=kind.GetReguBread(bk).GetRegularPrice();
CartItem ct(&(kind.GetReguBread(bk)),sl,sl*price); //#################################################################3
c.AddItem(ct);
break;
}
case 'T':case 't':{
cout<<"****** ******"<<endl;
cout<<"****** 请选择面包种类编号: ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** ";
int bk;
cin>>bk;
cout<<"****** 请输入购买的数量(单位:个): ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** ";
int sl;
cin>>sl;
double price;
price=kind.GetDiscBread(bk).GetDiscountPrice();
CartItem ct(&(kind.GetDiscBread(bk)),sl,sl*price); //##########################################################################
c.AddItem(ct);
break;
}
}
break;
}
case 'C':case 'c':{
c.DispCart();
c.CheckOut();
break;
}
case 'D':case 'd':{
c.DispCart();
cout<<"****** ******"<<endl;
cout<<"****** 选择要退还商品所在的条数: ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"******";
int num;
cin>>num;
c.DeleteItem(num-1);
break;
}
case 'M':case 'm':{
cout<<"****** ******"<<endl;
cout<<"****** 当前销售总额为(单位:元): ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** "<<totalMoney<<endl;
break;
}
case 'Q':case 'q':{
cout<<"***********************************************************************"<<endl;
cout<<"******* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *******"<<endl;
cout<<"****** 感谢您的使用,再见 (^ 3 ^) ******"<<endl;
cout<<"******* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *******"<<endl;
cout<<"***********************************************************************"<<endl;
return 0;
break;
}
case 'P':case 'p':{
cout<<"****** ******"<<endl;
cout<<"****** 当前利润为(单位:元): ******"<<endl;
cout<<"****** ******"<<endl;
cout<<"****** "<<profit<<endl;
break;
}
default:{
cout<<"******* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *******"<<endl;
cout<<"****** !!!输入错误!!! ******"<<endl;
cout<<"******* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *******"<<endl;
break;
}
}
DispMenu();
cin>>ch;
}
}