及格万岁! 2021-06-26 10:58 采纳率: 75%
浏览 447

改程序。运行后出现的问题见图片

#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;
      }
      
   } 

  • 写回答

1条回答 默认 最新

  • 好好玩吧 2023-03-18 12:18
    关注

    这个错误通常发生在您尝试获取临时对象的地址时。临时对象是在同一表达式中创建和销毁的对象。当您尝试获取临时对象的地址时,您实际上是在尝试创建指向不存在的对象的指针。这可能会导致程序中的未定义行为和崩溃。

    要解决此错误,您应避免获取临时对象的地址。相反,您可以将对象存储在变量中,然后获取变量的地址。这将确保对象在您需要它的时间内保留在内存中。

    评论

报告相同问题?

悬赏问题

  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误
  • ¥15 请帮我看一下问题出在哪里
  • ¥40 想找个软件,但我不知道怎么找到它,我甚至不知道有没有
  • ¥15 怎么把60秒的视频时长改成显示0秒?且视频内容没有任何变化的正常播放?目的是为了解决一些平台对视频时长的要求,最好有自动处理的工具!
  • ¥15 累加器设初值为00H
  • ¥15 webAPI接口返回值判断
  • ¥15 自动化测试 UI Automtion
  • ¥20 关于#深度学习#的问题:2708)输出:邻接矩阵A 或者 节点索引方式:通过随机游走或者其他方式,保持节点连接类似下图(语言-python)