模拟停车场管理程序的设计与实现 - 范文中心

模拟停车场管理程序的设计与实现

10/17

实验题目:模拟停车场管理程序的设计与实现

一、需求分析

1.程序的功能;

这是一个模拟停车场管理程序,设停车厂是一个可停放n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若停车场内已停满汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。停放在便道上的汽车也收费,收费标准比停放在停车场的车低。每辆停放在停车场的车,在离开时按其在停车场停留时间的长短交费。

2.输入输出的要求;

每一组输入数据包括三个数据项:汽车“到达”或“离去”的信息、汽车牌照号码、汽车到达或离去的时刻;

对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用

3.测试数据。

当停车场容量为5时,连续有7辆车到来,牌照号分别为F001、F002、F003、F004、、F005、F006、F007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。牌照号为F003的汽车从停车厂开走,应显示F005、F004的让路动作和F006从便道到停车位上的动作。(到达和离开时间请自行设定)。

二、概要设计

1.本程序所用的抽象数据类型的定义;

/*时间的类型定义*/ typedef struct { int hour; int min; }TIME;

/*汽车的类型定义*/ typedef struct { char license_plate[10]; /*汽车牌照号码*/ TIME time,time1; /*time,time1分别表示汽车进入停车场和便道的时刻*/ char state; /*汽车当前状态,p 表示一直停放在停车位上,*/

/*q表示一直在便道上等候,*/ /*i表示由便道进入停车位*/

}Car;

/*表示停车位的顺序栈*/ typedef struct { Car Park[MAX_PARK]; /*各汽车信息的存储空间*/ int top; /*用来指示栈顶位置的静态指针*/ }ParkStack;

/*链队列来模拟便道*/

typedef struct qnode { Car data; /*各汽车信息的存储空间*/ struct qnode *next; }Qnode;

typedef struct { Qnode *front, *rear; /*用来指示队头和队尾位置的指针*/ }RoadQueue;

2.主模块的流程及各子模块的主要功能;

本程序从总体上分为四个功能模块,分别为: (1)程序功能介绍和操作提示模块 提示用户进行正确的操作。 (2)汽车进入停车位的管理模块 记录进入停车场的汽车信息并插入栈或队中。 (3)汽车离开停车位的管理模块 释放离开汽车所占空间,计算汽车停车费用并输出。 (4)查看停车场状态的查询模块 列出停车场状态。 3.模块之间的层次关系。

三、详细设计

1.采用c 语言定义相关的数据类型;

/*时间的类型定义*/

typedef struct { int hour; int min; }TIME;

/*汽车的类型定义*/ typedef struct { char license_plate[10]; /*汽车牌照号码*/ TIME time,time1; /*time,time1分别表示汽车进入停车场和便道的时刻*/ char state; /*汽车当前状态,p 表示一直停放在停车位上,*/

/*q表示一直在便道上等候,*/ /*i表示由便道进入停车位*/

}Car;

/*表示停车位的顺序栈*/ typedef struct { Car Park[MAX_PARK]; /*各汽车信息的存储空间*/ int top; /*用来指示栈顶位置的静态指针*/ }ParkStack;

/*链队列来模拟便道*/

typedef struct qnode { Car data; /*各汽车信息的存储空间*/ struct qnode *next; }Qnode;

typedef struct { Qnode *front, *rear; /*用来指示队头和队尾位置的指针*/ }RoadQueue;

2.写出各模块的伪码算法;

//程序功能介绍和操作提示模块 void welcome() { cout

cout>ch; }

//汽车进入停车场的管理模块 void car_come() { Car newCar; cout>newCar.license_plate; if(Park_Car->top:"; cin>>newCar.time.hour>>newCar.time.min; newCar.state='p'; Park_Car->top++; Park_Car->Park[Park_Car->top]=newCar; } else //停车位满,车辆进去便道或开走 { int i; cout

cin>>i; if(i==1) { cout:";

cin>>newCar.time1.hour>>newCar.time1.min; newCar.state='q'; Qnode *p; p=new Qnode; if(!p) { coutdata=newCar; p->next=NULL;

Road_Car->rear->next=p; Road_Car->rear=p; } } else cout>ch; welcome(); }

//汽车离开停车场的管理模块 void car_leave() { char s[10]; int i; TIME t; cout>s; for(i=0;itop;i++) //在停车位寻找要开走的汽车 if(strcmp(s,Park_Car->Park[i].license_plate)==0) break; if(itop) //在停车位找到要开走的汽车 { cout:"; cin>>t.hour>>t.min; print(Park_Car->Park[i],t); while( (Park_Car->top) > i ) //该车前面的汽车暂时退出 { Buffer_Car->top++; Buffer_Car->Park[Buffer_Car->top]=Park_Car->Park[Park_Car->top]; Park_Car->top--; coutPark[Buffer_Car->top].license_plate

} coutPark[i].license_plate

