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

📄 simulation.h

📁 数据结构
💻 H
字号:
typedef LinkList EventList;  //事件链表类型,定义为有序链表
EventList ev;                //事件表
Event en;                    //事件

LinkQueue Q1[9],Q2[4];  //等候理发的顾客队列
QElemType customer;          //顾客记录
int t1,t2,Totaltime[9],CloseTime; 
float money[9],Allmoney;
int j,x,k,i;
int select;
int N,CustomerNum;
char otime[2];


int  SeatChoose(LinkQueue Q[],int a[]);
void OpentimeFile(char otime[]);
void RankFile();
int  BarnumFile();
void Print(LinkQueue Q1[],LinkQueue Q2[]);

void OpenForDay()
{  //初始化操作
	t1=t2=0;
	

	CustomerNum=0;
	InitList(ev);
	en.OccurTime=0;
	en.NType=0;
	OrderInsert(ev,en);

	printf("\n");
	printf("*****************************欢迎来到丁丁的理发馆******************************\n");
    
	OpentimeFile(otime);
	cout<<"今日开门时间:"<<otime[0]<<otime[1]<<otime[2]<<otime[3]<<"分";
	cout<<endl;

	N=BarnumFile();

	for(i=1;i<=N;i++)
	   Totaltime[i]=0;
	
	for(i=1;i<=N;i++)   
		InitQueue(Q1[i]);

	RankFile();

	for(i=1;i<=3;i++)   
		InitQueue(Q2[i]);

	cout<<"请选择关门时间(多少分钟后):";
	cin>>CloseTime;
	cout<<endl;
	for(x=1;x<=N;x++){
	   printf("理发师%d(%d)  ",x,Q1[x].rank);
	}
	printf("\n");
	for(x=1;x<=N;x++){
	   printf("    空位    ");
	}
	printf("\n");
	printf("\n");
	printf("\n");
	printf("##############################等待队列##########################################\n");
	for(x=1;x<=3;x++){
	   printf("         等级%d        ",x);
	}
	printf("\n");
	printf("\n");
	for(x=1;x<=4;x++){
		for(j=1;j<=3;j++){
		   printf("         空位         ");
		}
		printf("\n");
	}
}

void CustomerArrived()
{  //处理顾客到达事件
	QElemType e1;
	ElemType e;
	int durtime,intertime,R1,R2,R3,flag;
	int a[9];
	int k=0;
    j=0;
	CustomerNum++;
	srand((unsigned)time(NULL));
	R1=rand();
	durtime=10+R1%10;
	srand((unsigned)time(NULL));
	R2=rand();
	intertime=1+R2%10;
	srand((unsigned)time(NULL));
	R3=rand();
	select=1+R3%3;
	
	t1=en.OccurTime+intertime;

	e.OccurTime=t1;
	e.NType=0;
	if(t1<CloseTime) 
		OrderInsert(ev,e);
	
	
    j=SeatChoose(Q1,a);
   
	while(k<=j){
	 if(QueueEmpty(Q1[a[k]])){	
	    e1.ArrivalTime=en.OccurTime;
	    e1.Duration=durtime;
	    e1.CustomerNum=CustomerNum;
	   	EnQueue(Q1[a[k]],e1);
		
		Print(Q1,Q2);
	    
		QueueTraverse1(Q1[a[k]],a[k],e1);//某客人进第几队理发
	
		e.OccurTime=en.OccurTime+durtime;
	    e.NType=a[k];
		OrderInsert(ev,e);
		flag=0;
		break;
	  }
	 else{k++;
	      flag=1;
	 }
	}
	if(flag){
	      e1.ArrivalTime=en.OccurTime;
	      e1.Duration=durtime;
	      e1.CustomerNum=CustomerNum;
	      EnQueue(Q2[select],e1);
		  Print(Q1,Q2);
	      QueueTraverse2(Q2[select],select,e1);//某客人在第几级队中等待
	}
	
	
	if(t1<CloseTime){
	   
	   cout<<"此顾客理发时间:";
	   cout<<durtime<<"分钟 ";
	   cout<<"选择级别:";
       cout<<select<<" ";
	   cout<<"下一顾客";
	   cout<<intertime<<"分钟后到达!";
	   
	   cout<<endl;
	}
	else{
	   cout<<"此顾客理发时间";
	   cout<<durtime<<" ";	   
	   cout<<" select:";
       cout<<select<<" ";
	   cout<<"下一顾客到达时间,超过关店时间,不能进入";
	   cout<<endl;
	}
}

