C语言课程设计报告停车场管理系统Word文档下载推荐.docx
《C语言课程设计报告停车场管理系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告停车场管理系统Word文档下载推荐.docx(28页珍藏版)》请在冰豆网上搜索。
编制一程序模拟停车场管理。
[提示]
汽车的模拟输入信息格式可以是:
(到达/离去,汽车牌照号码,到达/离去时刻)。
例如:
(’A’,1,5)表示1号牌照车在5这个时刻到达,而(’D’,5,20)表示5号牌照车在20这个时刻离去,整个程序可以在输入信息为(’E’,0,0)时结束。
基本要求:
要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交的费用和它在停车场内停留的时间。
根据题目要求,停车场可以用一个长度为n的堆栈来模拟。
由于停车场内如有某辆车要开走,在它之后进来的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
所以可以设两个堆栈。
二、题目分析
由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列。
由此很容易联想到用结构体数组来存储车库信息。
又每个汽车的车牌号都不一样,这样一来就可以根据车牌号准确找到汽车位置。
当停车场内某辆车要离开时,在他之后进入的汽车必须再按原次序进入车库。
这是一个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个结构体数组,用来暂时存放为出站汽车暂时让道的汽车车牌号。
当车库满后,继续进来的汽车需要停放在车库旁边的便道上等候,若车库满后,继续进来的汽车需要停放在车库旁边的便道上等候,若车有汽车开走,这完全是一个先进先出模型,因此可以设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。
另外,停车场是根据汽车在停车场内停放的总长来收费的,在便道上的时间不计费,因此必须记录车辆进入车库时的时间,车辆离开车库时的时间不需要记录,当从终端输入时可直接使用。
另外,题目提示中的表示方法[(’A’,1,5)表示1号牌照车在5这个时刻到达]有两点不好;
一、对用户友好程度不高,用起来并不方便;
二、不接近实际情况,生活中表示时间的格式为“--:
--”,完全可以建立一个时间结点来实现。
因此,实际编程中将对这一方面予以优化。
三、数据结构说明
根据题意,停车场中的空间分为车库和便道。
这里用结构体来模拟车库和便道,按照从端读入数据序进行管理。
模拟车库和模拟便道中分别用结构体数组和链表来存储车辆信息。
模拟车库和模拟便道的数据结构如下表1和表2所示:
Moni_cheku
结构体
CarNode*stack[MAX+1]
结构体数组
charnum[10]
Timereach
inthour
intmin
Timeleave
inttop
表1模拟车库的数据结构
Moni_biandao
QueueNode
*head
链表
CarNode*data
数组
charnum[10]
Structcar*next
QueueNode*rear
表2模拟便道的数据结构
用C语言实现这一部分为:
typedefstructtime
{
inthour;
intmin;
}Time;
/*时间结点*/
typedefstructnode
charnum[10];
Timereach;
Timeleave;
}CarNode;
/*车辆信息结点*/
typedefstructNODE
CarNode*stack[MAX+1];
inttop;
}Moni_Cheku;
typedefstructcar
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode
QueueNode*head;
QueueNode*rear;
}Moni_Biandao;
四、各函数算法分析
(1)主函数
voidmain()
Moni_ChekuEnter,Temp;
Moni_BiandaoWait;
intch;
InitStack(&
Enter);
/*初始化车站*/
Temp);
/*初始化让路的临时链表*/
InitQueue(&
Wait);
/*初始化便道*/
printf("
\n"
);
^_^欢迎进入停车场管理系统1!
^_^\n"
提示!
(1).该车库的最大容量为:
%d;
MAX);
(2).该车库的收费标准为:
%4.2f元/(辆*分钟).\n"
price);
while
(1)
{
********************主菜单********************\n"
1.车辆到达"
2.车辆离开"
3.列表显示"
4.退出系统\n"
**********************************************\n"
请选择(1-4):
[]\b\b"
scanf("
%d"
&
ch);
if(ch>
=1&
&
ch<
=4)break;
elseprintf("
错误!
请重选(1-4):
}
switch(ch)
{
case1:
Arrival(&
Enter,&
break;
/*车辆到达*/
case2:
Leave(&
Temp,&
/*车辆离开*/
case3:
List(Enter,Wait);
/*打印列表信息*/
case4:
exit(0);
/*退出主程序*/
default:
break;
}
主菜单
(2)车辆到达函数
intArrival(Moni_Cheku*Enter,Moni_Biandao*W)/*车辆到达*/
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
请输入车牌号(例如:
中CUG888):
"
gets(p->
num);
if(Enter->
top<
MAX)/*车库未满,车进车库*/
Enter->
top++;
该车在车库位置%d.\n"
Enter->
top);
请输入到达时间(**:
**):
%d:
(p->
reach.hour),&
reach.min));
stack[Enter->
top]=p;
return
(1);
else/*车库已满,车进便道*/
该车须在便道等待!
t=(QueueNode*)malloc(sizeof(QueueNode));
t->
data=p;
next=NULL;
W->
rear->
next=t;
rear=t;
(3)车辆离开函数
voidLeave(Moni_Cheku*Enter,Moni_Cheku*Temp,Moni_Biandao*W)/*车辆离开*/
inti,room;
CarNode*p,*t;
QueueNode*q;
/*判断车库内是否有车*/
top>
0)/*有车*/
请输入车在车库的位置(1--%d):
/*输入车辆离开的信息*/
room);
if(room>
room<
=Enter->
top)break;
请重选:
while(Enter->
room)/*车辆离开*/
Temp->
stack[Temp->
top]=Enter->
top];
top]=NULL;
top--;
p=Enter->
while(Temp->
=1)
top]=Temp->
}
PRINT(p,room);
/*判断通道上是否有车及车库是否已满*/
if((W->
head!
=W->
rear)&
Enter->
MAX)/*便道的车辆进入车库*/
q=W->
head->
next;
t=q->
data;
\n便道的%s号车进入车场第%d位置."
t->
num,Enter->
\n请输入现在的时间(**:
(t->
next=q->
if(q==W->
rear)W->
rear=W->
head;
top]=t;
free(q);
\n便道里没有车.\n"
车库里没有车!
/*没车*/
(4)列表显示函数
voidList(Moni_ChekuS,Moni_BiandaoW)
intflag,tag;
flag=1;
while(flag)
**********查看**********\n"
1.车库2.便道3.返回\n"
************************\n"
请选择(1-3):
tag);
f(tag>
tag<
=3)break;
请重选(1-3):
switch(tag)
List1(&
S);
/*列表显示车库信息*/
List2(&
W);
/*列表显示便到信息*/
flag=0;
voidList1(Moni_Cheku*S)/*列表显示车库信息*/
inti;
if(S->
0)/*判断车库内是否有车*/
车库:
\n位置到达时间车牌号\n"
for(i=1;
i<
=S->
top;
i++)
%d"
i);
%d:
%d"
S->
stack[i]->
reach.hour,S->
reach.min);
puts(S->
车库里没有车\n"
voidList2(Moni_Biandao*W)/*列表显示便道信息*/
QueueNode*p;
p=W->
if(W->
rear)/*判断便道上是否有车*/
在便道里等待的车辆的号码为:
while(p!
=NULL)
puts(p->
data->
p=p->
便道里没有车.\n"
五、程序测试
(1)测试信息对错误的处理
(2)进入2辆车,进入车库,道上无车,并进行列表显示。
(3)再进入3辆车,第一辆车进车库,后2辆车在便道等待,同时输出等待的提示作息,最后列表显示以查寻结果,此时车库已满,便道上有2辆车在等待。
(4)离开停车位1和停车位2上的2辆车,同时输入它们离开的时间,并计算它们的应交费用。
离开后,车库里便有空出2个停车位,这时便道里的前2辆车就可进入车库,便道里的进入车库里要记录它们进去的时间,开始计时收费。
说明:
该系统仍可继续工作,随时在主菜单中选择4便可退出系统。
六、课程设计感悟与收获
(1)在此次课程设计中第一次真正体会到了编程的感觉,当投入其中时,感觉不到时间的流逝,只有突然会发现一个下午或是一个晚上过去了。
(2)由于课本上只介绍了数组、结构体、链表的用法,而此次课程设计中要用到堆、栈、队列的知识,因此我利用课余时间查找这方面的内容,通过自学不仅了解到了一些这方面的知识,还锻炼了自己的自学能力。
(3)这次课程设计不同于平时的练习,平时的练习都是一些小程序,虽然知道模块化
编程的好处,但从没有这一次体会得深。
七、源代码
#include<
stdio.h>
stdlib.h>
string.h>
#defineMAX3/*车库容量*/
#defineprice0.5/*每车每分钟费用*/
voidInitStack(Moni_Cheku*);
/*初始化车库*/
intInitQueue(Moni_Biandao*);
intArrival(Moni_Cheku*,Moni_Biandao*);
voidLeave(Moni_Cheku*,Moni_Cheku*,Moni_Biandao*);
voidList(Moni_Cheku,Moni_Biandao);
/*显示车库和便道的存车信息*/
voidInitStack(Moni_Cheku*s)/*初始化车库*/
s->
top=0;
for(i=0;
=MAX;
stack[s->
intInitQueue(Moni_Biandao*Q)/*初始化便道*/
Q->
head=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->
rear=Q->
elsereturn(-1);
voidPRINT(CarNode*p,introom)/*输出出库车的信息*/
intA1,A2,B1,B2;
请输入离开的时间:
/**:
**/"
leave.hour),&
leave.min));
离开车辆的车牌号为:
其到达时间为:
%d\n"
p->
reach.hour,p->
离开时间为:
leave.hour,p->
leave.min);
A1=p->
reach.hour;
A2=p->
reach.min;
B1=p->
leave.hour;
B2=p->
leave.min;
应交费用为:
%4.2f元"
((B1-A1)*60+(B2-A2))*price);
free(p);
n