Park_Car->top--; while(Buffer_Car->top>-1) //暂时退出的汽车开回停车位 {

Park_Car->top++; Park_Car->Park[Park_Car->top]=Buffer_Car->Park[Buffer_Car->top]; Buffer_Car->top--; coutPark[Park_Car->top].license_platetop+1

} if(Road_Car->front!=Road_Car->rear) //便道有车,则进入停车位 { Qnode *p; p=Road_Car->front->next; Road_Car->front->next=p->next; p->data.state='i'; p->data.time=t; Park_Car->top++; Park_Car->Park[Park_Car->top]=p->data; delete p; if(Road_Car->front->next==NULL) Road_Car->rear=Road_Car->front; coutPark[Park_Car->top].license_platetop+1

} } else //在停车位未找到要开走的汽车,则在便道寻找 { int k=0; Qnode *p,*r; p=Road_Car->front->next; r=Road_Car->front->next; while(p) { k++; if(strcmp(p->data.license_plate,s)==0) break; p=p->next; } if(p) //在便道找到该车 { cout:"; cin>>t.hour>>t.min; print(p->data,t); while(p!=r) //该车前面有车,前面的车要让路 { coutdata.license_plate

"

Road_Car->front->next=r->next; r->next=NULL; BufferCar->rear->next=r; BufferCar->rear=r; r=Road_Car->front->next; } coutdata.license_platefront->next=p->next; //删除结点 delete p; if(Road_Car->front->next==NULL)//若便道只有一辆车,出队后便道为空 Road_Car->rear=Road_Car->front; if(BufferCar->front!=BufferCar->rear)//辅助队列不为空,即有车让路 { BufferCar->rear->next=Road_Car->front->next; Road_Car->rear=Road_Car->front; Road_Car->rear->next=BufferCar->front->next; Road_Car->rear=BufferCar->rear; BufferCar->rear=BufferCar->front; cout>ch; welcome(); }

//显示停车场停车状态的查询模块 void car_display() { int i=0; //停车位情况 couttop) { coutPark[i].license_plate; if(Park_Car->Park[i].state=='p') coutPark[i].time.hourPark[i].time.min

else {

coutPark[i].time1.hourPark[i].time1.min

coutPark[i].time.hourPark[i].time.min

} i++; } while(ifront==Road_Car->rear) coutfront->next; i=1; while(p) { coutdata.license_plate; coutdata.time1.hourdata.time1.min

p=p->next; i++; } } cout>ch; welcome(); }

3.画出函数的调用关系图。

四、调试分析

1.调试中遇到的问题及对问题的解决方法;

经过两周的设计和开发,停车场管理系统基本开发完毕。其功能基本符合用户需求,能够完成对车辆的管理和查询以及各类相关报表的打印。

对于车辆进去和离开停车场的时间,也进行了完善,具体到了小时和分钟。 该程序给用户提供了选择机会,采用比较友好的界面显示。 但由于设计时间较短,该系统仍有不尽人意的地方,如不同类型车辆收费情况不够完善等。

五、使用说明及测试结果

(1)使用说明

程序操作简单,在车辆到来时,选择【C 】,然后根据提示输入车牌号及当前时刻;有车要走时,选择【L 】,然后根据提示输入此时时刻;要查询停车场信息时,只需选择【S 】; 若退出程序,则选择【Q 】。 (2)测试结果 程序运行时的欢迎界面。

当停车场容量为5时,连续有7辆车到来,牌照号分别为F001、F002、F003、F004、、F005、F006、F007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。

显示停车场信息。

牌照号为F003的汽车从停车厂开走,应显示F005、F004的让路动作和F006从便道到停车位上的动作。(到达和离开时间请自行设定)。

牌照号为F003的汽车从停车厂开走后,显示停车场信息。

六、源程序

#include #include #include #include

#define MAX_PARK 3 /*停车场容量*/ #define Price 0.5 #define price 0.3

typedef struct {

typedef struct /*汽车的类型定义*/ {

char license_plate[10];/*汽车牌照号码,定义为一个字符数组*/ TIME time,time1; char state;

/*time,time1分别表示汽车进入停车场和便道的时刻*/

/*汽车当前状态,p 表示一直停放在停车位上,q 表示一直在便道上等

int hour; int min;

/*停车位收费标准:每分钟每车.5元*/ /*便道收费标准:每分钟每车.3元*/

}TIME;

候,i 表示由便道进入停车位*/ }Car;