void CustomerDeparture(float discount[])
{
	ElemType e;
	QElemType e1;
    int bill[3]={3,2,1};
	
	if(i>0){
	   i=en.NType; 
	   
	   DeQueue(Q1[i],customer);         //某位客人理完发离去
	   customer.Cost0=10.0+customer.Duration*bill[Q1[i].rank-1];
	   customer.Cost1=customer.Cost0*discount[Q1[i].rank];
	   Totaltime[i]+=customer.Duration;
	   money[i]+=(10+customer.Duration*bill[Q1[i].rank-1])*discount[Q1[i].rank];
	   Allmoney+=(10+customer.Duration*bill[Q1[i].rank-1])*discount[Q1[i].rank];
	   Print(Q1,Q2);
	   QueueTraverse1(Q1[i],i,customer);  
	   
	   printf("\n");
	 
	  for(select=1;select<=3;select++){
	     if(select==Q1[i].rank){
	       if(!QueueEmpty(Q2[select]))
		   {
		
                 DeQueue(Q2[select],customer);      //某位客人出等待队列,在某理发师处开始理发
				 Print(Q1,Q2);
				 QueueTraverse2(Q2[select],select,customer);
                 
                 e.OccurTime=en.OccurTime+customer.Duration;
		         e.NType=i;
		         OrderInsert(ev,e);

			     e1.ArrivalTime=customer.ArrivalTime;
			     e1.Duration=customer.Duration;
			     e1.CustomerNum=customer.CustomerNum;
		         EnQueue(Q1[i],e1);
				 Print(Q1,Q2);
				 QueueTraverse1(Q1[i],i,e1);        //某位客人进某队理发
		         if(e.OccurTime>t2) t2=e.OccurTime;		  		   
		   }		  		   
		 }
	  }
	}
}

int SeatChoose(LinkQueue Q[],int a[]){      //获得所选级别理发师的编号
    int i;
	int j=0;

	for(i=1;i<=N;i++){
		if(Q[i].rank==select){	
			a[j]=i;
			j++;
		}
	}
	return j-1;
}

void OpentimeFile(char otime[]){
    FILE *fp; 
   
    int i=0;
    fp=fopen("opentime.txt","r");
    while(!feof(fp)) {
	   fscanf(fp,"%c", &otime[i]);
	   i++;
	}
	fclose(fp); 
}

void RankFile(){
    FILE *fp; 
   
    int k=1;
    fp=fopen("rank.txt","r");
    while(!feof(fp)) {
		if(k%2==1){
			fscanf(fp,"%d",&i);k++;
		}
		else{
			fscanf(fp,"%d", &Q1[i].rank);
			k++;}
	}
	fclose(fp); 

	for(i=1;i<=N;i++)
	   printf("第%d位理发师级别为%d\n",i,Q1[i].rank);
}

int BarnumFile(){
    FILE *fp; 
    int n;
    fp=fopen("barnum.txt","r");
    while(!feof(fp)) {
	   fscanf(fp,"%d", &n);	   
	}
	fclose(fp); 
	printf("今日理发师的数目为:%d位\n",n);
	return n;
}

void Print(LinkQueue Q1[],LinkQueue Q2[]){
    int x,k;
	int a[5][4];
    
	system("cls");
    printf("*****************************欢迎来到丁丁的理发馆******************************\n");
	for(x=1;x<=N;x++){
	   printf("理发师%d(%d)  ",x,Q1[x].rank);
	}
    printf("\n");
	for(x=1;x<=N;x++){
	   if(QueueEmpty(Q1[x]))
		printf("    空位    ");
	   else printf("    有人    ");
	}
    printf("\n");
    printf("\n");
	printf("\n");
	printf("##############################等待队列##########################################\n");
	for(x=1;x<=3;x++){
	   printf("         等级%d        ",x);
	}
	printf("\n");
	printf("\n");
	for(j=1;j<=3;j++){
		k=QueueLength(Q2[j]);
		if(k==0){
		 for(x=1;x<=4;x++)
				 a[x][j]=0;
		}
		 else{
		   for(x=1;x<=4;x++){
			   if(x==k) a[x][j]=1;	 
			   else a[x][j]=0;
		   }
		 }
	}
	for(x=1;x<=4;x++){
		for(j=1;j<=3;j++){
			if(a[x][j]==0)
			  printf("         空位         ");
	        if(a[x][j]==1)
			  printf("         有人         ");
		}
        printf("\n");
	}

	printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
	printf("\n");
    printf("\n");
	
}

⌨️ 快捷键说明

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