停车场管理1.docx
- 文档编号:7409485
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:18
- 大小:239.15KB
停车场管理1.docx
《停车场管理1.docx》由会员分享,可在线阅读,更多相关《停车场管理1.docx(18页珍藏版)》请在冰豆网上搜索。
停车场管理1
中国地质大学(武汉)
C语言课程设计论文
学院计算机学院
专业网络工程
题目停车场管理1
班级193092班
姓名张昌凯
学号20091003752
指导老师张冬梅
2010年6月29日
目录
1.中文摘要…………………………………………………………3
2.设计提示…………………………………………………………3
3.总体设计…………………………………………………………3
4.数据结构设计……………………………………………………4
5.详细设计…………………………………………………………5
主函数main……………………………………………………5
arrive函数………………………………………………………6
leave函数………………………………………………………7
公共函数…………………………………………………………8
6.运行插图……………………………………………………9
7.总结及感想…………………………………………………11
8.源代码………………………………………………………11
9.参考文献……………………………………………………15
停车场管理1
摘要
设有一个可以停放n辆车的狭长停车场,它只有一个大门可以供车辆进出,车辆按到达停车时间的早晚一次从停车场最里面向大门口停放(最先到达的一辆车停在最里面)。
如果停车场已放满n辆车,则后来的车辆只能够在停车场大门外等候的便道上等候,一旦停车场内有车开出,则排在停车场的第一辆车就进入停车场,停车场内如有某辆车要开走,在它之后进来的车辆必须先退出停车场为它让路,待其开出停车场后,这些车辆再按原来的次序进场,每辆车在离开停车场时,都应根据它在停车场内停留时间长短缴费。
如果停留在便道上的车辆未进入停车场就要离去,允许其离去,且不需要交费,并且其他在便道上等候的车辆的次序不变。
编制一程序模拟停车场管理。
1.【提示】
汽车模拟输入信息格式可以是:
到达/离去,汽车牌照号码,到达/离去的时刻。
EX:
(’A’,1,5)表示1号牌照车在5这个时刻到达,而(’D’,5,20)表示5号车牌车在20时刻离开,(’E’,0,0)表示退出程序。
基本要求:
要求程序输出每辆车到达后的停放位置(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和它在停车场停留的时间。
根据题目要求,停车场可以用一个长度为n的堆栈来模拟,由于停车场内如果有某辆车要开走,在它之后进来的车辆都必须先退出停车场为它让路,待其离开停车场后,这些车辆再依原来的次序进入停车场。
所以可以设计两个堆栈。
2.总体设计
3.数据结构设计
(1)为了便于区分每辆车并了解每辆车当前所处的位置,需要记录汽车的牌照号码和汽车当前的状态。
typedefstruct
{
intcar_num;
inttime;
}car_info;
(2)为了便于停车场管理,要为每一个车位分配一个固定的编号。
typedefstruct
{
car_info*base;
car_info*top;
statusstacksize;
}sqstack;
(3)当停车场的停车位上都已停满车,又有新的车到来时要把它调度到便道上,便道上的车辆要按照进入便道的先后顺序顺次序放在便道上。
为便道上的每个位置分配一个固定的编号。
当有车从停车位上离开的时候。
便道上第一辆汽车就立即进入停车位上的某个车位。
typedefstructQnode
{
intcar_num;
inttime;
structQnode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
intlenth;
}LinkQueue;
(4)当某辆车离开停车场的时候,比它后进停车位的的车要为它让路,而且当它开走之后让路的车还要按照原来的停放顺序再次进入停车位的某个位子。
(要利用下面介绍的函数模块进行实现)
leave(sqstack*tcc,sqstack*dcc,LinkQueue*p,car_infoa,floatpay)
{
car_infox,ss;
QueuePtrb;
intfind=1,arrivetime=0;
floatcost=0.0;
while(find)
{
ss=pop(tcc);
push(dcc,ss);
if(ss.car_num==a.car_num)
{
find=0;
cost=(a.time-ss.time)*pay;
arrivetime=ss.time;
}
}
pop(dcc);//把临时堆栈的第一辆车(要离开的)去掉;
while(dcc->stacksize)
{
x=pop(dcc);
push(tcc,x);
}
if(tcc->stacksize<2&&p->lenth!
=0)
{
b=DeQueue(p);
x.car_num=b->car_num;
x.time=b->time;
push(tcc,x);
printf("车牌号为%d的车辆由便道进入停车场%d号车道\n",x.car_num,tcc->stacksize);
}
4.详细设计
(1).主函数
在主函数中设计出程序功能介绍和操作提示模块,然后利用switch函数选择程序中车辆是进入,离开还是退出程序。
voidmain()//主函数
{sqstacktcc,dcc;
LinkQueuep;
car_infoa;
intsum=1000,n;
floatpay;
charsign;
printf("\n|************************停车场管理**************************|\n");
printf("|******A/a:
车辆到达*******D/d:
车辆离开******E/e:
推出系统*****|\n\n");
Initstack(&tcc);
Initstack(&dcc);
InitQueue(&p);
printf("请先输入停车场的车位总数,收费标准(元/小时):
");
scanf("%d%f",&n,&pay);
getchar();
printf("\n请输入A/D/E,车牌号,时刻:
");
scanf("%c%d%d",&sign,&a.car_num,&a.time);
getchar();
while(sum)
{
switch(sign)
{
case'a':
case'A':
arrive(&tcc,&p,a,n);break;
case'D':
case'd':
leave(&tcc,&dcc,&p,a,pay);break;
case'e':
case'E':
exit(OVERFLOW);break;
}
printf("\n请输入A/D/E,车牌号,时刻:
");
scanf("%c%d%d",&sign,&a.car_num,&a.time);
getchar();
sum--;
}
}
(2)arrive函数
设计一个arrive函数表示车辆到达时车辆的停放的位置以及进入的时间;
voidarrive(sqstack*s,LinkQueue*p,car_infoa,intn)
{
if(s->stacksize { push(s,a); printf("\n车牌号为%d的车辆进入停车场%d号车道\n",a.car_num,s->stacksize); } else { EnQueue(p,&a); printf("\n停车场已满,车牌号为%d的车辆停在便道的%d号位置\n",a.car_num,p->lenth); } } (3)leave函数 设计一个leave函数表示车辆离开时的车牌号码、进站时刻、出站时刻、停留时间、和停车费用。 voidleave(sqstack*tcc,sqstack*dcc,LinkQueue*p,car_infoa,floatpay) { car_infox,ss; QueuePtrb; intfind=1,arrivetime=0; floatcost=0.0; while(find) { ss=pop(tcc); push(dcc,ss); if(ss.car_num==a.car_num) { find=0; cost=(a.time-ss.time)*pay; arrivetime=ss.time; } } pop(dcc);//把临时堆栈的第一辆车(要离开的)去掉; while(dcc->stacksize) { x=pop(dcc); push(tcc,x); } if(tcc->stacksize<2&&p->lenth! =0) { b=DeQueue(p); x.car_num=b->car_num; x.time=b->time; push(tcc,x); printf("车牌号为%d的车辆由便道进入停车场%d号车道\n",x.car_num,tcc->stacksize); } printf("\n**********************************************\n"); printf("|车牌号码|进站时刻|出站时刻|停留时间|停车费用|\n"); printf("|%-6d|%-6d|%-6d|%-6d|%-6.2f|\n",a.car_num,arrivetime,a.time,a.time-arrivetime,cost); printf("**********************************************\n"); } (4)公共函数 此函数中的函数包括如下模块: 1.栈的初始化函数(包括申请空间) voidInitstack(sqstack*s) { s->base=(car_info*)malloc(STACK_INIT_SIZE*sizeof(car_info)); if(! s->base)exit(OVERFLOW); s->top=s->base; s->stacksize=0; } 2.进栈操作函数 voidpush(sqstack*s,car_infoe)//进站函数 { *s->top++=e; s->stacksize++; } 3.出栈操作函数 car_infopop(sqstack*s) {car_infoe; if(s->top==s->base) {printf("停车场内没有该车辆! \n"); exit(0);} e=*--s->top; s->stacksize--; returne; } 4.队列的初始化函数(申请空间) statusInitQueue(LinkQueue*Q) { Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode)); if(! Q->front)exit(OVERFLOW); Q->front->next=NULL; Q->lenth=0; returnOK; } 5.进队列函数 voidEnQueue(LinkQueue*Q,car_info*a) { QueuePtrp; p=(QueuePtr)malloc(sizeof(QNode)); if(! p)exit(OVERFLOW); p->car_num=a->car_num; p->time=a->time; p->next=NULL; Q->rear->next=p; Q->rear=p; Q->lenth++; } 6.出对列函数 QueuePtrDeQueue(LinkQueue*Q) {QueuePtrp,e,s={0}; if(Q->front==Q->rear) {printf("便道上没有车辆! \n");returns;} p=Q->front->next; e=p; Q->front->next=p->next; Q->lenth--; if(Q->rear==p)Q->front=Q->rear; //free(p); returne; } 5.运行插图 编译运行第一步 输入车辆进入相关信息后的抓图 当有车辆离开的时候的抓图 6.总结及感想 该程序设计所用到的知识是我们没有学过的,通过这次课程设计使得我的自学能力进一步加强,并且了解了一部分C的数据结构,包括堆栈、队列以及其它的一些相关知识; 通过该程序的设计,让我对利用函数进行模块化设计的思想有了更深刻的理解,并且对整个编程的思想有了初步梗概的了解。 7.源代码 #defineOVERFLOW-2 #defineOK1 #defineERROR0 #defineSTACK_INIT_SIZE1 typedefintstatus; #include #include #include #include typedefstruct {intcar_num; inttime; }car_info; typedefstruct { car_info*base; car_info*top; statusstacksize; }sqstack; voidInitstack(sqstack*s) { s->base=(car_info*)malloc(STACK_INIT_SIZE*sizeof(car_info)); if(! s->base)exit(OVERFLOW); s->top=s->base; s->stacksize=0; } voidpush(sqstack*s,car_infoe)//进站函数 { *s->top++=e; s->stacksize++; } car_infopop(sqstack*s) {car_infoe; if(s->top==s->base) {printf("停车场内没有该车辆! \n"); exit(0);} e=*--s->top; s->stacksize--; returne; } typedefstructQnode { intcar_num; inttime; structQnode*next; }QNode,*QueuePtr; typedefstruct { QueuePtrfront; QueuePtrrear; intlenth; }LinkQueue; statusInitQueue(LinkQueue*Q) { Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode)); if(! Q->front)exit(OVERFLOW); Q->front->next=NULL; Q->lenth=0; returnOK; } voidEnQueue(LinkQueue*Q,car_info*a) { QueuePtrp; p=(QueuePtr)malloc(sizeof(QNode)); if(! p)exit(OVERFLOW); p->car_num=a->car_num; p->time=a->time; p->next=NULL; Q->rear->next=p; Q->rear=p; Q->lenth++; } QueuePtrDeQueue(LinkQueue*Q) {QueuePtrp,e,s={0}; if(Q->front==Q->rear) {printf("便道上没有车辆! \n");returns;} p=Q->front->next; e=p; Q->front->next=p->next; Q->lenth--; if(Q->rear==p)Q->front=Q->rear; //free(p); returne; } voidarrive(sqstack*s,LinkQueue*p,car_infoa,intn) { if(s->stacksize { push(s,a); printf("\n车牌号为%d的车辆进入停车场%d号车道\n",a.car_num,s->stacksize); } else { EnQueue(p,&a); printf("\n停车场已满,车牌号为%d的车辆停在便道的%d号位置\n",a.car_num,p->lenth); } } voidleave(sqstack*tcc,sqstack*dcc,LinkQueue*p,car_infoa,floatpay) { car_infox,ss; QueuePtrb; intfind=1,arrivetime=0; floatcost=0.0; while(find) { ss=pop(tcc); push(dcc,ss); if(ss.car_num==a.car_num) { find=0; cost=(a.time-ss.time)*pay; arrivetime=ss.time; } } pop(dcc);//把临时堆栈的第一辆车(要离开的)去掉; while(dcc->stacksize) { x=pop(dcc); push(tcc,x); } if(tcc->stacksize<2&&p->lenth! =0) { b=DeQueue(p); x.car_num=b->car_num; x.time=b->time; push(tcc,x); printf("车牌号为%d的车辆由便道进入停车场%d号车道\n",x.car_num,tcc->stacksize); } printf("\n**********************************************\n"); printf("|车牌号码|进站时刻|出站时刻|停留时间|停车费用|\n"); printf("|%-6d|%-6d|%-6d|%-6d|%-6.2f|\n",a.car_num,arrivetime,a.time,a.time-arrivetime,cost); printf("**********************************************\n"); } voidmain()//主函数 {sqstacktcc,dcc; LinkQueuep; car_infoa; intsum=1000,n; floatpay; charsign; printf("\n|************************停车场管理**************************|\n"); printf("|******A/a: 车辆到达*******D/d: 车辆离开******E/e: 推出系统*****|\n\n"); Initstack(&tcc); Initstack(&dcc); InitQueue(&p); printf("请先输入停车场的车位总数,收费标准(元/小时): "); scanf("%d%f",&n,&pay); getchar(); printf("\n请输入A/D/E,车牌号,时刻: "); scanf("%c%d%d",&sign,&a.car_num,&a.time); getchar(); while(sum) { switch(sign) { case'a': case'A': arrive(&tcc,&p,a,n);break; case'D': case'd': leave(&tcc,&dcc,&p,a,pay);break; case'e': case'E': exit(OVERFLOW);break; } printf("\n请输入A/D/E,车牌号,时刻: "); scanf("%c%d%d",&sign,&a.car_num,&a.time); getchar(); sum--; } } 参考文献: 《CPrimerPlus》(关于typedef的用法) 《数据结构—使用C语言(第二版)》 《C程序设计(第三版)》
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 停车场 管理