资源描述
东北大学信息科学与工程学院
数据结构课程设计报告
题目 立体化停车场管理
课题组长 张晓峰
课题组成员 曹乔家 王子骄
专业名称 计算机科学与技术
班级 计1307
指导教师 杨雷
2015 年 1月
课程设计任务书
题目:
立体化停车场管理
问题描述:
设停车场有地上和地下两层,统一管理。地下停车场采用单入口和单出口。地上停车场采用南北方向的双口,每个口都有一个入口和出口。停车顺序先地上,后地下。地上入口处各有一个单车道的等候通道,并允许等候的车辆因急事从等候通道直接开走。
设计要求:
设计停车场模拟管理程序。
(1)采用栈、队列和有序表等数据结构。
(2)等候车辆的管理。
(3)地下、地上停车位的管理。
(4)停车计费功能。
(5)其它完善性功能。
指导教师签字:
年 月 日
目录
1 课题概述 1
1.1 课题任务 1
1.2 课题原理 1
1.3 相关知识 1
2 需求分析 1
2.1 课题调研 1
2.2 用户需求分析 1
3 方案设计 2
3.1 总体功能设计 2
3.2 数据结构设计 2
3.3 函数原型设计 3
3.4 主算法设计 4
3.5 用户界面设计 4
4 方案实现 4
4.1 开发环境与工具 4
4.2 程序设计关键技术 4
4.3 个人设计实现 4
4.3.1 张晓峰设计实现 4
4.3.2 曹乔家设计实现 11
4.3.3 王子骄设计实现 15
5 测试与调试 19
5.1 个人测试 19
5.1.1 张晓峰测试 19
5.1.2 曹乔家测试 20
5.1.3 王子骄测试 21
5.2 组装与系统测试 21
5.3 系统运行 22
6 课题总结 24
6.1 课题评价 24
6.2 团队协作 25
6.3 团队协作 25
6.4 个人设计小结 25
6.4.1张晓峰设计小结 25
6.4.2 曹乔家设计小结 25
6.4.3 王子骄设计小结 25
7 附录A 课题任务分工 26
A-1 课题程序设计分工 26
A-2 课题报告分工 27
附录B 课题设计文档(光盘) 28
B-1课程设计报告(电子版) 28
B-2源程序代码(*.H,*.CPP) 28
B-3工程与可执行文件) 28
B-4屏幕演示录像文件(可选) 28
附录C 用户操作手册(可选) 28
C.1 运行环境说明 28
C.2 操作说明 28
1 课题概述
1.1 课题任务
【问题描述】
设停车场有地上和地下两层,统一管理。地下停车场采用单入口和单出口。地上停车场采用南北方向的双口,每个口都有一个入口和出口。停车顺序先地上,后地下。地上入口处各有一个单车道的等候通道,并允许等候的车辆因急事从等待通道直接开走。
【设计要求】
设计停车场模拟管理程序。
(1)采用栈、队列和有序表等数据结构。
(2)等候车辆的管理。
(3)地下、地上停车位的管理。
(4)停车计费功能。
(5)其它完善性功能。
1.2 课题原理
本程序主要运用栈来模拟停车场,建立上下两个栈来模拟上下停车场,一列表模拟车场便道,按照从终端输入的数据序列进行模拟管理,把停车的车位信息保存在新建的链表中,每组输入的数据保存车牌号,自动生成车位号和车辆到达时间保存在链表中,对每一组的数据输出信息,包括车辆到达时间,离开时间,及停车费用,用队列保存便车道停靠的车辆,以及车辆的登记和离开,最后的栈是以顺序栈结构实现,队列和链表以链式结构实现。
1.3 相关知识
本实验主要运用链表、栈、队列等数据结构,运用C语言中的指针、数组字符串等相关知识。
2 需求分析
2.1 课题调研
通过在网上对各个停车场的调查,我们查到停车场有车辆的入场登记,车辆的离开及费用,还有就是车辆的信息保存,每个车辆有车牌号,到达和离开时间及停车费用等等。
2.2 用户需求分析
本程序采用简单的界面,使使用者可以简单可了解软件的使用,界面简单、大方。链表保存的车位信息,只需输入车牌号,其他车位信息自动由系统生成,
可以免去使用的其他操作,为使用者省事,省力。同时本软件的使用达到人性化,方便化,便于使用者的使用。
3 方案设计
3.1 总体功能设计
本软件要实现对进入停车场的车辆登记功能,车辆离开的收费功能,以及车辆进入便车道的等待及从便车道,还有对车辆信息的查询和对车场进入和离开车辆的统计。
3.2 数据结构设计
(1)时间的结构体
struct now_time{
int mday;
int hour;
int min;
}
(2)车位信息的结构体
struct information
{
int setnumber;
char num[10];
struct now_time reach;
struct now_time leave;
}set[MAX*2]
(3)便车道队列
typedef struct
{
char *base;
int front;
int rear;
}SqQueue
(4)停车场的栈
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack
(5)车位信息的链表
typedef struct LNode
{
struct
{
int stnumber;
char num[10];
struct now_time reach;
struct now_time leave;
float fee;
int totalhour;
}data;
struct LNode *next;
}LNode,*LinkList
3.3 函数原型设计
()void CreateList_L(LinkList &L) 建立车辆信息链表
()Status initStack1(SqStack &S) 建立地上停车场的栈
()Status initStack2(SqStack &S) 建立地下停车场的栈
()Status Push(SqStack &S,int e) 车辆入栈即出场
()Status Pop(SqStack &S,int &e) 车辆出栈即入场
()Status initQueue(SqQueue &Q) 建立便车道的队列
()Status QueueLength(SqQueue Q) 计算便车道的车辆数量
()Status stack_empty(SqStack S) 判断停车场是否车满
()void enterstop( LinkList clist,SqStack &S,char number[10],int *come,int i) 车辆进入停车场
()Status leavestop(LinkList llist,LinkList clist,SqStack &S,SqQueue &Q,int *come,int*leave,int i) 车辆离开停车场
()void ccord(LinkList clist,int i,int setnumber) 信息登记
()Status ListInsert_Link(LinkList &L,int i,int setnumber) 保存车辆到来的信息
()void copy(char *a,char *b) 进行车位号的比对
()Status lListInsert_Link(LinkList &llist,int i,int lset,int totalhour,float fee,int day,int hour,int min) 保存车辆离开的信息
()void showcome(LinkList list) 显示车辆到来时间
()void showleave(LinkList list) 显示车辆离开时间
3.4 主算法设计
程序运行时,当车辆入场时,车辆信息保存在链表里,并出栈来表示进入一辆车,其车位和时间自动生成,当汽车离场时,输入车位信息,显示时间,费用。并把车辆离开时间等保存在离开的链表里,然后通过车位信息的输入,即出场和离场链表表示输出。
3.5 用户界面设计
主界面分别有车辆登记,车辆离场,车场信息,退出系统四个功能,进入车辆登记窗口输入车牌号,自动生成车位信息显示。车辆离场窗口进入输入车场及 车位信息,即弹出车位信息及停车费用。车位信息即显示地上下停车场进出车辆的车辆信息,包括到达时间、离开时间、车位号、车牌号、停车费用等。退出系统即退出本软件。
4 方案实现
4.1 开发环境与工具
本程序在window7下实现和运行,并使用Visual C++6.0编译的。
4.2 程序设计关键技术
本程序主要用栈来保存车位车位的信息,当车场为空时,栈此时是满的,而当车场满时,栈是空的。所以当车辆入场时是出栈,而车辆进场时时出栈。此外就是车辆信息的保存在链表里。因为是地上下两个停车场,故我们采用两个栈和两个链表来保存其对应的信息,我们还采用了系统时间,减少了使用者的输入。
4.3 个人设计实现
4.3.1 张晓峰设计实现
设计时间车位两个结构体,以及时间函数。主函数的设计。保存车辆到达与离开信息(利用链表)
(1)时间与车位信息的结构体源程序:
struct now_time
{
int mday;
int hour;
int min;
};
struct information
{
int setnumber;
char num[10];
struct now_time reach;
struct now_time leave;
}set[MAX*2];
(2)保存车辆到来信息源程序:
车辆信息,包括车牌号,到达时间。储存在链表中,后续查询车场信息中利用此函数。
Status ListInsert_Link(LinkList &L,int i,int setnumber)
{
LNode *p,*s;
int j;
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data.stnumber=set[setnumber].setnumber;
s->data.reach.hour=set[setnumber].reach.hour;
s->data.reach.mday=set[setnumber].reach.mday;
s->data.reach.min=set[setnumber].reach.min;
copy(s->data.num,set[setnumber].num);
s->next=p->next;
p->next=s;
return OK;
}
(3)保存车辆离开
离开时,记录离开时间,算出总时间,为后续计算费用做铺垫。同样将信息储存在链表中,在离开停车场函数中利用该函数。
Status lListInsert_Link(LinkList &llist,int i,int lset,int totalhour,float fee,int day,int hour,int min)
{
LNode *p,*s;
int j;
p=llist;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data.fee=fee;
s->data.totalhour=totalhour;
s->data.stnumber=lset;
s->data.leave.mday=day;
s->data.leave.hour=hour;
s->data.leave.min=min;
copy(s->data.num,set[lset].num);
s->next=p->next;
p->next=s;
return OK;
}
(4)时间函数源代码:
采用系统时间,日小时分钟格式。分为入场时间和出场时间。
void showcome(LinkList list)
{
LNode *p;
p=list->next;
while(p)
{
printf("\n %s\t%d号\t%d日%d时%d分",p->data.num,p->data.stnumber,p->data.reach.mday,p->data.reach.hour,p->data.reach.min);
p=p->next;
}
}
void showleave(LinkList list)
{
LNode *p;
p=list->next;
while(p)
{
printf("\n %s\t%d号\t%d日%d时%d分",p->data.num,p->data.stnumber,p->data.leave.mday,p->data.leave.hour,p->data.leave.min);
p=p->next;
}
}
(5)主函数:
本程序的关键所在。对所有函数进行调用,并实现界面的显示。登记,离开,查询,退出四个部分。主菜单的建立,界面设计等。
void main()
{
int choice1,choice2,choice3,wait,ture=1;
int i;
int come1=0;
int leave2=0;
int come3=0;
int leave4=0;
int *p1,*p2,*p3,*p4;
p1=&come1;
p2=&leave2;
p3=&come3;
p4=&leave4;
char number[10];
SqStack stack_set1;
SqStack stack_set2;
SqQueue queue_turn;
initStack1(stack_set1);
initStack2(stack_set2);
initQueue(queue_turn);
LinkList llist1,llist2,clist1,clist2;
CreateList_L(llist1);
CreateList_L(clist1);
CreateList_L(llist2);
CreateList_L(clist2);
for(i=1;i<=MAX+1;i++)
{
set[i].setnumber=i;
set[i].num[1]='#';
}
system("color 3B");
printf("\n\n\n\n\n\n\n\n\n*******************欢迎使用停车场管理系统,按任意键进入主菜单******************");
do
{
getchar();
system("cls");
printf(" 欢迎使用停车场管理系统\n\n\n");
printf(" 主菜单\n\n");
printf(" *1* 汽车登记\n");
printf(" *2* 汽车离场\n");
printf(" *3* 车场信息\n");
printf(" *0* 退出系统\n\n");
printf("***请按提示输入:\n");
scanf("%d",&choice1);
switch(choice1)
{
case 1:
system("cls");
printf(" ***********************汽车登记******************\n\n\n");
if(!stack_empty(stack_set1))//进入停车场
{
printf("\n *请输入您的车牌号(例:辽A3475):");
scanf("%s",number);
enterstop(clist1,stack_set1,number,p1,1);
}
else if(!stack_empty(stack_set2))
{
printf("\n *请输入您的车牌号(例:辽A3475):");
scanf("%s",number);
enterstop(clist2,stack_set2,number,p3,2);
}
else//进入便车道等待
{
wait=w_total(queue_turn);
printf("******您好,当前停车场已满,有%d在等待!*****\n 您是否愿意进入便车道等待:\n",wait);
printf(" *1*:愿意等待!\t\t*2*:不愿意等待\n");
while(ture==1)
{
scanf("%d",&choice3);
getchar();
switch(choice3)
{
case 1:
enterlane(queue_turn,wait);//汽车进入便车道
printf("***您好,请进入便车道等待***!");
ture=0;
break;
case 2:
printf("\n***汽车离开!");
ture=0;
break;
default:
printf("\n***您好,输入错误,请重新输入!");
}
}
ture=1;
}
break;
case 2:
system("cls");
printf("***********************汽车离场******************\n\n\n");
printf(" *1* 地上车场\n");
printf(" *2* 地下车场\n");
scanf("%d",&choice2);
switch(choice2)
{
case 1:
printf(" ****************地上停车场******************\n ");
leavestop(llist1,clist1,stack_set1,queue_turn,p1,p2,1);
break;
case 2:
printf(" *****************地下停车场*****************\n ");
leavestop(llist2,clist2,stack_set2,queue_turn,p3,p4,2);
break;
default:
printf("***您输入的有误,请重新输入:");
}
break;
case 3:/*今天信息的显示*/
system("cls");
printf(" ***********************车场信息******************\n\n");
if((come1+come3)==0)
printf("**********无车辆到达!\n");
else
{
printf("**********到达%d辆车:",come1+come3);
printf ("\n**汽车信息*车牌号*\t*车位号*\t*到达时间*\t");
printf ("\n*地上车场*\t");
showcome(clist1);
printf ("\n*地下车场*\t");
showcome(clist2);
printf("\n");
}
if((leave2+leave4)==0)
printf("**********无车辆离开!\n");
else
{
printf("**********离开%d辆车:",leave2+leave4);
printf ("\n**汽车信息: **车牌号**\t**车位号**\t**到达时间**\t");
printf ("\n**地上车场:\t");
showleave(llist1);
printf ("\n**地下车场:\t");
showleave(llist2);
}
break;
case 0:
system("cls");
printf(" ***************退出停车系统!******************\n");
break;
default :
printf("***您输入的有误,请重新输入:");
}
getchar();
}
while(choice1!=0);
}
4.3.2 曹乔家设计实现
设计进入停车场和离开停车场函数,结合之前栈,链表,队列以及数组。
(1)进入停车场源代码:
void enterstop( LinkList clist,SqStack &S,char number[10],int *come,int i)
{
int e;
*come=*come+1;
Pop(S,e);
set[e].setnumber=e;
copy(set[e].num,number);
struct tm *newtime;
char am_pm[] = "AM";
time_t long_time;
time( &long_time );
newtime = localtime( &long_time );
set[e].reach.hour=newtime->tm_hour;
set[e].reach.mday=newtime->tm_mday;
set[e].reach.min=newtime->tm_min;
printf("\n\n ************请核对您的停车信息***************\n");
printf(" *停车牌号*: %s\n",set[e].num);
if(i==1)
printf(" *地上车场*: %d\n",set[e].setnumber);
if(i==2)
printf(" *地下车场*: %d\n",set[e].setnumber);
printf(" *到达时间*: %d:%d:%d\n", set[e].reach.mday,set[e].reach.hour,set[e].reach.min);
ccord(clist,*come,set[e].setnumber);
}
利用出栈函数来表示车辆进入停车场,等同于车位出停车场。利用set数组,存储进入车场的车辆信息。包括进入时间,车号等。时间函数的时候,显示到达时间,并按先下后上的顺序,选择上下两个停车场,并输出。
(2)离开停车场源代码:
Status leavestop(LinkList llist,LinkList clist,SqStack &S,SqQueue &Q,int *come,int*leave,int i)
{
char number[10];
int t,lset;
int j=1;
int totalhour;
float fee;
printf ("***请输入您的停车位号:");
do
{
scanf ("%d",&lset);
getchar();
for(int i=0;i<=MAX;i++)
{
if(set[lset].num[1]=='#')
j=0;
}
if(j==0)
{
printf(" *****车场并没有停车*******\n");
return ERROR;
}
else
{
if(lset>MAX ||lset<1)
{
printf("*****您输入有误,该车号并不存在!*******\n***请重新输入您的车位号:\n");
t=1;
}
else
{
if(set[lset].num[1]=='#')
{
printf("***该车位为空,不能进行离开操作!***\n***请重新输入您的车位号:\n");
t=1;
}
else
{
struct tm *newtime;
char am_pm[] = "AM";
time_t long_time;
time( &long_time );
newtime = localtime( &long_time );
totalhour=(newtime->tm_mday-set[lset].reach.mday)*24*60+(newtime->tm_hour-set[lset].reach.hour)*60+(newtime->tm_min-set[lset].reach.min);
fee=price*totalhour;
printf(" ***********以下是您本次停车的信息************\n");
printf(" *停车牌号*:%s\n",set[lset].num);
printf(" *停车位号*:%d\n",set[lset].setnumber);
printf(" *到达时间*:%d:%d:%d\n", set[lset].reach.mday,set[lset].reach.hour,set[lset].reach.min);
printf(" *离开时间*:%d:%d:%d\n", newtime->tm_mday,newtime->tm_hour,newtime->tm_min);
printf(" *停车费用*:%f",fee);
printf("\n\n\n\t*********谢谢您的光临,祝您一路平安********!\n\n");
printf("\n\n\n\n\t\t\tmention:press any key continue!");
getchar();
system("cls");
*leave=*leave+1;
lListInsert_Link(llist,*leave,lset,totalhour,fee,newtime->tm_mday,newtime->tm_hour,newtime->tm_min);
set[lset].num[1]='#';
Push(S,lset);
if(!EmptyQueue(Q))
{
DeQueue(Q);
printf("\n ***请停在停车便道的客户进入停车场!***\n");
if(i==1)//判断车场
{
printf("\n***输入您的车牌号(例:辽A3475):");
scanf("%s",number);
enterstop(clist,S,number,come,1);
t=0;
}
if(i==2)
{
printf("\n***输入您的车牌号(例:辽A3475):");
scanf("%s",number);
enterstop(clist,S,number,come,2);
t=0;
}
}
else
t=0;
}
}
}
}
while(t==1);
return OK;
}
离开停车场,包括计费的显示,信息存储在链表中。其中包含出场费用的计算,按分钟计时。实现输入车位号即显示车辆信息(车号,进场时间)离开时,显示所需费用。最后利用一个便车道的判空,判断是否有车辆等待入场,如果有,则停在刚刚空出的车位上。若没有,返回0;
4.3.3 王子骄设计实现
停车场栈的建立,便车道的建立,保存车位信息,地上地下两个车场,判断车场是否已满,便车道上的车辆数目函数。
(1)便车道的建立源代码:
便车道用一队列表示。
typedef struct
{
char *base;
int front;
int rear;
}SqQueue;
(2)代表停车场的栈建立源代码:
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
(3)保存车位信息:
在进入停车场时,要把车辆信息保存在链表中,调用此函数可以实现该功能。信息包括车牌号以及入场时间。
typedef struct LNode
{
struct
{
int stnumber;
char num[10];
struct now_time reach;
struct now_time leave;
float fee;
int totalhour;
}data;
struct LNode *next;
}LNode,*LinkList;
void copy(char *a,char *b)
{
int i;
for(i=0;(a[i]=b[i])!='\0';i++)
{;}
}
void CreateList_L(LinkList &L)
{
L=(LinkL
展开阅读全文