typedef struct /*表示停车位的顺序栈*/

Car Park[MAX_PARK]; /*各汽车信息的存储空间*/ int top; /*用来指示栈顶位置的静态指针*/

}ParkStack;

ParkStack *Park_Car,*Buffer_Car; //Park_Car和Buffer_Car分别指向表示停车场和辅助栈的指针变量

typedef struct qnode /*链队列来模拟便道*/ {

Car data; /*各汽车信息的存储空间*/ struct qnode *next;

}Qnode; typedef struct {

Qnode *front, *rear; /*用来指示队头和队尾位置的指针*/ }RoadQueue;

RoadQueue *Road_Car,*BufferCar; //Road_Car和BufferCar 分别指向表示便道和辅助队列的指针变量 char ch;

void car_display();

//顺序栈的初始化

ParkStack *Init_ParkStack() { }

//链队列的初始化

RoadQueue *Init_RoadQueue() {

RoadQueue *q; Qnode *p; q=new RoadQueue; p=new Qnode; if (!q || !p)

return NULL; ParkStack *s; s=new ParkStack; if (s==NULL) { }

s->top=-1;

return s; //申请到新空间,返回栈空间地址 return NULL; //未申请到足够大的存储空间,返回空指针 else

}

}

p->next=NULL; q->front=q->rear=p; return q;

//打印要离开汽车的信息及收费清单 void print(Car car,TIME t) { " ;

}

else if (car.state=='i' ) {

int m,n;

m=(car.time.hour-car.time1.hour)*60+(car.time.min-car.time1.min); n=(t.hour-car.time.hour)*60+(t.min-car.time.min); cout

cout

//车辆由便道进入停车位

cout

每小时每车"

cout

else if (car.state=='q' ) {

cout

cout

cout

//车辆一直在便道等候

cout

cout

//车辆一直停放在停车位

时"

每小时每车"

"

时"

"

}

}

cout

//程序功能介绍和操作提示模块 void welcome() { }

//汽车进入停车场的管理模块 void car_come() {

Car newCar; cout

cout>newCar.license_plate;

if (Park_Car->top

int i;

cout>i; if (i==1) {

cout:" ; cin>>newCar.time1.hour>>newCar.time1.min;

//停车位满,车辆进去便道或开走

cout:" ; cin>>newCar.time.hour>>newCar.time.min; newCar.state='p' ; Park_Car->top++;

Park_Car->Park[Park_Car->top]=newCar; cout

cout>ch;

}

}

}

Qnode *p; p=new Qnode; if (!p) { } else { }

p->data=newCar; p->next=NULL;

Road_Car->rear->next=p; Road_Car->rear=p;

cout

else

cout

cout>ch; welcome();

//汽车离开停车场的管理模块 void car_leave() {

char s[10]; int i; TIME t; cout

cout>s;

for (i=0;itop;i++) {

cout:" ; cin>>t.hour>>t.min; print(Park_Car->Park[i],t); while ( (Park_Car->top) > i )

//该车前面的汽车暂时退出

break ;

//在停车位找到要开走的汽车

//在停车位寻找要开走的汽车

if (strcmp(s,Park_Car->Park[i].license_plate)==0)

if (itop)

}

}

coutPark[i].license_platetop--;

while (Buffer_Car->top>-1) { }

if (Road_Car->front!=Road_Car->rear) //便道有车,则进入停车位 { }

//在停车位未找到要开走的汽车,则在便道寻找 Qnode *p;

p=Road_Car->front->next; Road_Car->front->next=p->next; p->data.state='i' ; p->data.time=t; Park_Car->top++;

Park_Car->Park[Park_Car->top]=p->data; delete p;

if (Road_Car->front->next==NULL)

Road_Car->rear=Road_Car->front;

coutPark[Park_Car->top].license_platetop++;

Park_Car->Park[Park_Car->top]=Buffer_Car->Park[Buffer_Car->top]; Buffer_Car->top--;

coutPark[Park_Car->top].license_plate

//暂时退出的汽车开回停车位

Buffer_Car->top++;

Buffer_Car->Park[Buffer_Car->top]=Park_Car->Park[Park_Car->top]; Park_Car->top--;

coutPark[Buffer_Car->top].license_plate

时退出停车场;"

//该车开出停车场

车场的" top+1

进入停车位的" top+1

else {

int k=0; Qnode *p,*r;

p=Road_Car->front->next; r=Road_Car->front->next; while (p) {

k++;

if (strcmp(p->data.license_plate,s)==0)

}

}

}

p=p->next;

//在便道找到该车

if (p) { } else

cout:" ; cin>>t.hour>>t.min; print(p->data,t); while (p!=r) { }

