C语言课程设计报告——停车场管理1班级:192102学号:20101003907姓名:聂彪指导教师:张冬梅时间:2011年6月7日C课程设计报告1目录一、题目及要求二、题目及要求三、题目及要求四、题目分析五、数据结构说明六、各函数算法分析七、程序测试八、课程设计感悟与收获九、源代码C课程设计报告2一、题目及要求[要求]设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆国就进入停车场。停车场内如有某辆车要走,在它之后进来的车都必须退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且其他在便道上等待的车辆的次序不变。编制一程序模拟停车场管理。[提示]汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去时刻)。例如:(’A’,1,5)表示1号牌照车在5这个时刻到达,而(’D’,5,20)表示5号牌照车在20这个时刻离去,整个程序可以在输入信息为(’E’,0,0)时结束。基本要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交的费用和它在停车场内停留的时间。根据题目要求,停车场可以用一个长度为n的堆栈来模拟。由于停车场内如有某辆车要开走,在它之后进来的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。所以可以设两个堆栈。二、题目分析由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列。由此很容易联想到用结构体数组来存储车库信息。又每个汽车的车牌号都不一样,这样一来就可以根据车牌号准确找到汽车位置。当停车场内某辆车要离开时,在他之后进入的汽车必须再按原次序进入车库。这是一个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个结构体数组,用来暂时存放为出站汽车暂时让道的汽车车牌号。当车库满后,继续进来的汽车需要停放在车库旁边的便道上等候,若车库满后,继续进来的汽车需要停放在车库旁边的便道上等候,若车有汽车开走,这完全是一个先进先出模型,因此可以设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。另外,停车场是根据汽车在停车场内停放的总长来收费的,在便道上的时间不计费,因此必须记录车辆进入车库时的时间,车辆离开车库时的时间不需要记录,当从终端输入时可直接使用。另外,题目提示中的表示方法[(’A’,1,5)表示1号牌照车在5这个时刻到达]有两点不好;一、对用户友好程度不高,用起来并不方便;二、不接近实际情况,生活中表示时间的格式为“--:--”,完全可以建立一个时间结点来实现。因此,实际编程中将对这一方面予以优化。三、数据结构说明根据题意,停车场中的空间分为车库和便道。这里用结构体来模拟车库和便道,按照从端读入数据序进行管理。模拟车库和模拟便道中分别用结构体数组和链表来存储车辆信息。模拟车库和模拟便道的数据结构如下表1和表2所示:C课程设计报告3Moni_cheku结构体CarNode*stack[MAX+1]结构体数组charnum[10]Timereach结构体inthourintminTimeleave结构体inthourintmininttop表1模拟车库的数据结构Moni_biandao结构体QueueNode*head链表CarNode*data数组charnum[10]Timereach结构体inthourintminTimeleave结构体inthourintminStructcar*nextQueueNode*rear链表CarNode*data数组charnum[10]Timereach结构体inthourintminTimeleave结构体inthourintminStructcar*next表2模拟便道的数据结构用C语言实现这一部分为:typedefstructtime{inthour;intmin;}Time;/*时间结点*/typedefstructnode{charnum[10];Timereach;Timeleave;}CarNode;/*车辆信息结点*/typedefstructNODE{CarNode*stack[MAX+1];inttop;}Moni_Cheku;typedefstructcar{CarNode*data;structcar*next;C课程设计报告4}QueueNode;typedefstructNode{QueueNode*head;QueueNode*rear;}Moni_Biandao;四、各函数算法分析(1)主函数voidmain(){Moni_ChekuEnter,Temp;Moni_BiandaoWait;intch;InitStack(&Enter);/*初始化车站*/InitStack(&Temp);/*初始化让路的临时链表*/InitQueue(&Wait);/*初始化便道*/printf(\n);printf(^_^欢迎进入停车场管理系统1!^_^\n);printf(\n);printf(提示!(1).该车库的最大容量为:%d;\n,MAX);printf((2).该车库的收费标准为:%4.2f元/(辆*分钟).\n,price);while(1){printf(********************主菜单********************\n);printf(1.车辆到达);printf(2.车辆离开);printf(3.列表显示);printf(4.退出系统\n);printf(**********************************************\n);printf(请选择(1-4):[]\b\b);while(1){scanf(%d,&ch);if(ch=1&&ch=4)break;elseprintf(错误!请重选(1-4):[]\b\b);}switch(ch){case1:Arrival(&Enter,&Wait);break;/*车辆到达*/case2:Leave(&Enter,&Temp,&Wait);break;/*车辆离开*/case3:List(Enter,Wait);break;/*打印列表信息*/case4:exit(0);/*退出主程序*/default:break;C课程设计报告5}}}(2)车辆到达函数intArrival(Moni_Cheku*Enter,Moni_Biandao*W)/*车辆到达*/{CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf(请输入车牌号(例如:中CUG888):);gets(p-num);if(Enter-topMAX)/*车库未满,车进车库*/{Enter-top++;printf(该车在车库位置%d.\n,Enter-top);printf(请输入到达时间(**:**):);scanf(%d:%d,&(p-reach.hour),&(p-reach.min));Enter-stack[Enter-top]=p;return(1);}else/*车库已满,车进便道*/{printf(该车须在便道等待!\n);t=(QueueNode*)malloc(sizeof(QueueNode));t-data=p;t-next=NULL;W-rear-next=t;车辆离开函数列表显示函数退出函数错误处理车辆到达函数1234其它枪主菜单C课程设计报告6W-rear=t;return(1);}}(3)车辆离开函数voidLeave(Moni_Cheku*Enter,Moni_Cheku*Temp,Moni_Biandao*W)/*车辆离开*/{inti,room;CarNode*p,*t;QueueNode*q;/*判断车库内是否有车*/if(Enter-top0)/*有车*/{printf(请输入车在车库的位置(1--%d):,Enter-top);/*输入车辆离开的信息*/while(1){scanf(%d,&room);if(room=1&&room=Enter-top)break;elseprintf(错误!请重选:);}while(Enter-toproom)/*车辆离开*/{Temp-top++;Temp-stack[Temp-top]=Enter-stack[Enter-top];Enter-stack[Enter-top]=NULL;Enter-top--;}p=Enter-stack[Enter-top];输入车牌号车库满否否是车进车库车进便道车辆到达C课程设计报告7Enter-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-topMAX)/*便道的车辆进入车库*/{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);}elseprintf(\n便道里没有车.\n);}elseprintf(车库里没有车!\n);/*没车*/}有输入车的位置是否输入错误是否输出“便道里没有车”无车辆离开车库有车否该位置的车离开,且输出该车的收费等信息C课程设计报告8(3)列表显示函数voidList(Moni_ChekuS,Moni_BiandaoW){intflag,tag;flag=1;while(flag){printf(**********查看**********\n);printf(1.车库2.便道3.返回\n);printf(************************\n);printf(请选择(1-3):[]\b\b);while(1){scanf(%d,&tag);f(tag=1&&tag=3)break;elseprintf(错误!请重选(1-3):[]\b\b);}switch(tag){case1:List1(&S);break;/*列表显示车库信息*/case2:List2(&W);break;/*列表显示便到信息*/case3:flag=0;break;default:break;}}}便道若有车,便道的第一辆车进入车库,若便道无车,则不做处理C课程设计报告9voidList1(Moni_Cheku*S)/*列表显示车库信息*/{inti;if(S-top0)/*判断车库内是否有车*/{printf(车库:);printf(\n位置到达时间车牌号\n);for(i=1;i=S-top;i++){pri