问题描述:假设只有一个医生,在一段时间内随机地来几位病人,假设病人到达到的时间间隔为0—14分钟之间的某个随机值,每个病人所需处理间隔为1—9分钟之间的某个随机值。试用队列结构进行模拟。

#include<stdio.h>

#include<stdlib.h>

#include<string>

#include<iostream>

#include <time.h>

using namespace std;

#define status int

#define ok 1

typedef struct patient

       double arrive;

       double treat;

}patient;

typedef struct Qnode

{

 patient data;

struct Qnode *next;

}Qnode,*QueuePtr;

typedef struct 

{

QueuePtr front;

QueuePtr rear;

}LinkQueue;

status InittQueue(LinkQueue &Q)

       Q.front=Q.rear=new Qnode;

       Q.front->next=NULL;

       return ok;

}

status EnQueue(LinkQueue &Q,patient e)

{

    QueuePtr p;

    p=(QueuePtr)malloc(sizeof(Qnode));

    p->data=e;

    p->next=NULL;

    Q.rear->next=p;

    Q.rear=p;

       return ok;

}

int display(LinkQueue Q)

{  

       QueuePtr p;

       p=Q.front;

       p->next;

       int n=0;

       while(p!=NULL)

       {

              n++;

              p=p->next;

       }

       return n;

}

void Input(LinkQueue Q)

{

       FILE* fp = fopen("病人模拟看病.txt", "w");

     QueuePtr p;

        p=Q.front;

        p=p->next;

        int m=1;

       while (p != NULL)

       {  

              fprintf(fp, "第%d位病人到达间隔时间%d分钟  医生看病时间%d分钟\n",m,(int)p->data.arrive, (int)p->data.treat);

              p=p->next;

              m++;

       }

       fclose(fp);

}

void jiuzhen(LinkQueue &Q)

{

       srand((unsigned)time(NULL));

   patient b;

   b.arrive=0;

   b.treat=rand()%9+1;

   EnQueue(Q,b);

   int n;

   n=rand()%20;

   int i=0;

   while(i!=n)

   { patient b;

   b.arrive=rand()%14+1;

   b.treat=rand()%9+1;

   EnQueue(Q,b);

   i++;

   }

}

void showxinxi(LinkQueue &Q)

{

       QueuePtr p;

       p=Q.front;

       p = p->next;

       double parr=0 ,sum,res;

       printf("到达病人人数:%d\n",display(Q)-1) ;

 for (int m=0; m<display(Q)-1; m++)

       {  

              cout<<"第"<<m+1<<"位病人到达间隔时间"<<p->data.arrive<<"分钟    ";

           cout<<"医生看病时间:"<<p->data.treat<<"分钟    ";

          if(p->data.arrive-parr>0)

              {     

                            cout<<"医生等待时间:"<<p->data.arrive-parr<<"分钟"<<endl;

                            sum += p->data.arrive-parr;

              }

              else

              {

                     cout<<"病人等待时间:"<<parr-p->data.arrive<<"分钟"<<endl;

                     res+=parr-p->data.arrive;

              }    

              parr=p->data.treat;

              p = p->next;

       }

}

void doctorwait(LinkQueue Q)

{

       QueuePtr p;

       p=Q.front;

       p = p->next;

       double parr=0,sum=0;

       for (int m=0; m<display(Q)-1; m++)

       {

              if(p->data.arrive-parr>0)

                 sum=sum+p->data.arrive-parr;

                 parr=p->data.treat;

              p = p->next;

       }

       cout<<"医生总等待时间"<<sum<<"分钟"<<endl;

 }

 void patientwait(LinkQueue Q)

 {

      QueuePtr p;

       p=Q.front;

       p = p->next;

       double parr=0,sum=0;

       for (int m=0; m<display(Q)-1; m++)

       {

              if(p->data.arrive-parr<0)

                 sum=sum+parr-p->data.arrive;

                  parr=p->data.treat;

              p = p->next;

       }

       cout<<"病人平均等待时间"<<sum/(display(Q)-1)<<"分钟"<<endl;

 }

int main()

{  

  

   LinkQueue a;

   InittQueue(a);

        cout<<"         -------------->1.就诊  <----------------------"<<endl;

              cout<<"         -------------->2.就诊信息查询<----------------"<<endl;

              cout<<"         -------------->3:病人平均等待时间<------------"<<endl;

              cout<<"         -------------->4:医生总等待时间<-------------"<<endl;

              cout<<"         -------------->5.打印输出就诊信息 <------------"<<endl;

              cout<<"         -------------->6.下班  <----------------------- "<<endl;

             

       int x ;

       while(1)

       {

       scanf("%d",&x);

         switch(x)

         {

            case(1):

            {

               jiuzhen(a);

               cout<<"就诊完成"<<endl;

                   break;

              }

              case(2):

              {

                     showxinxi(a);

                     break;

              }

              case(3):

              {

            patientwait(a);

                     break;

               }

               case(4):

               {

                     doctorwait(a);

                    break;

               }

               case(5):

               {

                    Input(a);

                    cout<<"打印完成,内容以存放至 病人模拟看病.txt"<<endl;

                     break;

               }

              case(6):

              {

                     printf("要下班吃饭咯");

                  exit(0);

              }

         }

   }   

    Input(a);

}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值