还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
实验题目实验六停车场管理班级11计算机2班姓名仇越学号11070204日期
10.30
一、需求分析
1.程序的功能设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用
(1)建立静态数组栈作为模拟停车场,动态链表栈作为模拟便道
(2)车辆到达,停入停车场或者便道,记录车牌号,到达时间
(3)车辆离开,记录离开时间,输出停车时间和收费将便道内车停入停车场,记录进入时间
(4)列表显示停车场,便道内车辆情况
(5)列表显示历史记录(已经离开车的车牌号,到达离开时间,收费)
2.输入输出的要求
(1)输入字符串车牌号,到达时间,离开时间5插入新的链表尾void EnQucucLinkQueucCar*wait/*插入新的队尾*/{QueueNode*p=wait-rear;wait-rear=QucueNode*mallocsizeofQueueNode;ifIwait-rear exitOVERFLOW;p-next=wai t-rear;wait-rear-next=NULL;6车辆离开,登记离开时间,输出停车时间和收费将便道内车辆int LeaveSeqStackCar*cnter,ScqStackCar*temp,LinkQueucCar*wait,LinkQueueCar*leavecarint i,j=enter-top;QueueNode*q=NULL;if!enter-top〃若停车场内没有车则返回printf〃停车场内没有车〃;return ERROR;prin〃请输入车在停车场中的位序lid:〃,j;scanf%d〃,i;whileil||ienter-top{printf输入错误,请重新输入ITd:j;scanf飞d,i;whiletemp-top+ij〃临时停放为给要离去的汽车让路而从停车场退出来的汽车temp-stack[temp-top++]=cnter-stack[—cnter-top];fee enter,leavecar;while temp-top〃将临时存放的车再停回停车场enter-stack[enter-top++]=temp-stack[一temp-top];if wai t-head!=wai t-rear〃将便道里的一辆车停入停车场q=wait-hcad-next;printf便道里的%s车进入停车场第%1个位置\n〃,q-data.num,MAX;enter-stack[enter-top++]=q-data;printf“请输入现在时间〈例如:12:00;scanf〃%d:%d〃,enteLstack[enter-top-l].reach,hour,enter-stack[entcr-top-l].reach,min;wait-head-next=q-next;if!q-next wait-rear=wait-head;freeq;return OK;7计算收费,将离开车辆的信息登记入历史记录void feeSeqStackCarCenter,LinkQueueCar*leavecar/*车费计算以及登记历史记录*/EnQueueleavecar;一enter-top;printf〃请输入离开时间〈例如12:00:〃;scanfcnter-stack[entcr-top].leave,hour,cnter-stack[enter-top].leave,min;cnter-stack[enter-top].timc=enter-stack[enter-top].leave,hour-enter-stack[enter-top].reach,hour*60;cnter-stack[entcr-top].timc+=entcr-stack[enter-top].leave,min-enter-stack[enter-top].reach,min;printf〃〈车牌号%s停车时间:%d分钟停车费:%
6.2f\n,z,cntcr-stack[enter-top].num,enter-stack[enter-top].time,enter-stack[enter-top].t ime*price;leavecar-rear-data=enter-slack[enler-lop];〃将离开的车的信息存在历史记录里8显示存车信息,输出历史记录int ListSeqStackCar*enter,LinkQueueCar*wait,LinkQueueCar*1eavecar/*显示存车信息*/int i,j;QueueNode*q=\vai t-head,*p=l eavecar-head;printf〃
1.停车场while1printf〃
1.停车场
2.便道
3.历史记录
4.返回\n〃;pri ntf〃******************************************\n;printf〃******************************************\n〃;switchi{case1:{printff位置到达时间车牌号\n〃;forj=0;jenter-top;j++printf,,%8d%8d:%2d%s\nz,,j+1,enter-stack[j].reach,hour,enter-stack[j].reach,min,enter-stack[j].num;break;}case2:仃£幅近-110@1二=\田江-正@「加14£便道里没有车\/;else{printf〃便道内等待车辆车牌号\n〃;while q=q-nextprintf〃%s〃,q-data.num;printf〃\n〃;}break;}case3:{printf,z车牌号到达时间离开时间停车时间费用\n〃;whilep=p-nextprintf,%8s%8d:%2d%8d:%2d%10d%
8.2f\n〃,p-data.num,p-data.reach,hour,p-data.reach.min,p-data.Ieavc.hour,p-data.leave,min,p-data.time,p-data.time*price;break;}case4:return OK;}}}
2.画出函数的调用关系图主函数调用InitStack,Ini tQueue,Arrival,Leave,List函数Arrival函数调用EnQueue函数Leave函数调用fee函数
三、调试分析
1.调试中遇到的问题及对问题的解决方法序错误信息解决方法号选择功能1出现“请1初始化栈错误,不要再申请动态内存,只有赋初始值即可输入车牌”后出现应用程序错误选择功能1出现“请数据应用错误,将栈的结构体类型CarNode2输入车牌”后出现应*stack[MAX+l]修改为CarNode stack[MAX+1]用程序错误选择功能1,输入到达数据应用错误,将栈的结构体类型CarNode data;修改为3时间出现应用程序错CarNode data;误输出车费时小数点后4将输出函数里%f改为%
6.2f又太多位从便道转移到停车场5的车,离开后费用是忘记登记进入停车场的时间乱码当停车场只有一辆将车停放在临时车站的判断条件错误,whilelemp-lop+i6车,让其离开时,输出〈MAX修改为whiletemp-top+ij,j为enter-top刚进入费用是乱码该调用函数的值让便道车辆进入停车7推理可知总是第MAX个位置场第多少个位置输出有无当停车场内没有车时8加一个判断,if!enter-top returnERROR;程序进入死循环输出停车场信息是,9将停车位置加1即可停车位置错误车辆在便道里的位置10不输出位置信息输出错误序时间复函数功能函数名称号杂度1主函数void main2初始化栈void InitStackSeqStackCar*carstack013初始化便道int InitQueueLinkQueueCar*carwait01车辆到达,登记车牌号ArrivalSeqStackCar*enter,LinkQueueCar401和到达时间*wait5插入新的链表尾void EnQueueLinkQueueCar*wai t01int LeaveSeqStackCar*enter,SeqStackCar车辆离开,登记离开时*temp,LinkQueueCar*wait,LinkQueueCar6间,输出停车时间和收*leavecar费将便道内车辆计算收费,将离开车辆void feeSeqStackCarCenter,LinkQueueCar701的信息记入历史记录*leavecar显示存车信息,输出历int ListSeqStackCarCenter,LinkQueueCar8史记录*wait,LinkQueueCar*leavecar
四、使用说明及测试结果
1.使用说明:D输出菜单”
1.车辆达到
2.车辆离开
3.列表显示
4.退出系统”2先选择1,输入车牌号,输出车在停车场的位置,再输入到达时间随意选择1,2,3,4若选1,停车场满后停在便道上,输入车牌号选择2,输入要离开的车辆在停车场的位置和离开时间输出停车时间和费用若便道上车,将一辆车移到停车场,输入现在时间S选择3,输出菜单“
1.停车场
2.便道
3.历史记录
4.返回”选择1,2,3,分别显示停车场,便道,历史记录的情况选择4返回到开始菜单最后选择4结束程序
2.测试结果序测试数据输出结果号车牌号苏Ain1停车时间1停车场车牌号苏A1111到达时间12:20离开时间13:0040分钟停车费
2.00车牌号苏A1111停车时间40分钟停车费停车场车牌号苏A1H1到达时间12:20离开时间13:00;
2.002车牌号苏A2222到达时间13:00离开时间14:00车牌号:苏A2222停车时选择停车场内1号位离开,再选择停车场内2号位离开间120分钟停车费:
6.00车牌号苏A2222停车时间停车场车牌号苏AU11到达时间12:20离开时间13:00;120分钟停车费:车牌号苏A2222到达时间13:00离开时间14:
006.003便道车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A3333停车时车牌号苏A4444到达时间13:00离开时间15:00间30分钟停车费选择停车场内2号位离开,再选择选择停车场内2号位
1.50离开停车场内位置达到时间车牌号停车场车牌号苏A11H到达时间12:20离开时间13:00;112:20苏A11114车牌号苏A2222到达时间13:00离开时间14:00213:00苏A2222便道车牌号苏A3333到达时间12:30离开时间13:00;便道内等待车辆车牌号车牌号苏A4444到达时间13:00离开时间15:00苏A3333苏A4444输出停车场内和便道的停车情况停车场内位置达到时间车牌号112:30苏A3333停车场车牌号苏AUU到达时间12:20离开时间13:00;213:00苏A4444车牌号苏A2222到达时间13:00离开时间14:00便道内没有车辆便道车牌号苏A3333到达时间12:30离开时间13:00;历史记录5车牌号苏A4444到达时间13:00离开时间15:00车牌号到达时间离开时让苏A1U1和苏A2222离开后,再输出停车场内和便道的间停车时间费用停车情况,以及历史记录苏A1H112:2013:
00402.00苏A222213:0014:
00603.006选择4退出系统成功退出程序
(2)输出停车时间和收费,停车场和便道的停车情况,历史记录
3.测试数据:1停车场车牌号苏A1U1到达时间12:20离开时间13:00停车场车牌号苏A1111到达时间12:20离开时间13:00;车牌号苏A22222到达时间13:00离开时间14:00选择停车场内1号位离开,再选择停车场内2号位离开停车场车牌号苏A1111到达时间12:20离开时间13:00;车牌号苏A2222到达时间13:00离开时间14:003便道车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达时间13:00离开时间15:00选择停车场内2号位离开,再选择选择停车场内2号位离开停车场车牌号苏AU11到达时间12:20离开时间13:00;车牌号苏A2222到达时间13:00离开时间14:004便道车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达时间13:00离开时间15:00输出停车场内和便道的停车情况停车场:车牌号苏AUU到达时间12:20离开时间13:00;车牌号苏A2222到达时间13:00离开时间14:005便道车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达时间13:00离开时间15:00让苏A1111和苏A2222离开后,再输出停车场内和便道的停车情况,以及历史记录6选择4退出系统二.概要设计
4.本程序所用的抽象数据类型的定义ADT Stack{基本操作:InitStackS数据对象D={ai|ai为ElemSet,i为正整数}基本操作:InitStackS//构建一个空栈SClearStackSDcstroyStackS//S被销毁StackLengthS〃返回S的元素个数,即栈的长度StackEmptys〃若栈S为空栈,则返回TRUE,否则FALEoGetTopS,e〃用返回S的栈顶元素数据关系Rl={〈aiT,ai|aiT,ai都属于D,i为正整数}CPluesahrStSa,ckeS〃将S清为空栈PushS,e〃入元素e为新的栈顶元素PopS,e〃删除S的栈顶元素,并用e返回其值
2.主程序的流程及各程序模块之间的层次关系1流程输出菜单”
1.车辆达到
2.车辆离开
3.列表显示
4.退出系统”2先选择1,输入车牌号,输出车在停车场的位置,再输入到达时间随意选择1,2,3,4若选1,停车场满后停在便道上,输入车牌号选择2,输入要离开的车辆在停车场的位置和离开时间输出停车时间和费用若便道上有车,将一辆车移到停车场,输入现在时间■选择3,输出菜单”
1.停车场
2.便道
3.历史记录
4.返回”选择1,2,3,分别显示停车场,便道,历史记录的情况选择4返回到开始菜单B最后选择4结束程序
二、详细设计
1.采用c语言定义相关的数据类型1typcdef structtimeint hour;int min;}Time;/*时间结点*/2typedef structnodechar num
[10];Time reach;Time leave;int time;//车停在停车场的总时间}CarNode;/*车辆信息结点*/3typcdcf structNODECarNode stack[MAX+1];int top;}SeqStackCar;/*模拟车站*/4typedef struct carCarNode data;structcar*nexl;jQueueNode;5typedef structNode{QucucNodc*hcad;QueueNode*rear;}LinkQueueCar;/*模拟通道*/
2.写出各模块的伪码算法1主函数void mainSeqStackCarEnter,Temp;LinkQueucCar Wait,Leavecar;int ch;InitStack.Enter;/*初始化车站*/lnitStackTcmp;/*初始化让路的临时栈*/InitQueueWait;/*初始化通道*/InitQueueLeavecar;/*初始化离开的车*/whilelpr int f〃\n************************************************〃;printfCAnl.车辆到达〃;printff
2.车辆离开〃;printf,z
3.列表显示〃;printff
4.退出系统\n〃);while1scanf ch;ifch=lch=4break;else printf〃\n请选择1|2⑶
4.;switchch{case1:Arrival Enter,Wait;break;/*车辆到达*/case2:Leave Enter,Tcmp,Wai t,Leavccar;break;/*车辆离开*/case3:List Enter,Wait,Leavecar;break;/*列表打印信息*/case4:exit0;/*退出主程序*/default:break;}}
(2)初始化栈void InitStackSeqStackCar*carstack/*初始化栈*/carstack-top=0;3初始化便道int InitQucucLinkQucucCar*carwait/*初始化便道*/carwait-head=car\vait-rear=QueueNode*malloc sizeofQueueNode;if!carwait-hcad exitOVERFLOW;carwait-head-next=NULL;〃队列初始化为NULLreturn OK;4车辆到达,登记车牌号和到达时间int ArrivalSeqStackCar*enter,LinkQueueCar*wait/*车辆到达*/ifenter-topMAX〃车辆停入停车场并且登记车牌和到达时间printf〃请输入车牌号〈例如:苏A8888;scanf〃%s〃,enter-stack[enter-top].num;printf〃该车在停车场第%d个位置\n〃,cntcr-top+l;printf〃请输入该车的到达时间例如、12:00;scanf〃%d:%d”,enter-stack[enter-top].reach,hour,enter-stack[enter-top].reach,min;enter-top++;return OK;else{〃车辆停在便道上并且登记车牌和到达时间EnQueuewait;printf〃请输入车牌号例如:苏A8888;scanf〃%s〃,wait-rear-data.num;printf〃该车停在便道上等待\n〃;return OK;。