停车场数据机构设计.docx
- 文档编号:7055153
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:21
- 大小:202.57KB
停车场数据机构设计.docx
《停车场数据机构设计.docx》由会员分享,可在线阅读,更多相关《停车场数据机构设计.docx(21页珍藏版)》请在冰豆网上搜索。
停车场数据机构设计
停车场数据机构设计
1问题描述
1.1题目描述
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开车场时必须按它停留的时间长短交纳费用。
试用停车场编制按上述要求进行管理的模拟程序。
1.2任务要求
1.2.1使用顺序栈模拟停车场,链队列模拟车场外的便道,实现车辆入栈、出栈、入队列、出队列、信息输出等功能。
1.2.2车辆信息有:
车牌号、到达信息、到达时刻、离去信息、离去时刻等;
1.2.3输出的信息有:
如果是到达的车辆,输出其在停车场中或便道上的位置;
1.2.4如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用
2设计思想及其目的
2.1设计思想
此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能,就可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。
至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。
当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。
2.2设计目的
1通过课程设计,加深对《数据结构》这一课程所学内容的进一步理解与巩固。
2通过课程设计,加深对结构化设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。
3通过课程设计,提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。
4通过课程设计,训练C程序调试能力,能将一个中小型各级组织系统联调通过。
5通过课程设计,开发一个中小型系统,掌握系统研发全过程。
6通话课程设计,培养分析问题、解决实际问题的能力。
3系统具备的功能
3.1简体中文控制台界面
程序用来实现对停车场内车辆的管理,整个操作界面为中文,更加符合人性化的标准,
3.2到达信息
当车辆到达时,能够记录到达车辆的号码,记录到达时间。
安排停车位置。
如果车道满了,就停留在便道上。
3.3离开信息
当车辆离开时,统计其停留时间,记录其停车费用。
3.4查询信息
进入查询界面,可以查询目前车长信息,和变到信息。
4系统流程图
5主函数、子程序调用关系
6主要算法实现及其基本操作
6.1此停车场管理系统,主要分为以下若干模块:
首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。
在主函数中首先调用option()函数,出现欢迎用户使用的主界面,然后提示用户进入此停车场管理系统后,再出现一个供用户选择的界面,在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开、停车场内停放车辆的信息以及退出程序这四个函数模块。
其中,在车辆的离开那个模块函数中又调用了打印离开车辆信息的函数,在停车场内停放车辆信息的那个模块函数中,又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。
最后,从调鼐的这四个函数中回到主函数结束整个程序的运行。
6.2在以上各个模块中,各模块的伪码算法:
6.2.1栈的初始化:
voidInitStack(SeqStackCar*s)/*初始化栈*/
{inti;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
6.2.2链队列的初始化:
intInitQueue(LinkQueueCar*Q)/*初始化队列*/
{
Q->head=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->head!
=NULL)
{Q->head->next=NULL;
Q->rear=Q->head;
return
(1);
}
else
return(-1);
}
6.2.3车辆到达时的算法:
intArrival(SeqStackCar*Enter,LinkQueueCar*W)/*车辆到达*/
{CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
printf("\t\t\t请输入到达车辆车牌号:
");
scanf("%d",&(p->num));
if(Enter->top {Enter->top++; printf("\n\t\t\t该车辆在停车场的位置是: %d\n",Enter->top); printf("\n\t\t\t请输入该车辆到达的时间: "); scanf("%d",&(p->reachtime)); Enter->stack[Enter->top]=p; return (1); } else/*车场已满,车进便道*/ {printf("\n\t\t\t停车场已满该车辆需在便道上等待! "); t=(QueueNode*)malloc(sizeof(QueueNode)); t->data=p; t->next=NULL; W->rear->next=t; W->rear=t; return (1); } } 6.2.4车辆离开时的算法: voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)/*车辆离开*/ {inti,room; CarNode*p,*t; QueueNode*q; /*判断车场内是否有车*/ printf("\n********************************************************************************"); if(Enter->top>0)/*有车*/ {while (1)/*输入离开车辆的信息*/ {printf("\t\t\t停车场里停放的车辆总数: %d",Enter->top); printf("\n\n\t\t\t请输入要离开车辆的位置: "); scanf("%d",&room); 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\n\t\t\t便道的%d号车进入车场第%d位置.",t->num,Enter->top); printf("\n\n\t\t\t请输入现在的时间: "); scanf("%d",&(t->reachtime)); W->head->next=q->next; if(q==W->rear) W->rear=W->head; Enter->stack[Enter->top]=t; free(q); } else printf("\n\n\t\t\t便道里没有车.\n"); } else printf("\n\n\t\t\t车场里没有车.");/*没车*/ } 6.2.5列表现试车场信息 voidList1(SeqStackCar*S)/*列表显示车场信息*/ {inti; if(S->top>0)/*判断车站内是否有车*/ {printf("\n\t\t\t车场: "); printf("\n\n\t\t\t位置到达时间车牌号\n"); for(i=1;i<=S->top;i++) {printf("%26d",i); printf("%6d",S->stack[i]->reachtime); printf("%10d",S->stack[i]->num); printf("\n"); } } else printf("\n\t\t\t车场里没有车"); } 6.2.6列表显示便道信息 voidList2(LinkQueueCar*W)/*列表显示便道信息*/ {QueueNode*p; p=W->head->next; if(W->head! =W->rear)/*判断通道上是否有车*/ {printf("\n\t\t\t等待车辆的号码为: "); while(p! =NULL) {printf("%-10d",p->data->num); p=p->next; } else printf("\n\t\t\t便道里没有车."); } } 7系统运行环境和开发工具 7.1系统运行环境 7.1.1硬件环境 处理器: InterPentium166MX或更高 内存: 32MB或更大 硬盘空间: 1GB以上 显卡: SVGA显示适配器 7.1.2软件环境 操作系统: Windows98/ME/2000/XP 7.2开发工具 C-FREE4.0 8用户手册 8.1用户界面 这个程序用来实现对停车场内车辆的管理,整个操作界面为中文,更加符合人性化的标准,使得用户使用方便,而且每一个操作都有提示,使得初次接触该程序的用户也能很快适应程序的操作。 8.2新的车辆到达 这个程序操作简单,对于车牌号,只需输入车牌号上的数字就行,简化了操作。 车辆满的时候停靠在便道上。 8.3场内车辆离开 离开时同样,输入离开的车牌号及其离开时间,自动判断费用。 及其便道上车辆进入,以及进入时间。 8.4查询车辆信息 可以查看场内车辆信息和便道上的车辆信息。 9详细设计 9.1源文件 #include #include #include #defineMAX10/*车库容量*/ #defineprice1/*每车每时刻费用*/ typedefstructnode {intnum; intreachtime; intleavetime; }CarNode;/*车辆信息结点*/ typedefstructNODE {CarNode*stack[MAX+1]; inttop; }SeqStackCar;/*模拟车站*/ typedefstructcar {CarNode*data; structcar*next; }QueueNode; typedefstructNode {QueueNode*head; QueueNode*rear; }LinkQueueCar;/*模拟通道*/ /*---------------------------------------------------------------------------*//*函数声明部分*/ voidInitStack(SeqStackCar*);/*初始化栈*/ intInitQueue(LinkQueueCar*);/*初始化便道*/ intArrival(SeqStackCar*,LinkQueueCar*);/*车辆到达*/ voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);/*车辆离开*/ voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*/ voidPRINT(CarNode*p); /*---------------------------------------------------------------------------*/voidoption() {inti; charchoice; for(i=1;i<=80;i++) printf("\004"); printf("\n\n\n\n"); printf("----------------------------\n"); printf("|停车场管理系统|\n"); printf("----------------------------\n"); printf("\n\n\n\n"); for(i=1;i<=80;i++) printf("\004"); printf("设计者: 王勇\n"); printf("班级: 计算机08-3"); printf("\n********************************************************************************"); printf("\n\n\n是否进入该系统\n(y/n)"); choice=getchar(); if(choice=='N'||choice=='n') exit(0); } voidmain() {SeqStackCarEnter,Temp; LinkQueueCarWait; intch; option(); InitStack(&Enter);/*初始化车站*/ InitStack(&Temp);/*初始化让路的临时栈*/ InitQueue(&Wait);/*初始化通道*/ while (1) {printf("\n********************************************************************************"); printf("\n\n\t\t\t1.新的车辆到达请选择1"); printf("\n\n\t\t\t2.场内车辆离开请选择2"); printf("\n\n\t\t\t3.查询车辆信息请选择3"); printf("\n\n\t\t\t4.选择退出程序请选择4"); printf("\n\n\t\t\t现在请选择以上信息: "); while (1) {scanf("%d",&ch); printf("\n"); if(ch>=1&&ch<=4)break; else printf("\n\t\t\t错误! 请再次做出选择! \n\n\t\t\t"); } switch(ch) {case1: Arrival(&Enter,&Wait);break;/*车辆到达*/ case2: Leave(&Enter,&Temp,&Wait);break;/*车辆离开*/ case3: List(Enter,Wait);break;/*列表打印信息*/ case4: exit(0);/*退出主程序*/ default: break;} } } /*------------------------------------------------------------------------------*/ voidInitStack(SeqStackCar*s)/*初始化栈*/ {inti; s->top=0; for(i=0;i<=MAX;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); } else return(-1); } voidPRINT(CarNode*p)/*打印出站车的信息*/ {intA1,A2; printf("\n********************************************************************************"); printf("\n\t\t\t请输入离开时间: "); scanf("%d",&(p->leavetime)); printf("\n\t\t\t离开车辆的车牌号: %d",p->num); printf("\n\n\t\t\t离开车辆到达时间: %d",p->reachtime); printf("\n\n\t\t\t离开车辆离开时间: %d",p->leavetime); A1=p->reachtime; A2=p->leavetime; printf("\n\n\t\t\t停车场管理费用: %d",(A2-A1)*price); free(p); } intArrival(SeqStackCar*Enter,LinkQueueCar*W)/*车辆到达*/ {CarNode*p; QueueNode*t; p=(CarNode*)malloc(sizeof(CarNode)); printf("\t\t\t请输入到达车辆车牌号: "); scanf("%d",&(p->num)); if(Enter->top {Enter->top++; printf("\n\t\t\t该车辆在停车场的位置是: %d\n",Enter->top); printf("\n\t\t\t请输入该车辆到达的时间: "); scanf("%d",&(p->reachtime)); Enter->stack[Enter->top]=p; return (1); } else/*车场已满,车进便道*/ {printf("\n\t\t\t停车场已满该车辆需在便道上等待! "); 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)/*车辆离开*/ {inti,room; CarNode*p,*t; QueueNode*q; /*判断车场内是否有车*/ printf("\n********************************************************************************"); if(Enter->top>0)/*有车*/ {while (1)/*输入离开车辆的信息*/ {printf("\t\t\t停车场里停放的车辆总数: %d",Enter->top); printf("\n\n\t\t\t请输入要离开车辆的位置: "); scanf("%d",&room); 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\n\t\t\t便道的%d号车进入车场第%d位置.",t->num,Enter->top); printf("\n\n\t\t\t请输入现在的时间: "); scanf("%d",&(t->reachtime)); W->head->next=q->next; if(q==W->rear) W->rear=W->head; Enter->stack[Enter->top]=t; free(q); } else printf("\n\n\t\t\t便道里没有车.\n"); } else printf("\n\n\t\t\t车场里没
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 停车场 数据 机构 设计