我正在编写一个代码,模拟超市的结账行。我为这个问题使用动态分配(队列)。 当前时间将从0到120分钟(这也是我的循环的120次迭代) 每个客户将随机输入该行(下一个人将在1到4分钟的随机整数间隔后输入)。客户也将以随机时间方式(1-4分钟后)由店员提供服务。 执行如下:
----客户编号1到达
- 当前时间为0
- 当前时间是1
----客户编号1离开
- 当前时间是2
----客户编号2到达
- 当前时间是3
----客户编号3到达
----客户编号2离开
等等。
函数入队帮助我将下一个客户添加到该行。 函数出列帮助我删除所服务的客户。 这是First In First Out队列。 第一个进入的人将是第一个离开这条线的人。
我的问题是:我的程序适用于大约60或70个循环。在这些循环之后,我只看到人们进入线路,我不再看到有人离开线路。 我该如何解决这个循环? 我的代码是:
struct customer{
int number; //show the order of the customer waiting on the line
struct customer *nextPtr; //point to the next customer
};
typedef struct customer Customer;
typedef Customer *CustomerPtr;
int main (void)
{
srand(time(NULL));
CustomerPtr startPtr=NULL;
int timework=0;
int timein=0;
int timeout=0;
int customerio=1;// show the order of the customer entering the line
printf("\tCustomer number %d arrived\n", customerio);
enqueue(&startPtr, customerio);
timein+=rand()%4+1; //schedule the time the next customer will enter the line
timeout+=rand()%4+1; //schedule the time the next customer will leave the line
while (timework<=120){ // the clerk will serve customers for 120 minutes
printf("Current time is %d\n", timework);
if (timework==timeout){ //if the current time matches the time scheduled
if (startPtr!=NULL){
printf("\tCustomer number %d left\n", startPtr->number);
dequeue(&startPtr); //remove a customer from queue
timeout+=rand()%4+1;
}
}
if (timework==timein){ //if the current time matches the time scheduled
customerio+=1;
printf("\tCustomer number %d arrived\n", customerio);
enqueue(&startPtr, customerio); //add a customer to queue
timein+=rand()%4+1;
}
timework++; //time elapses to the next minute
}
return 0;
}
答案 0 :(得分:0)
如果您遇到空队列(statePtr == NULL)
,那么您不会更新超时,因此它总是少于时间工作。通过移动
timeout+=rand()%4+1;
在检查statePtr的条件之外。
或者,将条件检查更改为timework >= timeout
,但这可能不太明显/有效。
其他解决方案是可能的 - 这是正确的取决于模拟的性质。