数据结构课程设计停车场.docx
- 文档编号:9270902
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:28
- 大小:564.42KB
数据结构课程设计停车场.docx
《数据结构课程设计停车场.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计停车场.docx(28页珍藏版)》请在冰豆网上搜索。
数据结构课程设计停车场
数据结构课程设计——停车场管理
一、需求分析:
1、问题描述:
设停车场是一个可停放n辆汽车的狭长通道,且只有一个门可供出入。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆汽车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原顺序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
应用个简单的栈与队列实现该功能。
2、基本要求
(1)以顺序栈模拟停车场,以链队列模拟便道。
(2)当车辆到达时,输入车辆车牌号、达到时间,得到车辆在停车场的位置。
车牌号格式要正确,达到时间为00:
00到24:
00之间。
(3)当车辆离开时,输入车辆在停车场位置及离开时间,离开时间应在该车进入时间之后。
等待车辆按顺序进入停车场,并输入进入时间,进入时间应在上辆离开车辆离开时间之后。
(4)打印出离开车辆的车牌号、到达时间、离开时间、停留时间及应缴费用。
(5)显示停车场和便道车辆信息。
二、概要设计
1、数据结构:
typedefstructtime{
inthour;
intmin;
}Time;/*时间结点*/
typedefstructnode{
charnum[10];
Timereach;
Timeleave;
}CarNode;/*车辆信息结点*/
typedefstructNODE{
CarNode*stack[Max+1];
inttop;
}SeqStackCar;/*模拟车站*/
typedefstructcar{
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;/*模拟通道*/
2、模块
本程序首先定义了用来模拟停车场的堆栈模块和用来模拟便道的链队列模块为全局变量,然后编写主函数,在主函数中实现对其他各个模块的调用。
在进入菜单界面后程序分别调用车辆到达、车辆离开、存车信息、退出这四个模块。
其中车辆离开模块中又调用了打印离开车辆信息的函数,在存车信息模块中有调用了显示停车场车辆信息函数及显示便道车辆信息函数。
最后从调用的四个函数模块回到主函数结束程序运行。
3、流程图:
开始
否
是
车场是否为空
三、详细设计
1.时间结点类型
typedefstructtime
{
inthour;
intmin;
}Time;/*时间结点*/
2.车辆进出站信息类型
typedefstructnode
{
charnum[10];
Timereach;
Timeleave;
}CarNode;/*车辆信息结点*/
3.停车场和便道信息类型
typedefstructNODE
{
CarNode*stack[Max+1];
inttop;
}SeqStackCar;/*模拟车站*/
typedefstructcar
{
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode
{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;/*模拟通道*/
4.初始化,创建栈
voidInitStack(SeqStackCar*,intn);/*声明栈*/
{
inti;
s->top=0;
for(i=0;i<=n;i++)
s->stack[s->top]=NULL;
}
5.初始化,创建一个队列用于便道
intInitQueue(LinkQueueCar*);/*声明便道*/
{
Q->head=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->head!
=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return
(1);
}
elsereturn(-1);
}
6.车辆到达
intArrival(SeqStackCar*,LinkQueueCar*,intn);/*车辆进站*/
{
if(Enter->top {…}else {…} } 7.车辆离开 voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*,intn);/*车辆出站*/ { if(Enter->top>0)/*有车*/ {…}else {…} } 8.显示停车场和便道的存车信息 voidList1(SeqStackCar*S)/*列表显示车场存车信息*/ { if(S->top>0)/*判断车站内是否有车*/ {…}else {…} } voidList2(LinkQueueCar*W)/*列表显示便道信息*/ { if(W->head! =W->rear)/*判断通道上是否有车*/ {…}else…. } 9.主函数 Voidmain() { InitStack(&Enter,n);/*初始化车场*/ InitStack(&Temp,n);/*初始化让路的临时栈*/ InitQueue(&Wait);/*初始化便道*/ while (1){ scanf(...................);//根据提示信息输入想要的操作 } switch(ch){//根据输入的数调用不同的函数 case1: case2: case3: case4: default: break; } } } 四、测试与分析 1.程序运行的界面及为了便于观察,停车场中最多可停2辆车,如下图,是由于车牌号码格式及进出停车场时间上有错误而进行的一次程序运行。 2.下图是规定停车场最多停2辆车,而开来了4辆车的程序运行界面。 3.下图是在第1位置的车辆离开停车场时,该车的车牌号、进出车场时间、停留时间、应缴费用的信息,以及便道上的车辆进入停车场时的信息。 4.下图是在上图的情况下,在停车场和便道上车辆的信息。 5.下图是停车场第2位置上的车辆离开停车场时的所有信息,及便道上第一辆车进入停车场的信息。 五、总结 通过这次课程设计使我充分的理解了用栈和队列实现模拟停车场的基本原理,知道了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会了编写停车场问题的程序。 虽然此次的程序不是很完善,还缺少许多更好的功能,像时间上没有范围,如果车从第一天停到第二天,程序计算上就会出现错误,但是总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学者来说。 在刚开始编程的时候,我感到有点无从下手,觉得把以前课堂上学到的知识运用到实践中还是比较困难,这时我才知道,我的基础还很薄弱,还需要继续努力。 但之后经过对题目的详细分析和思考,还有向他人请教,我知道了具体应该做什么,怎么去做。 尽管在做的时候遇到许多的困难,但经过几天上网及图书馆查找,参考了许多的文献资料,我终于完成这个程序。 我学到了很多东西,这是在课堂上无法做到的,像做课程设计从中我也体会到了课程设计这门课的乐趣,虽然挫折很多,但这也是其乐趣所在,当你解决这些挫折时,心中是很有满足感的。 还有就是光从书上学到的知识而不去实践是不够的,只有能够灵活的把书本上的知识运用到实际中,才可以说是掌了它。 六、附录: 源程序清单: #include #include #include #include #defineMax10 intgetn() { intn; printf("本停车场管理实行24小时制,停车每分钟0.1元.\n"); printf("请输入停车场可容纳的车(最多10辆): "); scanf("%d",&n); fflush(stdin); do{ if(n<1||n>10) { printf("输入的车辆数不在要求范围内,请重新输入! "); scanf("%d",&n); fflush(stdin); } elsebreak; }while(n<1||n>10); returnn; } typedefstructtime { inthour; intmin; }Time;/*时间结点*/ typedefstructnode { charnum[10]; Timereach; Timeleave; }CarNode;/*车辆信息结点*/ typedefstructNODE { CarNode*stack[Max+1]; inttop; }SeqStackCar;/*模拟车站*/ typedefstructcar { CarNode*data; structcar*next; }QueueNode; typedefstructNode { QueueNode*head; QueueNode*rear; }LinkQueueCar;/*模拟通道*/ voidInitStack(SeqStackCar*,intn);/*声明栈*/ intInitQueue(LinkQueueCar*);/*声明便道*/ intArrival(SeqStackCar*,LinkQueueCar*,intn);/*车辆进站*/ voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*,intn);/*车辆出站*/ voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*/ voidInitStack(SeqStackCar*s,intn)/*初始化栈*/ { inti; s->top=0; for(i=0;i<=n;i++) s->stack[s->top]=NULL; } intInitQueue(LinkQueueCar*Q)/*初始化便道*/ { Q->head=(QueueNode*)malloc(sizeof(QueueNode)); if(Q->head! =NULL) { Q->head->next=NULL; Q->rear=Q->head; return (1); } elsereturn(-1); } voidPRINT(CarNode*p)/*打印出站车的信息*/ { intA1,A2,B1,B2; inta,b,c; printf("\n请输入离开的时间: /**: **/"); scanf("%d: %d",&(p->leave.hour),&(p->leave.min)); fflush(stdin); do{ if(p->leave.hour { printf("输入离开时间比进站时间早,请重新输入! \n"); scanf("%d: %d",&(p->leave.hour),&(p->leave.min)); fflush(stdin); } if(p->leave.hour<0||p->leave.hour>=24||p->leave.min<0||p->leave.min>=60) { printf("输入的时间格式有错,请重新输入! "); scanf("%d: %d",&(p->leave.hour),&(p->leave.min)); fflush(stdin); } elsebreak; }while(p->leave.hour printf("车场现在有一辆车离开,请便道里的第一辆车进入车场! \n"); printf("出站的车的车牌号为: "); puts(p->num); printf("\n"); A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min; a=(B1-A1)*60+B2-A2; if(a>=60) { b=a/60; c=a-60*b; } else { b=0; c=a; } printf("车牌号: "); puts(p->num); printf("\n"); printf("===================================================\n"); printf("|进车场时刻|出车场时刻|停留时间|应付(元)|\n"); printf("====================================================\n"); printf("|%d: %d",p->reach.hour,p->reach.min); printf("|%d: %d",p->leave.hour,p->leave.min); printf("|%d: %d",b,c); printf("|%2.1f",0.1*a); printf("|\n"); printf("-----------------------------------------------------\n"); free(p); } intArrival(SeqStackCar*Enter,LinkQueueCar*W,intn)/*车辆到达*/ { CarNode*p; QueueNode*t; inta,b; p=(CarNode*)malloc(sizeof(CarNode)); flushall(); printf("\n请输入车牌号(例: qA1234): \n"); printf("请严格按照要求输入车牌号,否则系统会出错! \n"); do{ a=strlen("qA1234"); b=strlen(gets(p->num)); fflush(stdin); if(a! =b) { printf("输入车牌号格式错误,请重新输入! \n"); gets(p->num); fflush(stdin); } elsebreak; if(a! =b) printf("输入车牌号格式错误,请重新输入! \n"); }while(a! =b); if(Enter->top { Enter->top++; printf("\n车辆在车场第%d位置.",Enter->top); fflush(stdin); printf("\n请输入到达时间: /**: **/"); scanf("%d: %d",&(p->reach.hour),&(p->reach.min)); fflush(stdin); do{ if(p->reach.hour<0||p->reach.hour>=24||p->reach.min<0||p->reach.min>=60) { printf("输入的时间格式有错,请重新输入! "); scanf("%d: %d",&(p->reach.hour),&(p->reach.min)); fflush(stdin); } else break; }while(p->reach.hour<0||p->reach.hour>=24||p->reach.min<0||p->reach.min>=60); Enter->stack[Enter->top]=p; return (1); } else/*车场已满,车进便道*/ { printf("\n请该车在便道稍作等待! "); t=(QueueNode*)malloc(sizeof(QueueNode)); t->data=p; t->next=NULL; W->rear->next=t; W->rear=t; return (1); } } voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W,intn) {/*车辆离开*/ inti,room; CarNode*p,*t; QueueNode*q; /*判断车场内是否有车*/ if(Enter->top>0)/*有车*/ { while (1)/*输入离开车辆的信息*/ { printf("\n请输入要离开的车在车场的位置/1--%d/: ",Enter->top); scanf("%d",&room); fflush(stdin); if(room>=1&&room<=Enter->top)break; } while(Enter->top>room)/*车辆离开*/ { Temp->top++; Temp->stack[Temp->top]=Enter->stack[Enter->top]; Enter->stack[Enter->top]=NULL; Enter->top--; } p=Enter->stack[Enter->top]; Enter->stack[Enter->top]=NULL; Enter->top--; while(Temp->top>=1) { Enter->top++; Enter->stack[Enter->top]=Temp->stack[Temp->top]; Temp->stack[Temp->top]=NULL; Temp->top--; } PRINT(p); /*判断通道上是否有车及车站是否已满*/ if((W->head! =W->rear)&&Enter->top { q=W->head->next; t=q->data; Enter->top++; printf("\n现在请便道上的车进入车场.该车的车牌号为: "); puts(t->num); printf("\n该车进入车场第%d位置.",Enter->top); printf("\n请输入现在的时间(即该车进站的时间)/**: **/: "); scanf("%d: %d",&(t->reach.hour),&(t->reach.min)); fflush(stdin); do{ if(t->reach.hour<0||t->reach.hour>=24||t->reach.min<0||t->reach.min>=60) { printf("输入的时间格式有错,请重新输入! "); scanf("%d: %d",&(t->reach.hour),&(t->reach.min)); fflush(stdin); } else break; }while(t->reach.hour<0||t->reach.hour>=24||t->reach.min<0||t->reach.min>=60); W->head->next=q->next; if(q==W->rear)W->rear=W->head; Enter->stack[Enter->top]=t; free(q); } elseprintf("\n目前便道里没有车.\n"); } elseprintf("\n目前车场里没有车,来车请直接进入车场! ");/*没车*/ } voidList1(SeqStackCar*S)/*列表显示车场存车信息*/ { inti; if(S->top>0)/*判断车站内是否有车*/ { printf("\n车场: "); printf("\n位置到达时间车牌号\n"); for(i=1;i<=S->top;i++) { printf("%d",i); printf("%d: %d",S->stack[i]->reach.hour,S->stack[i]->reach.min); puts(S->stack[i]->num); } } elseprintf("\n目前车场里没有车"); } voidList2(LinkQueueCar*W)/*列表显示便道信息*/ { QueueNode*p; p=W->head->next; if(W->head! =W->rear)/*判断通道上是否有车*/ { printf("\n目前正在等待车辆的号码为: "); while(p! =NULL) { puts(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 停车场
![提示](https://static.bdocx.com/images/bang_tan.gif)