⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wsb060702.txt

📁 通过课程设计
💻 TXT
字号:
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<dos.h>
#include<conio.h>
#define NULL   0
struct event
{
int type;
int t;
struct event *next;
};
struct buffer
{
int flag;
struct buffer *next;
};
struct person
{
int type;
int flag;
struct person *next;
};
struct event    *prod,*cons;
struct buffer   *in,*out,*head;
struct person   *producers,*consumers;
int totaltime;
int prodnum,consnum;
int buffernum;
int totalitem=0;
main()
{
struct person *q;
int j;
int flag1=0,flag2=0,flag3=0,flag4=0;
int t=0;
start();
clrscr();
print(producers,head,consumers,t);
sleep(1);
while(t<=totaltime)
{  if(prod->t<=cons->t)
   {
    if(totalitem!=buffernum)
    {
     t=prod->t;
     q=producers;
     for(j=1;j<=prodnum;j++)
     {
      if(q->type==prod->type)
      {
            if(q->flag==0)                                               
              q->flag=1;   
            else
          {
            q->flag=2;
            flag1=1;
          }
      }
     q=q->next;
     }
      if(t<=totaltime)
       {
         clrscr();
         print(producers,head,consumers,t);
         sleep(1);
       }
       if(flag1==1)
     {
       putin(t);
       flag1=0;
     }
       else
       doitem();
    }
       else
       {
       t=cons->t;
       wait(prod,t);
       q=consumers;
       for(j=1;j<=consnum;j++)
       {
          if(q->type==cons->type)
              {
                  if(q->flag==0)
                     q->flag=1;
                 else
                      {
                         q->flag=2;
                         flag2=1;
                      }
                 }
        q=q->next;
       }
      if(flag2==1)
       {
        putout(t);
        flag2=0;
       }
      else
      wantitem();
       }
   } 
   else
   {
    if(totalitem!=0)
    {
     t=cons->t;
     q=consumers;
     for(j=1;j<=consnum;j++)
     {
      if(q->type==cons->type)
        {
         if(q->flag==0)
          q->flag=1;
          else
           {
           q->flag=2;
           flag3=1;
           }
      }
      q=q->next;
     }
      if(flag3==1)
     {
       putout(t);
       flag3=0;
     }
       {
             if(q->flag==0)                                               
                q->flag=1;   
              else
         {
              q->flag=2;
                flag4=1;
         }
        }
          q=q->next;
       }
         if(t<=totaltime)
      {
          clrscr();
          print(producers,head,consumers,t);
          sleep(1);
      }

        if(flag4==1)
            {
             putin(t);
             flag4=0;
             }
       else
       doitem();
    }
   }
     }
