《数据结构》课程设计报告
(2011 --2012 学年 第 2 学期)
题 目:___停车场管理系统_____
学 号:____201001020140_____
姓 名:___张文利_______
指导教师:____李印清 ___
信息科学与工程系
1设计内容、任务及具体要求
1.1设计内容
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路(假定停车场内没有留出车辆进出的通道),待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
1.2设计任务及具体要求
1、以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
2、2概要设计
2.1该系统的功能简介
① 主函数:介绍程序的基本功能,并给出程序功能所对应的键
盘操作的提示,如车到来或离去的表示方法,停车场或者便道的
状态的查询方法提示等。
②车辆到达Arrival函数:首先要查询当前停车场的状态,当停
车场非满时,将其驶入停车场(入栈),开始计费;当停车场满
时,让其进入便道等候(入队)。
③车辆离开Leave函数:当某辆车要离开停车场的时候,比它后
进停车场的车要为它让路,(即将这些车依次“压入”辅助栈),
开走请求离开的车,再将辅助栈中的车依次出栈,“压入”停车场;
同时根据离开的车在停车场停留的时间进行收费;最后查询是否
有车在便道等候,若有,将便道上的第一辆车驶入停车场(先出
队,再入栈),开始交费。
④车辆信息List函数:用来在屏幕上显示停车位和便道上各位
置的状态。
2.2 总体程序框图2.3各个模块之间的主要关系
①此停车场管理系统,主要分为以下若干模块:
首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。在主函数中首先调用jiemian()函数,出现欢迎用户使用的主界面,然后提示用户进入此停车场管理系统后,再出现一个供用户选择的界面,在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开、停车场内停放车辆的信息以及退出程序这四个函数模块。其中,在车辆的离开那个模块函数中又调用了打印离开车辆信息的函数,在停车场内停放车辆信息的那个模块函数中,又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。最后,从调鼐的这四个函数中回到主函数结束整个程序的运行。
②在以上各个模块中,出现的调用的函数为:
void jianzhan(tingchechang*);
int jianduilie(biandao *Q)
int jiemian( )
int Arrival(tingchechang *zhan1,biandao *W)
void Leave(tingchechang *zhan1,tingchechang *zhan2,biandao *W)
void PRINT(xinxijiedian *p,int weizhi)
void List(tingchechang S, biandao W)
void List1(tingchechang *S)
void List2(biandao *W)
3系统功能模块的具体设计
3.1各个模块的程序流程图及运行界面
1.欢迎界面
2.到达界面
3.车辆信息
4.离开界面
3.2关键代码分析说明
(1)由于车位是一个狭长的通道,不允许两辆车同时出入停车位,当有车到
来时要进入停车位的时候也要顺次停放,当某辆车要离开时,比它后到的车
要先暂时离开停车位,而且越后到的车就越先离开停车位,显然这与栈的“后
进先出”特点相吻合,因此用栈来描述停车场是合适的,使用一个顺序栈表
示停车场比较方便,具体定义如下:
typedef struct NODE
{
CarNode *stack[MAX+1];
int top;
}SeqStackCar;
(2)当停车场的停车位上都已经停满了汽车,又有新的汽车到来时要把它停放
在便道上,车辆要按照进入便道的先后顺序顺次存放在便道上;当有车从停
车场上离开后,便道上等候的第一辆汽车就立即进入停车场中空出的某个车
位。这和队列“先进先出”的特点相吻合,使用链队列来模拟便道比较合适,
类型定义如下:
typedef struct car
{
CarNode *data;
struct car *next;
}QueueNode
(3)
4程序调试分析
如果将车场中离开车辆的时间信息赋给进入车辆,这样就应该会很方便。该停车场程序调失败告终,去掉该段程序调试时,车辆时间信息混乱,无法进行下面的访问。试过程中,曾想过试着去掉便道上车辆进车场时时间信息的输入,但以系统相较于现实还是有很大差别的,所以在过程中曾在题目要求和调试结果上有过很大的困扰,不过还好,最后都比较完善的解决了。
5程序使用说明
该程序模拟停车场系统对车辆的管理,通过人性化的界面使用户能够更轻松方便的应用。该程序便于操作,只需按照提示语选择即可。用户可根据该系统更直观的了解现实生活中停车场的系统管理模式。当然,程序中也有不足之处,比如便道上的车辆在进入车场时需重新输入进入时间。程序中更详细的情况,请参考源程序及调试界面。
6总结
;
通过这一周的课程设计,加深了我对《数据结构》这门课程所学内容的进一步的理解与掌握;同时,通过对停车场管理系统的开发,使得我将计算机课程所学知识与实际问题很好地相联接在了一起。在这次课程设计中,不仅培养了我开发一个中小型程序的能力,而且也培养了我的团队合作能力。在这次对停车场管理系统的开发过程中,我们小组成员互相合作,互相帮助,其中有程序功能成功实现时的欣喜,也有遇到问题、解决问题时的执着以及迷茫。在这次课程设计中,使得我很好地了解了在开发程序过程中合作的重要性。
在这周课程设计中,我们小组所开发的停车场管理系统,基本上可以完成每一项功能。汽车进入停车场的信息、离开停车场的信息以及通道上的信息都可以在程序上一一实现。但是,该程序也有不足的地方。主要表现在车辆的车牌号上,现实中的车牌号是一串字符,可是,在这个程序中,为了简便起见,我们就车牌号定义为了整型,这个与现实是有些不符的。还有一个可以改进的地方就是记录车辆进入停车场以及离开停车场的时间,应该精确到小时以及分钟的,可是在程序中,为了简便起见,我们只是设置成了一个时刻,所以,在这方面还是有待改进的。改进的程序中,还应该增加时间的判断功能,即停车场内有可能有车辆停放的时间超过一天。
还有一个很重要的问题,对于停车场内可以停放的最多车辆数,为了测试数据的方便,我在程序中,定为了2,在实际使用中,可以改变程度开头的宏定义以增加停车场的容量。
c 语言程序设计是一门重要的专业基础课,通过这次课程设计使我了解了c
语言程序设计的思想,并且掌握了程序设计的基本方法,为后续课程打下了坚实
的基础。同时,这次课程设计又是一次实践性较强的知识应用,在对我进行程序
设计基础理论与技术技巧能力训练的同时,更加培养了我解决实际问题的编程能
力。
在设计过程中,首先要解决的是与同学的合作,接下来分工与协商,共同探
讨,大家取长补短,认清自己的不足之处和薄弱环节,加以弥补和加强,要做出
一个好的程序就要有不懈追求的精神和对理想崇高的追求,有一种不完成不罢休
的精神。c 语言作为一种高级编程语言具有方便灵活的特点,适合各种类型的软
件开发,为我们以后学习单片机非常有用。
在设计初期,根据题目的要求和所学的知识,车库中的车辆是先进后出的,
是栈结构,便道上的车辆是先进先出的,是一个队列,结构很明显,但是现阶段
我所学的基础知识不够,掌握的不多,对应用栈和队列来解决这个问题有一定的
困难,因此我在整个设计中使用了结构体数组,运用一个结构体数组来同时记录
车库和便道中车辆的信息,这样也可以起到一个连续记录数据的功能,完成设计
要求的任务。
课程设计为我提供了一个既动手又动脑,独立实践的机会,将课本上的知识
与实践相结合起来,提高了我适应实际,实践编程的能力。
通过此次程序设计,我看到了自己的不足,对知识的掌握有很大的欠缺。在此次过程中,通过不断地查阅资料和请教,在知识体系的完善和应用上我有了很大的提升。我深刻的明白“纸上得来终觉浅“,要想熟练的掌握程序设计,还需要不断地在练习中理解和融汇贯通。之所以学,乃是为了用,学而不会用,不如不学。而我深刻地明白了,应用和学习之间有着天壤之别,只有通过不断地揣摩和尝试,才能将其掌握于心。
致谢
非常感谢我的指导老师李印清教授对此次课程设计的指导,感谢我的同学们在我请教的时候对我耐心的讲解。
参考文献
严蔚敏 吴伟民 《数据结构(c语言版)》 清华大学出版社
杨路明 《C语言程序设计教材》 北京邮电大学出版社
王娣 安剑 孙秀梅 《C语言程序开发范例宝典》 人民邮电出版社
附:源程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*-----------------------------------------------------------------------------*/
#define MAX 2 /*车库容量*/
#define price 0.5 /*每辆车每分钟费用*/
typedef struct time
{
int hour;
int min;
}Time;
typedef struct node
{
char num[10];
Time reach;
Time leave;
}CarNode; /*车辆信息结点*/
typedef struct NODE
{
CarNode *stack[MAX+1];
int top;
}SeqStackCar; /*模拟车站*/
typedef struct car
{
CarNode *data;
struct car *next;
}QueueNode; /*便道的每一个车位*/
typedef struct Node
{
QueueNode *head;
QueueNode *rear;
}LinkQueueCar; /*模拟通道*/
/*---------------------------------------------------------------------------*/ /*函数声明部分*/
void InitStack(SeqStackCar *); /*初始化栈*/
int InitQueue(LinkQueueCar *); /*初始化便道*/
int Arrival(SeqStackCar *,LinkQueueCar *); /*车辆到达*/
void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /*车辆离开*/
void List(SeqStackCar,LinkQueueCar); /*显示存车信息*/
void PRINT(CarNode *p) ;
/*---------------------------------------------------------------------------*/
void option()
{
char choice;
printf("\n\n\n\n\n\n\n");
printf(" 欢迎来到天涯停车场管理系统 \n\n\n\n");
printf(" 开拓者:张文利 \n\n\n\n");
printf(" 班级: 10级网络工程 \n\n\n\n\n");
printf("\n********************************************************************************\n");
printf(" 是否进入该系统(y/n)?\n ");
choice=getchar();
if(choice=='N'||choice=='n')
{ printf("\n\n\n\n\n");
printf(" 谢谢您的光临,再见!\n\n");
exit(0);
}
}
/*------------------------------------------------------------------------------*/
void main()
{
SeqStackCar Enter,Temp; /*声明了两个栈(一个是停车场的,一个是临时存放车辆的)*/
LinkQueueCar Wait; /*便道等待队列*/
int ch;
option();
InitStack(&Enter); /*初始化车站*/
InitStack(&Temp); /*初始化让路的临时栈*/
InitQueue(&Wait); /*初始化通道*/
while(1) /*简单输出键盘操作信息*/
{
printf(" 1. 车辆到达请选择 1\n");
printf(" 2. 车辆离开请选择 2\n");
printf(" 3. 车辆信息请选择 3\n");
printf(" 4. 退出程序请选择 4\n");
printf(" 现在请选择以上信息 : ");
while(1)
{
scanf("%d",&ch);
printf("\n");
if(ch>=1&&ch<=4)
break;
else
printf(" 错误!请再次做出选择! \n");
}
switch(ch)
{
case 1:Arrival(&Enter,&Wait); break; /*车辆到达*/
case 2:Leave(&Enter,&Temp,&Wait); break; /*车辆离开*/
case 3:List(Enter,Wait); break; /*列表打印信息*/
case 4:exit(0); /*退出主程序*/
default: break;
}
}
}
/*------------------------------------------------------------------------------------*/
void InitStack(SeqStackCar *s) /*初始化栈*/
{
int i;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL; /*车辆信息为空*/
}
int InitQueue(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);
}
void PRINT(CarNode *p,int room) /*打印出站车的信息*/
{
int A1,A2,B1,B2;
printf("\n 请输入离开时间: ");
scanf("%d:%d",&(p->leave.hour),&(p->leave.min));
while(1)
{
if(p->leave.hour>=0&&p->leave.hour<=24&&p->leave.min>=0&&p->leave.min<=60)
break;
else
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("\n 离开车辆离开时间: %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 停车场管理费用: %f",((B1-A1)*60+(B2-A2))*price);
free(p);
}
int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/
{
CarNode *p;
QueueNode *t;
p=(CarNode *)malloc(sizeof(CarNode));
flushall();
printf(" 请输入到达车辆车牌号: ");
gets(p->num);
if(Enter->top<MAX) /*车场未满,车进车场*/
{
Enter->top++;
printf("\n 该车辆在停车场的位置是: %d\n",Enter->top);
printf("\n 请输入该车辆到达的时间: ");
scanf("%d:%d",&(p->reach.hour),&(p->reach.min));
while(1)
{
if(p->reach.hour>=0&&p->reach.hour<=24&&p->reach.min>=0&&p->reach.min<=60)
break;
else
printf(" 输入错误,请重新输入! \n");
scanf(" %d:%d",&(p->reach.hour),&(p->reach.min));
}
Enter->stack[Enter->top]=p;
return(1);
}
else /*车场已满,车进便道*/
{
printf("\n 停车场已满该车辆需在便道上等待!\n");
t=(QueueNode *)malloc(sizeof(QueueNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return(1);
}
}
void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /*车辆离开*/
{
int room;
CarNode *p,*t;
QueueNode *q;
/*--------------------------判断车场内是否有车--------------------------------*/
if(Enter->top>0) /*有车*/
{
while(1) /*输入离开车辆的信息*/
{
printf("\n 请输入要离开车辆的位置/1--%d/:",Enter->top);
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,room);
/*------------判断通道上是否有车及车站是否已满----------------------*/
if((W->head!=W->rear)&&Enter->top<MAX) /*便道的车辆进入车场*/
{
q=W->head->next;
t=q->data;
Enter->top++;
printf("\n 便道的%s号车进入车场第%d位置.",t->num,Enter->top);
printf("\n 请输入现在的时间:");
scanf("%d:%d",&(t->reach.hour),&(t->reach.min));
W->head->next=q->next;
if(q==W->rear)
W->rear=W->head;
Enter->stack[Enter->top]=t;
free(q);
}
else
printf("\n 便道里没有车.\n");
}
else
printf("\n 车场里没有车."); /*没车*/
}
void List1(SeqStackCar *S) /*列表显示车场信息*/
{
int i;
if(S->top>0) /*判断车站内是否有车*/
{
printf("\n 车场:");
printf("\n 位置 到达时间 车牌号\n");
for(i=1;i<=S->top;i++)
{
printf("%20d ",i);
printf(" %d:%d ",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
printf("\n");
}
}
else
printf("\n 车场里没有车");
}
void List2(LinkQueueCar *W) /*列表显示便道信息*/
{
QueueNode *p;
p=W->head->next;
if(W->head!=W->rear) /*判断通道上是否有车*/
{
printf("\n 等待车辆的号码为: ");
while(p!=NULL)
{
puts(p->data->num);
p=p->next;
}
printf("\n");
}
else
printf("\n 便道里没有车.");
}
void List(SeqStackCar S,LinkQueueCar W)
{
int flag,tag;
flag=1;
while(flag)
{
printf("\n 请选择 1|2|3:");
printf("\n 1.车场\n 2.便道\n 3.返回\n");
while(1)
{
scanf(" %d",&tag);
if(tag>=1||tag<=3) break;
else printf("\n\t\t\t请选择 1|2|3:");
}
switch(tag)
{
case 1:List1(&S);break; /*列表显示车场信息*/
case 2:List2(&W);break; /*列表显示便道信息*/
case 3:flag=0;break;
default: break;
}
}
}
指导教师评语:
成绩: 指导教师签名: 年 月 日