数据结构 停车场管理系统.docx
- 文档编号:5444112
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:22
- 大小:45.49KB
数据结构 停车场管理系统.docx
《数据结构 停车场管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构 停车场管理系统.docx(22页珍藏版)》请在冰点文库上搜索。
数据结构停车场管理系统
一、设计目的
1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
二、设计内容
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等待,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
三、设计要求
按照从终端读入的输入数据进行模拟管理,每一组输入数据包括三个数据项:
汽车“进站”或“出站”信息、汽车牌照号码以及进站或出站的时刻,对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内逗留的时间和应交纳的费用(在便道上停留不收费),按以顺序结构实现,队列以链表结构实现。
四、设计过程
1、算法思想分析
由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。
由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场,又因为每个汽车的车牌号都不一样,这样一来可以根据车牌号准确找到汽车位置,所以堆栈里的数据元素我设计成汽车的车牌号。
当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场。
这是个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个堆栈,以之来暂时存放为出站汽车暂时让道的汽车车牌号。
当停车场满后,继续进来的汽车需要停放在停车场旁边的便道上等候,若停车场有汽车开走,则按排队的先后顺序依次进站,最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。
另外,停车场根据汽车在停车场内停放的总时长来收费的,在便道上的时间不计费,因此必须记录车辆进入停车场时的时间,车辆离开停车场时的时间不需要记录,当从终端输入时可直接使用。
由于时间不像汽车一样需要让道,我设计了一个顺序表来存放时间。
又用顺序表用派生法设计了一个堆栈,恰好满足上面模拟停车场的需要。
2、算法描述与实现
(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;/*模拟通道*/
voidInitStack(SeqStackCar*,intn);/*声明栈*/
//初始化,创建一个新栈S用于停车场
intInitQueue(LinkQueueCar*);/*声明便道*/
//初始化,创建一个队列Q用于便道
intArrival(SeqStackCar*,LinkQueueCar*,intn);/*车辆进站*/
{
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
printf("\n请输入车牌号(例如:
吉A1234):
");
gets(p->num);
if(Enter->top { Enter->top++; printf("\n车辆在车场第%d位置.",Enter->top); printf("\n请输入到达时间: /**: **/"); scanf("%d: %d",&(p->reach.hour),&(p->reach.min)); 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*,SeqStackCar*,LinkQueueCar*,intn);/*车辆出站*/ (4)主函数和其它函数的伪码算法 voidmain() { SeqStackCarEnter,Temp; LinkQueueCarWait; intch; intn; n=getn(); InitStack(&Enter,n);/*初始化车场*/ InitStack(&Temp,n);/*初始化让路的临时栈*/ InitQueue(&Wait);/*初始化便道*/ while (1) { printf("\n1.车辆进站"); printf("2.车辆出站"); printf("3.存车信息"); printf("4.退出系统\n"); while (1) { printf("请选择: 1|2|3|4.\n"); scanf("%d",&ch); fflush(stdin); do { if(ch>4||ch<1){ printf("输入有误,请重新输入! "); scanf("%d",&ch); fflush(stdin); } else break; } while(ch>4||ch<1); break; } switch(ch) { case1: Arrival(&Enter,&Wait,n);break;/*车辆进站*/ case2: Leave(&Enter,&Temp,&Wait,n);break;/*车辆出站*/\ case3: List(Enter,Wait);break;/*存车信息*/ case4: exit(0);/*退出系统*/ default: break; } } } 系统测试 程序初始界面: 车辆进站: 停车场存车信息: 车辆进入便道: 车辆出站: 便道上的车出站: 五、设计总结 参考文献: 《数据结构程序设计题典》 李春葆等编清华大学出版社 《数据结构(C语言版)》 黄国瑜叶乃菁编清华大学出版社 《数据结构课程设计》 苏仕华等编机械工业出版社 附录: #include #include #include #include /*------------------------------------------------------------------------------*/ #defineMax10 intgetn() { intn; printf("欢迎您光临吉吉停车场,"); 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("祝您一路顺风,欢迎您下次光临."); printf("\n收据\n"); 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请输入车牌号(七位,例: 吉A1234): \n"); printf("请严格按照要求输入车牌号,否则系统会出错! \n"); do { a=strlen("陕A1234"); 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 停车场管理系统 停车场 管理 系统
![提示](https://static.bingdoc.com/images/bang_tan.gif)