📄 shengchan1.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;
}
else
wantitem();
}
else
{
t=prod->t;
wait(cons,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;
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)
{
if(q->t<=p0->next->t)
{
q->next=p0->next;
p0->next=q;
break;
}
else
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=(struct person *)malloc(sizeof(struct person));
p3->type=consnum-i;
p3->flag=1;
p3->next=consumers;
consumers=p3;
}
head=(struct buffer *)malloc(sizeof(struct buffer));
head->flag=0;
head->next=head;
in=head;
out=head;
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;
int j;
q=consumers;
for(j=1;j<=consnum;j++)
{
if(q->type==cons->type)
q->flag=2;
q=q->next;
}
out->flag=0;
out=out->next;
totalitem--;
if(t<=totaltime)
{
clrscr();
print(producers,head,consumers,t);
sleep(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("| **** | ");
else
{
if(q->flag==1)
printf("| do | ");
else
printf("| | ");
}
q=q->next;
}
printf("\n");
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("| ***** |");
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("| **** | ");
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 + -