📄 simulation.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 + -