齐桡吧 关注:9贴子:1,329
  • 2回复贴,共1

生产者消费者算法

只看楼主收藏回复

0


1楼2005-11-26 14:20回复
    #include<iostream.h>
    #include<stdlib.h>
    #include<conio.h>

    const int QueueNum=6;//the real Num of the Queue is QueueNum-1
    const int ERROR=0;
    const int OK=1;
    const int QueuePre=-1;

    typedef int ElemType;

     //head define....................
    /*************************CONST DEFINE*****************************************/
    //------------------------------------------------------------------------------

    //==============================================================================
    //==================Define of Class Queue_c=====================================


     class Queue_c
     {
     ElemType Q[QueueNum];
     int front,rear;

     public:
     //basic information of the class Queue_c:
     Queue_c();

     int qFull();
     int qEmpty();
     int qEnQueue(ElemType e);
     ElemType qDeQueue();
     int qGetNumber();
     int qGetElem(int);
     int qShowQueue();

    //other functions:
    ElemType qGetFrontElem(){if(qEmpty()){cout<<"ERROR!"<<endl;return ERROR;}return Q[front];}
    //int qGetFront(){if(qEmpty()){cout<<"ERROR!"<<endl;return ERROR;}return front;}
    //ElemType qGetRearElem(){if(qEmpty()){cout<<"ERROR!"<<endl;return ERROR;}return Q[(rear-1+QueueNum)%QueueNum];}
    //int qGetRear(){if(qEmpty()){cout<<"ERROR!"<<endl;return ERROR;}return (rear-1+QueueNum)%QueueNum;}
    //int qShowAll();

    /* int qDec()
     {
     if(qEmpty()){cout<<"ERROR!"<<endl;return ERROR;}//endif
     Q[front]--;
     return OK;
     }
    */
     };

    //===============END Define of Class Queue_c=====================================
    //==============================================================================

    //==============================================================================
    //==================Define of Class Work_c======================================

     class Work_c
     {
     Queue_c buf;
     public:

     int wConsumer();
     int wProducer();

     int wShowBUF(){return buf.qShowQueue();}
     int wInBUF(int i){return buf.qEnQueue(i);}
     };

    //==================END Define of Class Work_c==================================
    //==============================================================================

    //-----------------------------------------------------------------------------
    /******************************END OF CLASSES DEFINE***************************/


    /*******************************==main==****************************************************
    ********************************==proc==***************************************************/

    /*******************************==main==****************************************************
    ********************************==proc==***************************************************/

     void main()
     {
     Work_c w;
     int judge;
     w.wInBUF(5);
     w.wInBUF(3);
     w.wInBUF(1);
     clrscr();
     char flag='y';

     while('n'!=flag)
     {
     cout<<"------------------work----------------------"<<endl;
     //w.buf.qShowQueue();
     judge=random(flag)%3;

     if(0==judge){w.wProducer();cout<<"prodecer produce a produect"<<endl;}
     if(1==judge){w.wConsumer();cout<<"consumer consume a product"<<endl;}
     if(2==judge)cout<<"do nothing"<<endl;
    


    2楼2005-11-26 15:05
    回复

       w.wShowBUF();
       cout<<"-------------------END WORK-----------------"<<endl<<endl;

       cout<<"Are you want to continue?y/n"<<endl;
       cin>>flag;

      clrscr();

       }//endfor

       }

      /********************************==END==*****************************************************
      *********************************==main==***************************************************/





      /********************************==END==*****************************************************
      *********************************==main==***************************************************/

      /************************Class Queue_c**********************************/
      //================Queue_c================================
      Queue_c::Queue_c()
       {
       int i;
       for(i=0;i<QueueNum;i++)Q[i]=QueuePre;
       rear=0;
       front=0;
       }
      //=====================qFull===========================
       int Queue_c::qFull()
       {
       if((rear+1)%QueueNum==front)
       {cout<<"Queue is full"<<endl;
       return OK;}
       else return ERROR;
       }
       //================qEmpty================================
       int Queue_c::qEmpty()
       {
       if(rear==front)
       { cout<<"Queue is Empty"<<endl;
       return OK;
       } //endif
       else return ERROR;
       }
      //===============qEnQueue=================================
       int Queue_c::qEnQueue(ElemType e)
       {
       if(qFull())return ERROR;
       Q[rear]=e;
       rear=(rear+1)%QueueNum;
       return OK;
       }

       //=================qDeQueue===============================
       ElemType Queue_c::qDeQueue()
       {
       ElemType e;
       if(qEmpty())return ERROR;
       e=Q[front];
       Q[front]=QueuePre;
       front=(front+1)%QueueNum;
       return e;
       }


      //===================qGetNumber=============================
       int Queue_c::qGetNumber()
       {int i;
       i=((rear-front+QueueNum)%QueueNum);
       return i;
       }
      //==================qGetElem==============================
       ElemType Queue_c::qGetElem(int i)
       {
       if(qEmpty()){cout<<"ERROR!"<<endl;return ERROR;}
       if(i>qGetNumber()-1)
       {
       cout<<"ERROR! there is no "<<i<<",or no "<<i<<" in Queue now"<<endl;
       return ERROR;
       }
       return Q[(front+i)%QueueNum];

       }

      //======================qShowQueue==========================
       int Queue_c::qShowQueue()
       {int i;
       if(qEmpty())return ERROR;

       for(i=front;i!=rear%QueueNum;i=(i+1)%QueueNum)
       {
       cout<<Q[i]<<" ";
       }//endfor

       cout<<endl;
       return OK;
       }

      //======================qShowAll=========================
      /*int Queue_c::qShowAll()
      {
      int i;
      for(i=0;i<QueueNum;i++)cout<<Q[i]<<" ";
      cout<<endl;
      return OK;
      }*/
      /************************Class Work_c******************************************/
      //======================wConsumer=========================
       int Work_c::wConsumer()
      { int t;
      buf.qDeQueue();
      return OK;
      }
      //======================wProducer=========================
      int Work_c::wProducer()
      {
       int t;
       t=random(200)%2;
       if(t){buf.qEnQueue(random(10)+1);return OK;}
       return ERROR;
      }
      //========================================================
      /**************************End of Class Work_c*********************************/


      3楼2005-11-26 15:05
      回复