停车场管理系统的设计与实现 数据结构课程设计.docx
熬据信相裸程被计题目:停车场管理系统班级:网络工程姓名:朱锦涛学号:E31314037完成日期:2015年口月15日一.需求分析1.停在便道;2 .停在车库;3 .从车库移到便道;4 .从便道移到车库;5 .从车库取车;6 .从便道取车;综上所述可知,总共有4种停车方式。1 .若始终停在便道中,须要在进入便道时以浮点数输入进入时间,当选择6取车时,须要输入在便道中停车的时间。在便道中提车时会显示进入的时间,以及是否须要发票,在计算完停车费用后退出主菜单。F面是菜单,请继续选择或者按。退出了迎理到便道停卒,我们将谒诚为无原务!育输入列达利血窗嬲3膘罐盛蹄制!择道库选里行蜀至wis库is系-S1234S606.小便迫取车。.通出系统元祝圭曷是r.车的发.M票统!的羊要1.*t道S6ss本便34的华再到,甫3趋人择.曾S迎选好俣谢s下面是菜注,请维会选择或者按。退出Iis库is系4s1.2.3.4.s.6.*诩-IT2 .若始终停在车库中,会在进入时检测车库是否满,若不满,允许进入,同样提示检入到达时间,当选择5取车时,须要输入在车库停车时间。提车时,会显示进入的时间,以及是否须要发票,在计算完停车费用后退到主菜单。,请继续迷件或者传。退出面是菜单,请继续选择或者按e退出Is)3245车库停车成功!请输入”走进1停在便也停在半从馔咀杉到华从丰虎取车小便货电车5.从丰盛第64便读思穴艘到丰度堤丰,我们将画诚为您服务!青敏到达军库时间,来堡is库¢系64i1.H出痛1.2.3.4.S.6.理库路鸣fAH-但并,6迩夜道电军入车牌照!牌照为3!王元.生宰的S.00统雷等5.系库4s善本车32契0三三到:你手使次是企.您迎83晶瞽黑叫球呢氧SJ发惘.1要65需3 .若先在车库停车后又转到便道停车,则会先检测车库是否满了,这是这个状况满意的放大前提,之后须要输入到达车库时间,其实这也没什么用,因为最终计算费用时,只会加上转移位宽的20元费用和在便道停的费用。在提车时会显示有在本停车场转移位五的信息。'E:CeM«gDebuga®enj.1.exe-4 .沙电皆理车库5 .从中座即丰6汕便满成本。.退出系统更4到tr努费,车间4S间停时21时道库.的1三到达的便检到牌达.6,.15-!纪的车辆已经移动到便道I谓继续选择或者按。退出请输入86来进行选择.ff1.2 .像在主库3 .从军虚校到便道4.从快道核同丰厚S.从奉库取孥6A1.!。.退出系统F面是菜单,请缠矮选择或者按。退出I6日£同路发要H1.-主有高票财!舌的发.M票统某与要s6晶:的tS4要道45车tt本便21三tSB你M到集甫第.11;.迎Bg的霍好保谢普请你择道库更丰来aH库系6在在车出4 .若先在便道上停车,后又到车库停,原理同3,在此不再赘述C迎¢,更知到壬庠停至!的爱军到达也的时军是2-1的瞪车啤寞是:4321辐入狗送车库的时间I=!喇军辆已经移动到车库!面是菜单.请继续选择或名按。退出1,请继续选仔或者按。退出,6是Js-不示W21?WtS本43s不喙前I8MW发要"wt.s三迎B3saf选好保谢?*J*B*TnTrr-*,!王有高票!.一T古的发.2票统用的珞车要32/票发.8要露.一穴行翦至道库道系r6Hii车®U出9停停以K=,退S1234S择道库选僵行进道库蓊e¾H戛道系F爰wh平便出&tr1.*=J畲12345Gg时库车达至!S的位二.概要设计1 .由于栈的特殊出栈入栈依次,所以全部进入车库的车辆必需遵守“先进后出”的依次来停车和提车,由于栈是依次结构,所以在进入车库时须要检测车库是否饱和,在提车时也须要检测车库是否为空;2 .同时,队列须要满意“先进先出”的思想,但此次试脸用的链式结构,一般来说,不存在饱和状况,但在提车时候须要检测便道是否有车。3 .栈的数据域存放进入车库的时间,车牌,队列节点数据域存放进入便道的时间车牌,设置f1.ag标记是否在停车场内更改停车位置,有更改则矍为1,否则为0。4 .假如一辆车车库移到便道,除了更换进入便道的时间外,车牌号从链表的数据里得到,从便道移到车库也类似。另外,更改位置前停放费用不计入最终的费用。5 .除了要输入进入时间,在更换停车位置时须要揄入进入时间,在最终提车时须要输入离开时间,便利计算总费用。三.具体设计1 .主函数设置两个选择:最外层的选择显示是用户自己选择停车还是系统选择停车位置,最里层的选择为主菜单。2 .进入车库(入栈)voidPush(STACKAGarage,f1.oatc_garage_time.intid,intf1.ag);c_garage_time:进入车库时间id;车牌号f1.ag:显示是否更改过停车位矍3 .离开车库(出栈)voidPop(STACK&Garage.f1.oat&cgarage-time.int&id.int&fIag);将后面三个形参设置为引用调用是为了得到数据域里的数据,供主函数运用4 .进入便道voidEnQueue(1.inkOueue&Shortcut,f1.oatc_shortcut_time,intidtintf1.ag);5 .离开便道voidDeOueue(1.inkueeShortcut,f1.oat&c_shortcut_time,int&id,int&f1.ag);将后面三个形参设置为引用调用是为了得到数据域里的数据,供主函数运用。(其实在主函数传地址给调用函数也可以,但是不知道为什么没有试脸胜利。)6 .showmenu()和ShOWChOiCeO都是显示菜单函数7 .8 .f1.oatcharge(f1.oatsum_time,intf1.ag,intinvoice);f1.oat函数是计算费用函数,sum_timesh是在最近一个停车位置的停车时间,在主函数已经由离开时间减去进入时间计算好,f1.ag为标记位,为1,须要多支付20元的管理费用,invoice是须要发票的标记,须要为1,则最终费用为原有费用的基础上增加5,同时用一个浮点型的返回值返回给主函数运用,同时主函数用.2f来限制最终只显示小数点最终两位。四.源程序/*2015年11月15日21:21:37本次试验主要熟识栈和队列的存储方式,同时结合依次表和链表学问具体试验要求见代码底部*/incIude<stdio.h># inc1.ude<ma1.1.oc.h># incIude<stdIib.h># incIude<time.h># incIude<string.h>typedefstructCar车库(f1.oatc_garage_time;到达在车库时间intid;汽车牌照intf1.ag;/标记位置,在车库为1,在便道为0CAR;typedefstructCar1/便道f1.oatc_shortcut_time;到达便道上的时间,以小时为单位(下同)intid;汽车牌照intf1.ag;structCar_1*next;CAR_1;typedefstructStack/依次栈(CAR*base;栈顶指针CAR*top;栈底指针STACK;此次代码形参力口实参之间是引用调用,故不须要传地址typedefstructQueue链式队列(CAR_1*front;队头指针CAR1*rear;/队尾指针I1.inkQueue;f1.oatprice(f1.oatz);/计算停车费用voidInitStack(STACKSGarage);/初始化车库的依次栈!boo1.Is_empty(STACKGaraage);boo1.Is_fu1.I(STACK&Garaage);voidPush(STACK&Garage,f1.oatc_garage_time,intid,intf1.ag);voidPop(STACK&Garage,f1.oat&c_garage_time,int&id,int&f1.ag);voidInitQueue(1.inkQueue&Shortcut);voidEnQueue(1.inkQueue&Shortcut,f1.oatc_shortcut_time,intid,intf1.ag);voidDeQueue(1.inkQueue&Shortcut,f1.oat&c_shortcut_time,int&id,int&fIag);voidshowmenu();voidshowchoice();f1.oatcharge(f1.oatsum_time,intf1.ag,intinvoice);计费函数intmain()f1.oatsum_time;在停车场的时间f1.oatc_shortcut_time;/到达便道上的时间,以小时为单位(下同)f1.oatr_shortcut_time;离开便道世间f1.oatc_garage_time;到达在车库时间f1.oatJgaragejtime;离开车库时间intid;汽车牌照intinvoice;是否须要发票,须要为1,不须要为0srand(time(0);f1.oatr_c_garage_time;intr_id;intr_f1.ag;f1.oatr_c_shortcut_time;intr_id1;intr_fIag1;STACKGarage;InitStack(Garage);初始化车库1.inkQueueShortcut;InitQueue(Shortcut);初始化便道charchoice2;showchoice();scanf("%c",choice2);whiIe(choice2!='Q'&&choice2!='q')switch(choice?)case'p':case,P':intchoice1;showmenu();scanf("d",&choice1);whiIe(choice1!=0)switch(choice1)(case 1 :Printf("欢迎您到便道停车,我们将竭诚为您服务!n");Printf("请输入到达时间:n");scanf("%f",&c_shortcut_time);Printf("请输入车牌照(阿拉伯数字)");scanfid);EnQueue(Shortcut,c_shortcut_time,id,0);Printf("恭喜!牌照为$d的车主在便道停车胜利!",id);break;case 2 :Printf("欢迎您到车库停车,我们将竭诚为您服务!n");if(Is_fu1.I(Garage)Printf("车道已经停满,请选择便道停车!");eISePrintf("请输入到达车库时间:n");scanf("f",&c_garage_time);Printf("请输入车牌照(阿拉伯数字)");scanfid);Push(Garage,c_garage_time,id,O);Printf("恭喜!牌照为d的车主在车库停车胜利!",id);1break;case 3 :Printf("欢迎您更换到便道停车!nn);if(Is_empty(Garage)Printf("车库里没有车,你的选择有误!");)eISePop(Garage,r_c_garage_time,rid,Jf1.ag);Printf("您的爱车到达车库时间是%fn”,r_c_garage_time);Printf("您的爱车牌照是:%dn",r_id);printf("请输入到达便道的时间:n");scanf("%f",&c_shortcut_time);EnQueue(Shortcut,c_shortcut_time,rid,1);Printf("恭喜!您的车辆已经移动到便道!");break;case 4 :Printf("欢迎您更换到车库停车!n");if(Shortcut,front=Shortcut.rear)Printf("便道上没有车,您的选择有误!)eISeDeQueue(Shortcut,r_c_shortcut_time,r_id1,r_fIagD,Printf("您的爱车到达便道时间是舟fn”,r_c_shortcut_time);Printf("您的爱车牌照是:%dn",r,id1);Printf("请输入到达车库的时间:n");scanf("%f",&c_garage_time);Push(Garage,c_garage_time,rid1,1);Printf("恭喜!您的车辆已经移动到车库!");)break;case 5 :Printf("欢迎您到车库取车!n");if(Is_empty(Garage)(Printf("车库里没有车,你的选择有误!");)eIsePop(Garage,r_c_garage_time,rid,r_fIag);Printf("牌照是:%d的车主您好,您的车到达车库时间是fn",Jid,r_c_garage_time);if(r_f1.ag=1)Printf("您的车在停车场中有更换停放位置!n");printf("请输入您的爱车的离开时间:");scanf("%f",&r_garage_time);sum_time=r_garage_time-rcgarage一time;Printf("请选择是否须要发票1:表示须要发票,0表示不须要发票");scanf("d",Sinvoice);if(invoice=1)Printf("您好,请缴费%.2f元n",charge(sum_time,r_f1.ag,1);Printf("请保管好您的发票!n”);Printf("感谢您运用本系统,祝您一路顺风!n");)eISe(Printf("您好,请缴费%.2f元n",charge(sum_time,r_f1.ag,O);Printf("感谢您运用本系统,祝您一路顺风!n");)break;case 6 :Printf("欢迎您到便道取车!n");if(Shortcut,front=Shortcut.rear)Printf("便道上没有车,您的选择有eIseDeQueue(Shortcut,r_c_shortcut_time,Jid1,r_fIagD*,Printf("牌照是:*d的车主您好,您的车到达便道时间是%fn",Jid1,r_c_shortcut_time);if(r_f1.ag1=1)Printf("您的车在停车场中有更换停放位置!n");printf("请输入您的爱车的离开时间:scanf("%f",&r_shortcut_time);sum_time=r_shortcut_time-r_c_shortcut_time;Printf("请选择是否须要发票1:表示须要发票,0表示不须要发票");scanf("d",Sinvoice);if(invoice=1)Printf("您好,请缴费%.2f元n",charge(sum_time,r_f1.ag,1)/2);Printf("请保管好您的发票!n(');Printf("感谢您运用本系统,祝您一路顺风!n");eISe(Printf("您好,请缴费%.2f元n",charge(sum_time,r_f1.ag,O)/2);Printf("感谢您运用本系统,祝您一路顺风!n");)/switch结束大括号printf("n");printf("n");Printf("下而是菜单,请接着选择或者按。退出!");shov/menu();scanf("d",AchoiceD;/whi1.e结束大括号break;自主选择菜单结束case,s':case'S':Printf("您好,已经由系统为您做出了选择!n");choice1=randO%2+1;whiIe(choice1!=0)(switch(choice1)(case 1 :Printf("欢迎您到便道停车,我们将竭诚为您服务!r);printf("请输入到达时间:n");scanf("f",&c_shortcut_time);Printf("请输入车牌照(阿拉伯数字)scanfid);EnQueue(Shortcut,c_shortcut_time,id,0);Printf("恭喜!牌照为$d的车主在便道停车胜利!",id);break;case 2 :Printf("欢迎您到车库停车,我们将竭诚为您服务!n");if(Is_fuII(Garage)Printf("车道已经停满,请选择便道停车!*,);)eIse(Printf("请输入到达车库时间:n");scanf("f",&c_garage_time);Printf("请输入车牌照(阿拉伯数字)");scanfid);Push(Garage,c_garage_time,id,O);Printf("恭喜!牌照为$d的车主在车库停车胜利!",id);)break;case 3 :Printf("欢迎您更换到便道停车!nn);if(Is_empty(Garage)Printf("车库里没有车,你的选择有误!)eISePop(Garage,r_c_garage_time,r_id,r_f1.ag);Printf("您的爱车到达车库时间%fn",r_c_garage_time);Printf(“您的爱车牌照是:%dn",r_id);printf("请输入到达便道的时间:n");scanf("f",&c_shortcut_time);EnQueue(Shortcut,c_shortcut_time,rid,1);Printf("恭喜!您的车辆已经移动到便道!");)break;case 4 :Printf("欢迎您更换到车库停车!n");if(Shortcut,front=Shortcut,rear)(Printf("便道上没有车,您的选择有误!");)eIseDeQueue(Shortcut,r_c_shortcut_time,rid1,r_fIag1)9printf("您的爱车到达便道时间%fn",r_c_shortcut_time);Printf("您的爱车牌照是:%dn",r_id1);Printf("请输入到达车库的时间:n");scanf("%f,1.Scgaragetime);Push(Garage,c_garage_time,r_id1,1);Printf("恭喜!您的车辆已经移动到车库!");)break;case 5 :Printf("欢迎您到车库取车!n");if(Is_empty(Garage)Printf("车库里没有车,你的选择有误!”);)eISePop(Garage,r_c_garage_time,r_id,r_f1.ag);Printf("牌照是:$d的车主您好,您的车到达车库时间是%fn",r_id,JJgarageJtime);if(r_f1.ag=1)Printf("您的车在停车场中有更换停放位置!n");printf("请输入您的爱车的离开时间:scanf("%f",&r_garage_time);sum_time=r_garage_time-JJgarage_time;Printf("请选择是否须要发票1:表示有发票,。表示不须要发票");scanf("d",Sinvoice);if(invoice=1)Printf("您好,请一费.2f元n",charge(sumtime,r_f1.ag,1);Printf("请保管好您的发票!r,);Printf("感谢您运用本系统,祝您一路顺风!n");)e1.sePrintf("您好,请一费.2f元n",charge(sum_time,r_fIag,0);Printf("感谢您运用本系统,祝您一路顺风!n");)break;case 6 :Printf("欢迎您到便道取车!n");if(Shortcut,front=Shortcut,rear)PrintfC'便道上没有车,您的选择有DeQueue(Shortcut,r_c_shortcut_time,r_id1,r_fIag1)Printf("牌照是:%d的车主您好,您的车到达便道时间是%fn”,Jid1.,JjshortcUtjtime);if(r_fIag1=1)Printf("您的车在停车场中有更换停放位置!n");Printf("请输入您的爱车的离开时间:scanf("f",&r_shortcut_time);sum_time=r_shortcut_time-r_c_shortcut_time;Printf("请选择是否须要发票1:表示有发票,。表示不须要发票");scanf("d",Sinvoice);if(invoice=1)Printf("您好,请缴费%.2f元n",charge(sum_time,r_fIag,1)/2);Printf("请保管好您的发票!n");Printf("感谢您运用本系统,祝您一路顺风!n");eISe(Printf("您好,请缴费%.2f元n",charge(sum_time,r_f1.ag,O)/2);Printf("感谢您运用本系统,祝您一路顺风!n");)/switch结束大括号printf("n");printf("n");Printf("下而是菜单,请接着选择或者按。退出!");shov/menu();scanf("d",AchoiceD;/whi1.e结束大括号break;/最外层switch结束大括号scanf("%c",&choice2);showchoice();)最外层Whi1.e大括号return0;voidInitStack(STACKSGarage)/初始化车库的依次栈!Garage.base=(CAR*)maIIoc(sizeof(CAR)*100);if(NU1.1.=Garage.base)(Printf("动态内存安排失败!n");exit(-1);e1.se(Garage.top=Garage.base;boo1.Is_empty(STACKSGarage)(if(Garage.top=Garage.base)returntrue;/栈空是返回true1e1.sereturnfa1.se;boo1.Is_fu1.I(STACK&Garage)if(Garage.top-Garage.base>=100)returntrue;栈满是返回true)eIsereturnfa1.se;voidPush(STACK&Garage,f1.oatc_garage_time,intid,intfIag)(if(Is_fuII(Garage)(Printf("车库已满,请退出!”);exit(-1);)eIse(Garage.top->c_garage_time=c_garage_time;Garage.top->id=id;Garage,top->f1.ag=f1.ag;Garage.top+÷voidPop(STACK&Garage,f1.oat&c_garage_time,int&id,int&fIag)(if(Is_empty(Garage)(Printf("车库已空,您的选择有错误!");exit(-1);)eIse(Garage.top一;Cgaragetime=Garage.top->cgaragetime;id=Garage.top->id;f1.ag=Garage,top->fIag;voidInitQueue(1.inkQueue&Shortcut)Shortcut.front=Shortcut,rear=(CAR_1*)maIIoc(sizeof(CAR1);if(!Shortcut,front)exit(-1);Shortcut,front->ne×t=NU1.1.;voidEnQueue(1.inkQueue&Shortcut,f1.oatc_shortcut_time,intid,intf1.ag)(CAR1*p;P=(CAR_1*)maIIoc(sizeof(CAR_1);if(!p)exit(-1);e1.se(p->c_shortcut_time=c_shortcut_time;p->id=id;p->f1.ag=f1.ag;p->next=NU1.1.;Shortcut,rear->next=p;/rear指向新进入便道的车Shortcut,rear=p;voidDeQueuedinkQueue&Shortcut,f1.oat&c_shortcut_time,int&id,int&f1.ag)(CAR_1*p;if(Shortcut,front=Shortcut,rear)/队列为空,无法出队exit(-1);p=Shortcut.front->ne×t;CshortCUt_time=p->c_shortcut_time;id=p->id;f1.ag=p->f1.ag;if(Shortcut,rear=p)Shortcut,rear=Shortcut.front;free(p);voidshowchoice()printf("n");prjtf("*n").Printf("*请输入P或S来进行选择(不分大小写)*n");printf(,ttP.自助选择停车地点n");PrintfCIttS.系统为您选择n");Printf(nttQ.退出系统n");Printf(*n");voidshowmenu()printf("n");Printf("*n");printf(*请输入06来进行选择*r");Printf("tt1.停在便道n");Printf("tt2停在车库n");printf("tt3.从车库移到便道n");printf(,tt4.从便道移到车库n");printf(,tt5.从车库取车n");printf("tt6.从便道取车n");Printf("tt.退出系统n");Printf("*n");f1.oatcharge(f1.oatsum_time,intf1.ag,intinvoice)(f1.oatmoney;if(invoice=1)/须要发票,须要在原有基础上加上15的费用if(f1.ag=1)中途有更改停车地点if(sum_time<0.1)/小于10分钟money=(0+20)*1.15;eIseif(sumtime<0.5)money=(5+20)*1.15;eIseif(sumtime<1)money=(8+20)*1.15;e1.seif(int)sum_time<12)money=(int)sum_time-1)*6+8+20)*1.15;e1.semoney=(int)sumtime-12)*5+8+11*6+20)*1.15;e1.se始终停在车库中(if(sum_time<0.1)小于10分钟money=(0+20);e1.seif(sum_time<0.5)money=(5+20);eIseif(sumtime<1)money=(8+20);e1.seif(int)sum_time<12)money=(int)sum_time-1)*6+8+20;e1.semoney=(int)sum_time-12)*5+8+11*6+20;1e1.se不须要发票,不须要20的管理费if(f1.ag=1)中途有更改停车地点if(sum-time<0.1)/小于10分钟money=0*1.15;e1.seif(sum_time<0.5)money=5*1.15;e1.seif(sum_time<1)money=8*1.15;e1.seif(int)sum_time<12)money=(int)sum_time-1)*6+8)*1.15;eIsemoney=(int)sum_time-12)*5+8+11*6)*1.15;1e1.se/始终停在车库中if(sum_time<0.1)/小于10分钟money=0;e1.seif(sum_time<0.5)money=5;e1.seif(sum_time<1)money=8;eIseif(int)sumtime<12)money=(int)sum_time-1)*6+8;e1.semoney=(int)sum_time-12)*5+8+11*6;)returnmoney;*停车场管理系统的设计与实现问题描述:设计一个停车场管理系统,模拟停车场的运作,此程序应具备以下功能:(1) 若车辆到达,则显示汽车在停车场车库内或便道上的停车位置:(2) 若车辆离去,则显示汽车在停车场内停留的时间和应交纳的费用。总费用应为在便道上的费用加上在停车场车库内的费用。基本要求:(1) 要求以栈模拟停车场车库,以队列模拟车场外的便道,依据从终端读入的输入数据序列进行模拟管理;(2) a车主进入停车场后,若车库和便道都有空闲,则由车主选择具体停在车库还是便道上;b.在车库和便道都有空闲的状况下,车辆停放位置也可应车主的要求选择更换(如原先停放在便道中的车辆,车主可以要求停在车库内);c.若车主没有特殊要求,则依据栈和队列的依次由系统自动安排位子。(3) 要求处理的数据元素包括的数据项为:汽车"到达"和"离去"的时间信息(包括在便道上和车库内的时间)、汽车牌号等;(4) 要求栈以依次结构实现,队列以链表实现。测试数据:自行设计一组在停车场车库内停车的数据和在便道上停车的数据。实现提示:(1)该停车场车库能容纳车辆的数量,便道上的停车数量。(2)车辆到达对应栈或队列的”入"操作,车辆离去对应栈或队列的"出"操作。(3)费用计算问题:a.应分等级收取费用,对于停在车库的车辆,非常钟以内免费,半小时内5元,第一个小时8元,以后每超过一个小时6元。b.停留12小时以上者另加每小时5元的托管费(前12小时不收托管费)。d.对索要发票者,另加总费用15%的税费。e.对车主更换位置的车辆,收取20元的系统维护费。f.在便道上停留的时间依据半价收取。*/五.用户手册请依据主菜单操作,留意括号内的提示内容即可。