coutdata.license_platefront->next=p->next; delete p;

if (Road_Car->front->next==NULL) { }

//没有找到该车

BufferCar->rear->next=Road_Car->front->next; Road_Car->rear=Road_Car->front;

Road_Car->rear->next=BufferCar->front->next; Road_Car->rear=BufferCar->rear; BufferCar->rear=BufferCar->front; coutrear=Road_Car->front;

//若便道只有一辆车,出队后便道为空 //删除结点

coutdata.license_platefront->next=r->next; r->next=NULL;

BufferCar->rear->next=r; BufferCar->rear=r; r=Road_Car->front->next;

//该车前面有车,前面的车要让路

if (BufferCar->front!=BufferCar->rear)//辅助队列不为空,即有车让路

cout

cout>ch; welcome();

//显示停车场停车状态的查询模块 void car_display() {

//停车位情况

couttop) { }

while (i

//便道上的情况

coutfront==Road_Car->rear) { }

cout>ch; welcome();

Qnode *p;

p=Road_Car->front->next; i=1; while (p) { }

coutdata.license_plate;

coutdata.time1.hourdata.time1.minnext; i++;

cout

cout

coutPark[i].license_plate; if (Park_Car->Park[i].state=='p' )

coutPark[i].time.hour

" Park[i].time.min

else { } i++;

coutPark[i].time1.hour

coutPark[i].time.hourPark[i].time.min

" Park[i].time1.min

"

//主函数模块 void main() { }

cout

while ( ch!='q' && ch!='Q' ) { }

cout

cout

if ( ch=='c' || ch=='C' ) { }

cout>ch;

car_come(); car_leave(); car_display();

else if ( ch=='l' || ch=='L' ) else if ( ch=='s' || ch=='S' ) else

//初始化表示停车场的顺序栈

Buffer_Car=Init_ParkStack(); //初始化辅助栈

//初始化表示便道的链队列 //初始化辅助队列


相关内容

  • 住宅小区升降横移立体停车库的设计_本科毕业设计说明书
    河北联合大学轻工学院 QINGGONG COLLEGE, HEBEI UNITED UNIVERSITY 毕业设计说明书 设计(论文)题目:住宅小区升降横移立体停车库的设计 摘 要 随着我国经济的快速发展,城市车辆快速增加,停车难问题日益加 ...
  • 校园联网监控解决方案
    平安校园监控解决方案 浙江大华技术股份有限公司 浙江大华技术股份有限公司 1/27 目录 1 需求分析 .................................................................... ...
  • 交通灯课程设计内容
    硬件大型实验周设计说明书11.1引言设计背景 自从 1886 两个德国人发明了第一辆汽车交通灯改变了交通路况,交通问题也渐渐被人们所重视.从英国伦敦街头的第一个以燃煤气为光源的红,蓝两色的机械 扳手式信号灯,到现在以电为光源的红黄绿三色交通 ...
  • 春雷煤矿安全应急演练实施方案
    正安县格林镇春雷煤矿 应急演练实施方案 编 制:盛 廷 余 生产矿长:陈 培 安全矿长:熊 太 平 机电矿长:冉 合 奇 总工程师:盛 廷 余 常务矿长:黄 见 矿 长:何 德 金 编制日期:2013年1月1日 会审意见 1 应急演练规划 ...
  • MM420变频器实验指导书
    实验一 MM420变频器的快速调试 一.实验目的 1.掌握MM420变频器基本参数输入的方法. 2.掌握MM420变频器参数恢复为出厂默认值的方法. 3.掌握快速调试的内容及方法. 4. 设置电动机参数 三.实验内容 1.变频器基本操作面板 ...
  • 电子监控系统方案书
    **基地电子监控系统设计 组织施工设计方案书 设计单位: 日 期: 一.电子监控系统简介 数字监控系统是由传统闭路电视监控系统(简称CCTV 系统)发展而来的,是信息时代发展的产物.当今数字监控系统采用了4C 技术,即计算机技术.显示技术. ...
  • 化工仿真软件发展的技术趋向
    化工仿真发展的技术趋向 许正宇 中国化工信息中心, 北京(100029) 摘 要:本文回顾了三十年来化工过程的模拟技术的发展过程.阐述了新一代仿真模拟软件发展和集成的方向.仿真模拟软件发展的趋势是采用更加开放式的环境.稳态模拟和动态模拟的结 ...
  • 楼宇智能设计方案
    目 录 第六章.系统总体设计方案 ....................................................................................................... ...
  • 出租车计费器的设计
    EDA 课 程 设 出租车计费器的设计 小组成员:XXX 计 目录 摘要................................................................ 3 关键词.............. ...