停车场管理系统.docx
《停车场管理系统.docx》由会员分享,可在线阅读,更多相关《停车场管理系统.docx(13页珍藏版)》请在冰豆网上搜索。
停车场管理系统
《数据结构》
课程设计报告
课程设计题目:
停车场管理系统
学生姓名
专业
班级
指导教师
2014年06月20日
一课程设计目的
设计停车场管理系统,运用栈与队列,设计函数。
实现车来车去计费计时的功能。
设计了解掌握栈与队列及其他知识。
二题目简介
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
三流程图或模块图
四程序清单和运行结果
代码部分:
//头文件
#include
#include
#include
#include
//常量定义
#defineMAX_STOP4//定义停车场最大停车数
#defineTIME_COUNT"秒"//定义时间单位
#defineTIME_MS_TO_CONUT1000//定义时间进制,意为由TIME_COUNT到毫秒的进制
#defineUNIT_PRICE1//定义单位时间收费标准
//定义存储汽车信息的结构体
typedefstruct
{
charlicense[20];//汽车牌照号码,定义为一个字符指针类型
charstate;//汽车当前状态,字符p表示停放在停车位上,字符s表示停放在便道上,每辆车的初始状态用字符i来进行表示
inttime;//汽车停入停车场时的时间,用来计时收费
}Car;
//定义模拟停车场的栈结构
typedefstruct
{
Carcar[MAX_STOP];//汽车信息的存储空间
inttop;//用来指示栈顶位置的静态指针
}Stack;
//定义模拟便道的队列结构
typedefstructQNode
{
CarWAIT;//汽车信息的存储空间
structQNode*next;//用来指示队列位置的动态指针
}QNode;//链队列节点的类型
//定义链队列的收尾指针
typedefstruct
{
QNode*front,*rear;
}Queue;//将头尾指针封装在一起的链队
/*************************以下为栈操作********************************/
//初始化栈
voidInitStack(Stack&stack)
{
stack.top=-1;
}
//判栈空
intStackEmpty(Stackstack)
{
if(stack.top==-1)
return1;
else
return0;
}
//判栈满
intStackFull(Stackstack)
{
if(stack.top==MAX_STOP-1)
return1;
else
return0;
}
//入栈
voidStackPush(Stack&stack,char*license,intstop_time)
{
stack.top++;//栈队自加
strcpy(stack.car[stack.top].license,license);//复制出车牌号给记录栈顶车牌指针
stack.car[stack.top].state='p';//记录汽车的停车状态
stack.car[stack.top].time=stop_time;//记录汽车的停车时间
}
//出栈返回栈顶指针
intStackPop(Stack&stack)
{
if(StackEmpty(stack))//判断栈的长度,返回1执行
return0;//返回1执行
else
returnstack.top--;//返回0执行,栈顶指针自减,
}
//取栈顶元素
intStackTop(Stackstack,char*license,int&time)
{
if(StackEmpty(stack))//判断栈的长度,返回1执行
return0;
else
{
strcpy(license,stack.car[stack.top].license);//栈顶车牌赋值给license指针
time=stack.car[stack.top].time;//栈顶的停车时间赋值给time
return1;
}
}
//显示所有
voidDisplay(Stackstack)
{
if(stack.top==-1)//判断栈空
printf("停车场为空\n");
else
{
while(stack.top!
=-1)
{
printf("车牌号为:
%s",stack.car[stack.top].license);
printf(",停在%d号车位上",stack.top+1);
printf(",停车时间为%d秒\n",(GetTickCount()-stack.car[stack.top].time)/TIME_MS_TO_CONUT);
stack.top--;
}
}
}
/********************队列操作***********************************/
//初始化队列
voidInitList(Queue*&queue)
{
queue=(Queue*)malloc(sizeof(Queue));//创建队的内存单位
queue->front=queue->rear=NULL;//空队
}
//判队空
intEmpty_LQueue(Queue*q)
{
if(q->front==NULL)
return1;
else
return0;
}
//判队长度返回队长
intQueueLength(Queue*q)
{
QNode*p=q->front;
inti=0;
while(p!
=NULL)
{
i++;
p=p->next;
}
returni;
}
//入队
voidIn_LQueue(Queue*&queue,char*license)
{
QNode*tmp;
tmp=(QNode*)malloc(sizeof(QNode));//创建链队内存空间
strcpy(tmp->WAIT.license,license);//将数据写入节点
tmp->WAIT.state='s';//写入停车信息
tmp->WAIT.time=GetTickCount();//写入停车时间
tmp->next=NULL;
if(Empty_LQueue(queue))
queue->front=queue->rear=tmp;
else
{
//队非空插入队尾
queue->rear->next=tmp;
queue->rear=tmp;
}
}
//出队成功返回1队空返回0
intOut_LQueue(Queue*&queue,char*license)
{
QNode*tmp;
if(Empty_LQueue(queue))//如果队空返回0
return0;
tmp=queue->front;
strcpy(license,tmp->WAIT.license);//取出队头元素
if(queue->front==queue->rear)//队中只有一个元素
queue->front=queue->rear=NULL;//删除元素
else
queue->front=queue->front->next;//队头指针后移
free(tmp);//释放指针
return1;
}
/*******************************************************************/
//有车到来时的操作
voidCar_Is_Coming(Stack&stack,Queue*&queue)
{
//定义变量
charlicense[20];
printf("请输入车辆的车牌号码:
");
scanf("%s",&license);
//判断停车场是否已满,满则进入便道,不满进入停车场
if(StackFull(stack))
{
In_LQueue(queue,license);//进入便道
printf("停车场已满请在便道等候,您的位置为%d\n",QueueLength(queue));
}
else
{
StackPush(stack,license,GetTickCount());//进入停车场
printf("请进入停车场中的%d号停车位\n",stack.top+1);
}
}
//检查离开的车是否在停车场中返回车在停车场中位置不在则返回0
intLeaveCheck(Stackstack,char*license)
{
intflag=stack.top+1;//定义变量记录当前车在停车场中位置
if(StackEmpty(stack))
return0;
else
{
//查找离开车所在位置
while(stack.top!
=-1&&strcmp(stack.car[stack.top].license,license)!
=0)
{
flag--;
stack.top--;
}
returnflag;
}
}
//有车离开时的操作
voidCar_Is_Leaving(Stack&stack,Queue*&queue)
{
//定义变量
StacktmpStack;//定义临时停车场
charleave_license[20];//要离开的车牌号
charlicense[20];//存放从停车场中读出来的车牌信息
inttime;
InitStack(tmpStack);//初始化临时停车场
//判断停车场中是否有车
if(StackEmpty(stack))
{
printf("当前停车场中没有车\n");
return;//退出子函数
}
printf("请输入要离开的车牌照:
");
scanf("%s",&leave_license);
if(LeaveCheck(stack,leave_license))//判断车是否在停车场中
{
//车在停车场中
printf("您的车在%d号车位上\n",LeaveCheck(stack,leave_license));
while(StackTop(stack,license,time)
&&(strcmp(stack.car[stack.top].license,leave_license)!
=0))
{
strcpy(stack.car[stack.top].license,license);
printf("牌照为%s的车暂时退出停车场%d号位\n",license,stack.top+1);
StackPush(tmpStack,license,time);//停车场中的车暂时退出进入临时停车场
StackPop(stack);//出栈
}
printf("牌照为%s的车离开停车场%d号位\n",license,stack.top+1);
printf("您在停车场中停了%d秒\n",(GetTickCount()-time)/TIME_MS_TO_CONUT);
printf("应缴费用为%d元\n",(GetTickCount()-time)/TIME_MS_TO_CONUT*UNIT_PRICE);
StackPop(stack);//出栈
//将临时停车场中的车停回停车场
while(StackEmpty(tmpStack)!
=1)
{
StackTop(tmpStack,license,time);
StackPush(stack,license,time);
printf("牌照为%s的车进入停车场%d号位\n",license,stack.top+1);
license[0]='\0';
StackPop(tmpStack);
}
if(stack.top+1==MAX_STOP-1)//判断车离开前停车场是否停满
{
if(QueueLength(queue))//如果停满则判断便道上是否有车
{
//便道中有车则从便道中停入停车场
Out_LQueue(queue,license);//出队
StackPush(stack,license,GetTickCount());//入栈
printf("在便道中牌照为%s的车进入停车场%d号位\n",license,stack.top+1);
}
}
}
else
//车不在停车场中
printf("您的车不在停车场中!
\n");
}
voidmain()
{ //定义变量
Stackparking;
Queue*sidewalk=NULL;
char*choice=newchar;
intsel=11;//定义一个变量判断是否退出
//初始化一个为空的停车场
InitStack(parking);
//初始化一个为空的便道
InitList(sidewalk);
//运行界面及功能选择
while(sel)
{
printf("---------------------------\n");
printf("停车场模拟管理系统\n");
printf("1车来\n");
printf("2车走\n");
printf("3查看\n");
printf("0退出\n");
printf("----------------------------\n");
printf("请选择操作:
");
scanf("%d",&sel);
switch(sel){
case0:
return;
case1:
Car_Is_Coming(parking,sidewalk);
break;
case2:
Car_Is_Leaving(parking,sidewalk);
break;
case3:
Display(parking);
break;
default:
printf("请正确输入选项!
");
break;
}
}
}
运行结果
五 小结(收获和体会)
通过此次数据结构的课程设计,我对程序的编程,编译,执行等有了更深的认识。
理解到思路对于一个程序的重要性,在整个设计过程中,遇到了很多不同的问题,但通过尝试,努力和老师的帮助最终都解决了,感到很有成就感。
从中,我意识到程序的成功不仅仅是消除语法上的错误,而且还要执行成功。
缺乏完整的思路,尽管语法正确,程序还是无法执行。
数据结构的设计考验的不仅仅是我们对书本知识的理解,还考验了我们分析事物时思维的逻辑紧密性,加深并巩固了我对数据结构的认识。
总的来说,这次的数据结构课程设计加深了我对数据结构的认识,也学到了相关的知识,并且巩固了课堂上所学的知识,还锻炼了实践的应用操作能力,感受颇深,也收获了成功的喜悦。