数据结构课程研发设计.docx
《数据结构课程研发设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程研发设计.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构课程研发设计
《数据结构》课程设计报告
信息工程学院
软件工程专业
题目:
停车场管理系统
班级:
软件1班第1组
组长:
姓名:
王崇文学号:
2011306040125
组员:
姓名:
谢天航学号:
2011306040130
指导老师:
曲朝阳、郭晓利、刘志颖
日期:
2012年12月26日
一、程序设计目标
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
矚慫润厲钐瘗睞枥庑赖。
二、问题描述
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。
以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
聞創沟燴鐺險爱氇谴净。
三、需求分析
本次数据结构课程设计的具体内容是停车场管理系统,该系统用栈结构模拟停车场,限定停车场的容量为n,用队列结构模拟等待的便道,空间不限制。
残骛楼諍锩瀨濟溆塹籟。
车辆的信息包括:
车牌号、汽车到达/离去标志、到达/离去时刻等。
按照从终端读入的数据序列进行模拟管理。
每辆车需要四个数据,其中车辆数据为:
1表示到达,2表示离去,3表示车辆显示列表,4表示程序结束。
车辆牌照为整型数据。
进场或离场时间同样为整型数据。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
酽锕极額閉镇桧猪訣锥。
停车场管理系统主要实现以下几个功能:
(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。
(2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。
(3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。
实现停车场的调度功能。
该程序设计可以完整的模拟停车场的管理过程。
每一组输入数据包含三个数据项:
汽车“到达”或“离去”信息,汽车牌照号码以及汽车到达或离去的时刻。
对每一组输入数据操作后的输出结果为:
①若是车辆到达,则输出汽车在停车场内或便道上的停车位置;②若是汽车离去,则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上停留的时间不收费)。
彈贸摄尔霁毙攬砖卤庑。
栈以顺序结构实现,队列以链表结构实现。
本设计的小组分工如表1所示。
表1小组分工
题目
停车场管理
王崇文
车辆到达、车辆离开模块
谢天航
停车场内停放车辆的信息以及退出程序
四、概要设计
按照题目的要求,此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能。
謀荞抟箧飆鐸怼类蒋薔。
因此,可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。
至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。
当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。
厦礴恳蹒骈時盡继價骚。
设计方案:
对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。
至于通道上车辆的停放则用一个链队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。
对于要对停车场内的车辆根据其停放时间收取相应的停车费用,可以记录下车辆进入以及离开停车场的时间,再用时间差乘以相应的单价并且打印出最后的费用就可以实现了。
我主要实现车辆停车场内停放车辆的信息模块和退出程序模块。
茕桢广鳓鯡选块网羈泪。
首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。
在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开这两个函数模块。
其中,在车辆的离开那个模块函数中又调用了车辆的离开那个模块函数,在停车场内停放车辆信息的那个模块函数中,又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。
最后,从调出的这四个函数中回到主函数结束整个程序的运行。
鹅娅尽損鹌惨歷茏鴛賴。
以上两个模块中,出现的调用的函数为:
a)intArrival(SeqStackCar*,LinkQueueCar*);//车辆到达登记籟丛妈羥为贍偾蛏练淨。
车辆到达时,先登记车辆车牌号码。
然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。
預頌圣鉉儐歲龈讶骅籴。
b)voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);//车辆离开处理渗釤呛俨匀谔鱉调硯錦。
通过输入离开车辆的位置处理,然后调用PRINT(CarNode*p,introom);函数进行收费。
然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。
铙誅卧泻噦圣骋贶頂廡。
c)voidList(SeqStackCar,LinkQueueCar);//显示车场内和便道上的车辆情况擁締凤袜备訊顎轮烂蔷。
用个switch();函数选择显示车场内或是便道上的车辆情况。
包括对下面两个子函数的调用:
voidList1(SeqStackCar*S);
voidList2(LinkQueueCar*W);//分别为显示车场和便道上的车辆情况贓熱俣阃歲匱阊邺镓騷。
d)voidPRINT(CarNode*p,introom);//车辆离开时的收费
这个函数由车辆离开的函数调用,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。
即只能当天停,当天开走。
坛摶乡囂忏蒌鍥铃氈淚。
算法流程图
以堆栈来模拟停车场和以堆栈里的数据元素模拟设计成汽车的车牌号,以队列来模拟停车场外的通道且也将其储存的数据元素设计成汽车的车牌号
蜡變黲癟報伥铉锚鈰赘。
是
否
不作任何计算
是
否
5、详细设计
(Ⅰ)车辆信息的表示
车辆可看成是一个节点,设计成一个结构体,车辆信息包括:
车牌号码,车辆的进站时间和离开停车的时间,定义如下:
買鲷鴯譖昙膚遙闫撷凄。
typedefstructnode{
charnum[10];//车牌号码
Timereach;//到站时间
Timeleave;//离开时间
}CarNode;
(Ⅱ)时间、栈和队列的定义
时间是由小时和分钟表示的,有两部分数据,所以,类似于复数的表示一样,设计两个变量分别存储小时和分钟。
如:
綾镝鯛駕櫬鹕踪韦辚糴。
typedefstructtime{
inthour;
intmin;
}Time;
停车场内用栈表示:
typedefstructNODE{
CarNode*stack[MAX+1];//栈用顺序表示
inttop;
}SeqStackCar;
便道上的车辆表示:
typedefstructcar{
CarNode*data;//便道上的车用链表表示
structcar*next;
}QueueNode;
typedefstructNode{
QueueNode*head;//设置头指针、尾指针。
。
QueueNode*rear;
}LinkQueueCar
六、软件说明书
本系统为存车信息管理软件,能实现车场存车及便道存车信息的输入,输出,查找等功能,并建立和更新的存车费用信息保存于文件输出或打印。
对于查找等功能能够按存车位置及车牌号分别进行。
每辆车的相关信息包括:
车牌号,进站时间,出站时间,存车位置,停车费用等。
驅踬髏彦浃绥譎饴憂锦。
本系统功能还需完善,操作简单,只是供学习之用,并不能作为实际生活使用。
下面介绍了此软件的使用说明:
1.停车场.exe;
2.进入演示系统后首先是一个用户及管理员使用注意事项界面,进入后会出现菜单选项。
1.车辆进站2.车辆出站3.存车信息4.离开系统
请选择:
1|2|3|4.
这时可按照提示进行你想要的操作。
3.对于1-4的具体操作与内容请详见前面的调试分析,您便可以轻松操作了!
七、源程序清单
#include
#include
#include
#defineMAX3//停车场最大容量为3辆,便于观察
#defineprice0.05//每分钟单价
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*);
intInitQueue(LinkQueueCar*);
intArrival(SeqStackCar*,LinkQueueCar*);
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);猫虿驢绘燈鮒诛髅貺庑。
voidList(SeqStackCar,LinkQueueCar);
voidoption()
{
inti;
charchoice;
for(i=1;i<=240;i++)
printf("\004");
printf("\n\n\n\t数据结构课程设计");
printf("\n\n\n\t小组成员:
王崇文谢天航");锹籁饗迳琐筆襖鸥娅薔。
printf("\n\n\n\t班级:
软件111");
printf("\n********************************************************************************");構氽頑黉碩饨荠龈话骛。
printf("\n\n\n\t是否进入停车场管理系统(y/n)?
");輒峄陽檉簖疖網儂號泶。
choice=getchar();
if(choice=='N'||choice=='n')
exit(0);
}
voidmain()
{
SeqStackCarEnter,Temp;//函数及变量的声明定义SeqStackCar数据类型的Enter,Temp;尧侧閆繭絳闕绚勵蜆贅。
LinkQueueCarWait;//定义LinkQueueCar数据类型的Wait;
intch;//定义ch的类型为int来控制你的选择输入;
system("color1A");//控制屏幕颜色
InitStack(&Enter);//模拟停车场[InitStack(&Enter)],将Enter的地址传给子函数InitStack进行初始化车站;识饒鎂錕缢灩筧嚌俨淒。
InitStack(&Temp);//模拟通道[InitStack(&Temp)],将Temp的地址传给子函数InitStack进行初始化让路的临时栈;凍鈹鋨劳臘锴痫婦胫籴。
InitQueue(&Wait);//模拟通道[InitQueue(&Wait)],将Wait的地址传给函数InitQueue进行初始化通道;恥諤銪灭萦欢煬鞏鹜錦。
option();
while
(1)
{
printf("\n§※§※§※§※§※§欢迎进入停车场管理系统.§※§※§※§※§※§\t\n\n");鯊腎鑰诎褳鉀沩懼統庫。
printf("\n\t※◎※◎※◎※◎1.车辆到达登记.※◎※◎※◎※◎\t\n");
printf("\n\t※◎※◎※◎※◎2.车辆离开登记.※◎※◎※◎※◎\t\n");
printf("\n\t※◎※◎※◎※◎3.车辆列表显示.※◎※◎※◎※◎\t\n");
printf("\n\t※◎※◎※◎※◎4.退出系统.※◎※◎※◎※◎\t\n\n");
while
(1)
{
printf("请选择:
");
scanf("%d",&ch);
if(ch>=1&&ch<=4)break;
elseprintf("\n输入有误,请重新选择:
1~4:
");
}
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);
}
elsereturn(-1);
}
voidPRINT(CarNode*p,introom){//车辆收费
intA1,A2,B1,B2;
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应交费用为:
%2.1f元",((B1-A1)*60+(B2-A2))*price);釷鹆資贏車贖孙滅獅赘。
free(p);
}
//=======================车辆到达=====================
intArrival(SeqStackCar*Enter,LinkQueueCar*W){
CarNode*p;//定义p指针类行为CarNode
QueueNode*t;//定义t指针类行为QueueNode
p=(CarNode*)malloc(sizeof(CarNode));// 用malloc开辟车子结点CarNode的空间,同时用p指针指向新开辟空间的首地址;怂阐譜鯪迳導嘯畫長凉。
flushall();//刷新缓冲区,
printf("\n请输入车牌号(例:
吉B6666):
");
gets(p->num);//输入车牌号信息
if(Enter->top{
Enter->top++;//进入的车辆数量加1;
printf("\n车辆在车场第%d位置.",Enter->top);
printf("\n车辆到达时间:
");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
Enter->stack[Enter->top]=p;//将p指针里包含的所有信息赋值给停车场栈的结点里;谚辞調担鈧谄动禪泻類。
return
(1);
}
else//(输入的车辆数大于车场的存储量)
{
printf("\n该车须在便道等待!
有车位时进入车场");
t=(QueueNode*)malloc(sizeof(QueueNode));//站满入队列(用malloc开辟便道的存储空间(即一个结点信息),同时用QueueNode型指针接收新开辟结点的首地址;)嘰觐詿缧铴嗫偽純铪锩。
t->data=p;//将p指针里包含的所有信息赋值给通道的结点里,用t->data储存
t->next=NULL;//令t->next=NULL;
W->rear->next=t;//让新到的暂停车子连接到队尾上,
W->rear=t;//同时将队尾挪移到下一位;
return
(1);
}
}
//===================车辆离开================================熒绐譏钲鏌觶鷹緇機库。
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)鶼渍螻偉阅劍鲰腎邏蘞。
{
introom;//定义room的类型为int:
记录车辆在停车场中的位置
CarNode*p,*t;//定义p、t的指针类型为CarNode:
p指针用来储存离开车辆的信息,t指针用来储存从通道上入停车场的车辆信息纣忧蔣氳頑莶驅藥悯骛。
QueueNode*q;//定义q的指针类型为QueueNode:
用q指针控制通道车子的移动
if(Enter->top>0)//判断车场是否为空(停车场内车辆的数量大于0,即有车)颖刍莖蛺饽亿顿裊赔泷。
{
while
(1)
{
printf("\n请输入车在车场的位置/1--%d/:
",Enter->top);
scanf("%d",&room);
if(room>=1&&room<=Enter->top)break;//输入的要离开的车子的位置不小于1且不大于停车场内最大停放数量就跳出循环;濫驂膽閉驟羥闈詔寢賻。
elseprintf("\n输入有误,请重输:
");
}
while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。
(停车场内停放车辆的位置大于输入的要离开车子的位置)銚銻縵哜鳗鸿锓謎諏涼。
{
Temp->top++;//靠近大门的车子就要退出让道,安置到临时栈中且同时位置加1;
Temp->stack[Temp->top]=Enter->stack[Enter->top];//将停车场内栈顶信息赋给临时栈的栈顶挤貼綬电麥结鈺贖哓类。
Enter->stack[Enter->top]=NULL;//然后将停车场内栈顶设置为空
Enter->top--;//位置减1
}
p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。
便于车子信息的打印赔荊紳谘侖驟辽輩袜錈。
Enter->stack[Enter->top]=NULL;//将停车场内栈顶设置为空
Enter->top--;
while(Temp->top>=1)//再把临时栈里的车辆进停车场
{
Enter->top++;//将停车场内栈顶位置加1
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便道不为空同时满足停车场内的栈顶小于3裊樣祕廬廂颤谚鍘羋蔺。
{
q=W->head->next;//用q指针指向便道头指针的后继
t=q->data;//再将q的存储车子信息数据赋给指针t
Enter->top++;//将停车场内栈顶位置加1
printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
printf("\n请输入%s号