clrscr();
print(producers,head,consumers,totaltime);
printf("\n\n                                  THE END !! ");
printf("                                    \n");
getch();
}
OrderInsert(int flag,struct event *q)
{ struct event   *p0;
   if(flag==1)
      p0=prod;
    else
      p0=cons;
  if(q->t<=p0->t)
   { q->next=p0;
    if(flag==1)
      prod=q;
    else
     cons=q;
   }
    else
    {  while(p0->next!=NULL)
       {
             p0=p0->next;
       }
     if(p0->next==NULL)
     p0->next=q;
    }
}
start(void)
{int i;
struct event   *p1;
struct buffer *p2;
struct person *p3;
clrscr();
printf("\nPlease input the number of producers!\n");
printf("prodnum=(1--6): ");
        scanf("%d",&prodnum);
printf("\nPlease input the number of consumers!\n");
printf("consnum=(1--6): ");
        scanf("%d",&consnum);
printf("\nPlease input the number of buffers!\n");
printf("buffernum=(1--7): ");
        scanf("%d",&buffernum);
printf("\nPlease input the totaltime!\n");
printf("totaltime=(<180): ");
        scanf("%d",&totaltime);
randomize();
prod=(struct event *)malloc(sizeof(struct event)); 
     prod->type=1;    
     prod->t=rand()%6+5;
     prod->next=NULL;
producers=(struct person *)malloc(sizeof(struct person));
     producers->type=prodnum;
     producers->flag=1;
     producers->next=NULL;
     for(i=1;i<prodnum;i++)
{
   p1=(struct event *)malloc(sizeof(struct event));
      p1->type=i+1;
      p1->t=rand()%6+5;
      p1->next=NULL;
      OrderInsert(1,p1);
   p3=(struct person *)malloc(sizeof(struct person));
      p3->type=prodnum-i;
      p3->flag=1;
            p3->next=producers;
      producers=p3;
}
cons=(struct event *)malloc(sizeof(struct event));
     cons->type=1;
     cons->t=rand()%6+5;
     cons->next=NULL;
consumers=(struct person *)malloc(sizeof(struct person));
     consumers->type=consnum;
     consumers->flag=1;
     consumers->next=NULL;
     for(i=1;i<consnum;i++)
{ p1=(struct event *)malloc(sizeof(struct event));
    p1->type=i+1;
    p1->t=rand()%6+5;
    p1->next=NULL;
    OrderInsert(2,p1);
       p3->type=consnum-i;
      p3->flag=1;
     p3->next=consumers;
      consumers=p3;
}
head=(struct buffer *)malloc(sizeof(struct buffer));
     for(i=1;i<buffernum;i++)
{
  p2=(struct buffer *)malloc(sizeof(struct buffer));
   p2->flag=0;
   p2->next=head->next;
   head->next=p2;
}}
putin(int t)
{
struct event *p;
struct person *q;
int j;
q=producers;
for(j=1;j<=prodnum;j++)
{  if(q->type==prod->type)
   q->flag=0;
   q=q->next;
}
in->flag=1;
in=in->next;
totalitem++;
if(t<=totaltime)
{
clrscr();
print(producers,head,consumers,t);
sleep(1);
}
q=producers;
for(j=1;j<=prodnum;j++)
{
   if(q->type==prod->type)
   {
      randomize();
      q->flag=rand()%2;
   }
    q=q->next;
}
if(t<=totaltime)
{
   clrscr();
   print(producers,head,consumers,t);
   sleep(1);
}
   p=(struct event *)malloc(sizeof(struct event));
   p->type=prod->type;
   randomize();
   p->t=prod->t+rand()%6+5;
   p->next=NULL;
prod=prod->next;
OrderInsert(1,p);
}
doitem(void)
{
struct event *q;
q=(struct event *)malloc(sizeof(struct event));
q->type=prod->type;
randomize();
q->t=prod->t+rand()%6+5;
q->next=NULL;
prod=prod->next;
OrderInsert(1,q);
}
putout(int t)
{
struct event *p;
struct person *q;
intj;
q=consumers;
leep(1);
}
q=consumers;
for(j=1;j<=consnum;j++)
{  if(q->type==cons->type)
     {
     randomize();
     q->flag=rand()%2;
     }
   q=q->next;
}
if(t<=totaltime)
{clrscr();
print(producers,head,consumers,t);
sleep(1);
}
p=(struct event *)malloc(sizeof(struct event));
p->type=cons->type;
randomize();
p->t=cons->t+rand()%6+5;
p->next=NULL;
cons=cons->next;
OrderInsert(2,p);
}
wantitem(void)
{
struct event *p;
p=(struct event *)malloc(sizeof(struct event));
p->type=cons->type;
randomize();
p->t=cons->t+rand()%6+5;
p->next=NULL;
cons=cons->next;
OrderInsert(2,p);
}
wait(struct event *p,int t)
{
struct event *q;
q=p;
do
{if(q->t<t)
 q->t=t;
 q=q->next;
}
while(q->next==NULL);
}
print(struct person *producers,struct buffer *head,struct person *consumers,int t)
{
int r;
struct buffer *p;
struct person *q;
 printf("\n===================== The producer and consumer problam ");
 printf("=======================\n\n\n");
printf("           ");
for(r=1;r<=prodnum;r++)
printf("         ");
printf("\n");
printf("producer: ");
q=producers;
for(r=1;r<=prodnum;r++)
 {if(q->flag==2)
  printf("| producor |   ");
  printf("           ");
for(r=1;r<=prodnum;r++)
printf("           ");
printf("\n\n\n");
printf("           ");
for(r=1;r<=buffernum;r++)
printf("        ");
printf("\n");
printf("buffer:    ");
p=head;
for(r=1;r<=buffernum;r++)
{if(p->flag==1)
 printf("| producor |");
 else
  printf("|        |");
  p=p->next;
}
 printf("\n");
 printf("           ");
 for(r=1;r<=buffernum;r++)
printf("         ");
printf("\n\n\n");
printf("           ");
for(r=1;r<=consnum;r++)
printf("            ");
printf("\n");
printf("consumer: ");
q=consumers;
for(r=1;r<=consnum;r++)
 {
   if(q->flag==1)
   printf("|   ??   |   ");
   if(q->flag==2)
   printf("| producor |   ");
    if(q->flag==0)
     printf("|       |   ");
     q=q->next;
   }
   printf("\n");
   printf("           ");
   for(r=1;r<=consnum;r++)
   printf("           ");
   printf("\n\n\n");
   printf("============================ CurrentTime = %3d",t);
   printf(" ================================\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -