数据结构课程设计停车场管理系统.doc
数据结构课程设计报告设计题目停车场管理系统班 级网络1102姓 名翟瑜璇学 号40指导教师刘延岭日 期2012年6月25日计算机与信息工程系数据结构课程设计评阅表设计题目停车场管理系统班级网络1102姓名翟瑜璇学号40答辩评语:总结报告评语:功能实现答辩效果设计报告创 新总 分一、 引言设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开车场时必须按它停留的时间长短交纳费用。由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场,又每个汽车的车牌号都不一样,这样一来可以根据车牌号准确找到汽车位置,所以堆栈里的数据元素我设计成汽车的车牌号。当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场。这是个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个堆栈,以之来暂时存放为出站汽车暂时让道的汽车车牌号。当停车场满后,继续进来的汽车需要停放在停车场旁边的便道上等候,若停车场有汽车开走,则按排队的先后顺序依次进站,最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。另外,停车场根据汽车在停车场内停放的总时长来收费的,在便道上的时间不计费,因此必须记录车辆进入停车场时的时间,车辆离开停车场时的时间不需要记录,当从终端输入时可直接使用。二、 设计过程开始1、流程图设计输入车辆的号码及到达时间停车场是否已满?进入停车场进入便道等候离开停车场判断停车场是否为空?车场里没有车输出离开时间计算价格判断便道为空?便道里面没有车辆车辆进入停车场车辆进入停车场结束2、设计思想此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某车辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后, 这些车再依原来的次序进场的功能,就可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的链接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二车辆成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。3、主要模块首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。在主函数中首先调用option()函数,出现欢迎用户使用的主界面,然后提示用户进入此停车场管理系统后,再出现一个工用户选择的界面,在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开、停车场内停放车辆的信息以及退出程序这四个函数模块。4、模块间关系开始初始化两个栈及一个队列。进入主菜单车离开车到达列表显示退出车场内信息车场是否为空便道车信息是否退出列表显示Room前车辆进临时栈对Room计费否判便道是否有车判断栈是否为满是是否便道车进车场元素进栈元素进队列栈元素出栈队列中元素出队结束队列中元素进栈三、 测试及运行结果1、 常见的错误容易将程序中的字母打错:在写程序时多注意,尽量不打错2、 运行过程及结果(1)程序开始运行(2)车辆到达输入信息(3)车辆离开(4)车辆信息(5)退出系统四、 总结一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。再设计过程中,和同学们相互探讨,相互学习,相互监督。我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益良多。课程设计是我们专业课程知识综合应用的实践训练,这是我们迈向社会,从事职业工作前一个比不少的过程,“千里之行始于足下”,通过这次课程设计,我深深体会到了这句千古名言的真正含义,我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健的在社会大潮中奔跑打下坚实的基础。我这次设计的科目是停车场管理系统。数据结构,是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。作为一门独立的课程在国外是从1968年才开始设立的。1968年美国唐-欧-克努特教授开创了数据结构的最初体系,他所著的计算机程序设计技巧第一卷基本算法是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。数据结构这一门课的内容不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。通过这次模具设计,我在多方面都有所提高。通过这次的课程设计,更是让我深刻认识到自己在学习中的不足,同时也找到了克服这些不足的方法,这也是一笔很大的资源。在以后的时间中,我们应该利用更多的实践去上机实验,加强自学的能力,多编写程序,相信不久后我们的编程能力都会有很大的提高,能设计出更多的更有创新的作品。五、 参考文献1、C语言程序设计 高等教育出版社 廖雷 第三版 2009年2、数据结构(C语言描述) 中国水利水电出版社 马秋菊 2006年3、4、六、 附录#include "stdio.h" #include "stdlib.h" #include "string.h" #include "conio.h"int MAX; /*定义一个全局变量用来存储车库最大容量*/ float price;/*每车每小时的费用*/ typedef struct time int hour; int min; Time; /*时间结点*/ typedef struct node char num10; Time reach; Time leave; Car; /*车辆信息结点*/ typedef struct NODE Car *stack100; int top; SqStack; /*停车站*/ typedef struct car Car *data; struct car *next; QNode; typedef struct Node QNode *head; QNode *rear; LinkQueue; /*通道*/ void InitStack(SqStack *); /*初始化栈*/ int InitQueue(LinkQueue *); /*初始化便道*/ int arrive(SqStack *,LinkQueue *); /*车辆到达*/ void leave(SqStack *,SqStack *,LinkQueue *); /*车辆离开*/ void info(SqStack,LinkQueue); /*显示停车场信息*/ void PRINT(Car *p,int room);void InitStack(SqStack *s) /*初始化栈*/ int i; s->top=0; for(i=0;i<=MAX;i+) s->stacks->top=NULL; int InitQueue(LinkQueue *Q) /*初始化便道*/ Q->head=(QNode *)malloc(sizeof(QNode); if(Q->head!=NULL) Q->head->next=NULL; Q->rear=Q->head; return(1); else return(-1); void main() SqStack In,Out; LinkQueue Wait; int ch; InitStack(&In); /*初始化停车站*/ InitStack(&Out); /*初始化让路的临时栈*/ InitQueue(&Wait); /*初始化通道*/ while(1) printf("-欢迎使用停车场管理系统-n"); printf("t本系统由5011工作室开发,作者:*、*、*、*。nn"); printf("请输入停车场的容量:"); scanf("%d",&MAX); printf("请输入停车场的收费标准(元/小时):"); scanf("%f",&price); printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。n",MAX,price); printf("n(1)车辆到达n(2)车辆离开n(3)停车场信息n(4)退出系统n请选择n"); while(1) ch=getch(); switch(ch) case 49:arrive(&In,&Wait);break; /*车辆到达*/ case 50:leave(&In,&Out,&Wait);break; /*车辆离开*/ case 51:info(In,Wait);break; /*输出车站信息*/case 52:printf("谢谢使用!");exit(0); /*退出主程序*/ default:printf("n按键无效,请重新按键选择!");/*49-52分别表示"1"-"4"这四个按键的键值*/system("CLS");printf("-欢迎使用停车场管理系统-n");printf("t本系统由CG工作室开发,作者:*、*、*、*。nnn");printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。n",MAX,price);printf("n(1)车辆到达n(2)车辆离开n(3)停车场信息n(4)退出系统n请选择n"); int arrive(SqStack *In,LinkQueue *W) /*车辆到达*/ Car *p; QNode *t; p=(Car *)malloc(sizeof(Car); flushall(); printf("n停车场还有%d停车位(若停车位为0,车可先进入便道等待)",MAX-In->top); printf("n请输入车牌号码(例:湘D0734):"); gets(p->num); if(In->top<MAX) /*停车场未满,车进车场*/ In->top+; printf("n停车的位置:%d号停车位。",In->top); /printf("n请输入车到达的时间(格式"*:*"):"); printf("n请输入车到达的时间:"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); In->stackIn->top=p; printf("请按任意键返回"); getch(); return(1); else /*停车场已满,车进便道*/ printf("n停车位已满,该车须在便道等待!"); t=(QNode *)malloc(sizeof(QNode); t->data=p; t->next=NULL; W->rear->next=t; W->rear=t; printf("请按任意键返回"); getch(); return(1); void leave(SqStack *In,SqStack *Out,LinkQueue *W) /*车辆离开*/ int room; Car *p,*t; QNode *q; /*判断车场内是否有车*/ if(In->top>0) /*有车*/ while(1) /*输入离开车辆的信息*/ printf("n请输入车在停车场的位置(1-%d):",In->top); scanf("%d",&room); if(room>=1&&room<=In->top) break; while(In->top>room) /*车辆离开*/ Out->top+; Out->stackOut->top=In->stackIn->top; In->stackIn->top=NULL; In->top-; p=In->stackIn->top; In->stackIn->top=NULL; In->top-; while(Out->top>=1) In->top+; In->stackIn->top=Out->stackOut->top; Out->stackOut->top=NULL; Out->top-; PRINT(p,room); /*判断通道上是否有车及车站是否已满*/ if(W->head!=W->rear)&&In->top<MAX) /*便道的车辆进入停车场*/ q=W->head->next; t=q->data; In->top+; printf("n便道的%s号车进入车场第%d号停车位。",t->num,In->top); /printf("n请输入现在的时间(格式"*:*"):"); printf("n请输入现在的时间:"); scanf("%d:%d",&(t->reach.hour),&(t->reach.min); W->head->next=q->next; if(q=W->rear) W->rear=W->head; In->stackIn->top=t; free(q); else printf("n停车场里没有车n"); /*没车*/ printf("请按任意键返回"); getch();void info1(SqStack *S) /*列表输出车场信息*/ int i; if(S->top>0) /*判断停车场内是否有车*/ printf("n车场:"); printf("n 位置 到达时间 车牌号n"); for(i=1;i<=S->top;i+) printf(" %dt",i); printf("%d:%d ",S->stacki->reach.hour,S->stacki->reach.min); puts(S->stacki->num); else printf("n停车场里没有车"); void info2(LinkQueue *W) /*显示便道信息*/ QNode *p; p=W->head->next; if(W->head!=W->rear) /*判断通道上是否有车*/ printf("n便道中车辆的号码为:n"); while(p!=NULL) puts(p->data->num); p=p->next; else printf("n便道里没有车n"); printf("请按任意键返回"); getch(); void info(SqStack S,LinkQueue W) info1(&S); /*显示停车场信息*/ info2(&W); /*显示停便道信息*/ void PRINT(Car *p,int room) /*输出停车站车的信息*/ int A1,A2,B1,B2; /printf("n请输入车离开的时间(格式"*:*"):"); printf("n请输入车离开的时间:"); scanf("%d:%d",&(p->leave.hour),&(p->leave.min); printf("n车牌号码:"); puts(p->num); printf("n车到达的时间是: %d:%d",p->reach.hour,p->reach.min); printf("车离开的时间是: %d:%d",p->leave.hour,p->leave.min); A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min; printf("n费用为: %2.1f元",(B1-A1)+(B2-A2)/60.0)*price); free(p);