停车场管理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题需求分析
问题描述
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可以供车辆进出。车辆按到达停车场时间的早、晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,那么,后面进入停车场的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且在便道上等待的车辆依然保持原有次序不变。
设计一个程序,模拟此停车场管理。
需求分析
停车场采用栈式结构,停车场外的便道采用队列结构(即便道就是等候队列)。停车场的管理流程如下:
①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等候)。
②当车辆要求出栈时,该车到栈顶的那些车辆先进入辅助栈(在它之后进入的车辆必须先退出车场为它让路),再让该车出栈,其他车辆再按原次序进栈(进入车场)。当车辆出栈完毕后,检查等候队列(便道)中是否有车,有车则从队头取出一辆车压入栈中。
用栈模拟停车场,用队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车到达或离去的信息,汽车牌照号码以及到达或离去的时刻。每次输入完,进行输出操作:若是车辆到达,输出汽车在停车场内或便道上的停车位置;若是车辆离去,输出停留时间和应缴纳的费用(在便道上停留的时间不收费)。其中栈以顺序结构实现,队列以链表结构实现。
算法与数据结构的设计
算法设计
停车
车离开停车场
算法的精华与程序的实现(程序实现的核心算法)
停车函数
void car_come(PSTOPPING stop,PPA VEMENT pave,char *plate,char *in_time) /*来车函数*/
{
if(stop->top!=MAX_STOP-1)
{
stop->top++;
stop->STOP[stop->top].license_plate=plate;
stop->STOP[stop->top].in_time=in_time;
stop->STOP[stop->top].state='S';
printf("请您停放在%d号车位!您的入场时间
为:%s\n",stop->top+1,stop->STOP[stop->top].in_time);
}
else
{
pave->PA VE[pave->rear].license_plate=plate;
pave->PA VE[pave->rear].in_time=in_time;
pave->PA VE[pave->rear].state='P';
printf("停车位已满!请在便道等待!您的入场时间
为:%s\n",pave->PA VE[pave->rear].in_time);
pave->rear=(pave->rear+1)%MAX_PA VE;
}
}
离开函数
void stop_to_buff(PSTOPPING stop,PBUFFER buff,int pos) /*暂入辅助栈函数*/
{
buff->top++;
buff->BUFF[buff->top].license_plate=stop->STOP[pos].license_plate;
buff->BUFF[buff->top].in_time=stop->STOP[pos].in_time;
stop->top--;
printf("牌照为%s的汽车暂时退出停车位!\n",stop->STOP[pos].license_plate);
}
void buff_to_stop(PSTOPPING stop,PBUFFER buff,int pos) /*由辅助栈返回停车位函数*/
{
stop->top++;
stop->STOP[pos].license_plate=buff->BUFF[buff->top].license_plate;
stop->STOP[pos].in_time=buff->BUFF[buff->top].in_time;
stop->STOP[pos].state='S';
buff->top--;
printf("牌照为%s的汽车停回停车位的%d车位!
\n",stop->STOP[pos].license_plate,pos+1);
}
void pave_to_stop(PSTOPPING stop,PPA VEMENT pave) /*由便道进入停车位函数*/
{
stop->top++;
stop->STOP[stop->top].license_plate=pave->PA VE[pave->front].license_plate;
stop->STOP[stop->top].in_time=pave->PA VE[pave->front].in_time;
stop->STOP[stop->top].state='S';
printf("牌照为%s的汽车从便道上进入停车位的%d车位!
\n",pave->PA VE[pave->front].license_plate,MAX_STOP);
pave->front=(pave->front+1)%MAX_PA VE;
}
查找函数
void show_car(PSTOPPING stop,PPA VEMENT pave,char *plate) /*查找并显示信息函数*/
{
int i,j;
for(i=0;i<=stop->top;i++)
if(!strcmp(stop->STOP[i].license_plate,plate)) break;//栈内假如得到寻找的车牌号就跳出
if(i==stop->top+1)
{
for(j=(pave->front)%MAX_PA VE;j
if(!strcmp(pave->PA VE[j].license_plate,plate)) break;
}
if(i
printf("您的汽车%s位于停车位的%d车位!\n\n",plate,i+1);
else
{
if(j
printf("您的汽车位于便道的%d位置!\n\n",j-(pave->front)%MAX_PA VE+1);
else
printf("对不起,停车场中无此车!\n\n");
}
}