c语言大数据结构停车场系统实验报告材料.doc
word实验题目:实验六 停车场管理一、 需求分析1 程序的功能:设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列大门在最南端,最先到达的第一辆车停放在车场的最北端,假如车场内已停满n辆汽车,如此后来的汽车只能在门外的便道上等候,一旦有车开走,如此排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。1建立静态数组栈作为模拟停车场,动态链表栈作为模拟便道。2车辆到达,停入停车场或者便道,记录车牌号,到达时间。3车辆离开,记录离开时间,输出停车时间和收费。将便道内车停入停车场,记录进入时间。4列表显示停车场,便道内车辆情况。5列表显示历史记录已经离开车的车牌号,到达离开时间,收费。2 输入输出的要求:(1) 输入:字符串车牌号,到达时间,离开时间(2) 输出:停车时间和收费,停车场和便道的停车情况,历史记录。3 测试数据:1停车场:车牌号 苏A1111 到达时间12:20 离开时间13:002停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 选择停车场内1号位离开,再选择停车场内2号位离开3停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 选择停车场内2号位离开,再选择选择停车场内2号位离开4停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 输出停车场内和便道的停车情况5停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 让苏A1111和苏A2222离开后,再输出停车场内和便道的停车情况,以与历史记录6选择4退出系统二概要设计4 本程序所用的抽象数据类型的定义ADT Stack数据对象:D=ai|ai为ElemSet,i为正整数数据关系:R1=<ai-1,ai>|ai-1,ai都属于D,i为正整数 根本操作:InitStack(&S) /构建一个空栈S DestroyStack(&S) /S 被销毁 StackLength(S) /返回 S 的元素个数,即栈的长度。 StackEmpty(s) /假如栈 S 为空栈,如此返回 TRUE,否如此 FALE。 GetTop(S, &e) /用 e 返回 S 的栈顶元素 ClearStack(&S) /将 S 清为空栈 Push(&S, e) /入元素 e 为新的栈顶元素。 Pop(&S, &e) /删除 S 的栈顶元素,并用 e 返回其值2. 主程序的流程与各程序模块之间的层次关系 1流程:输出菜单“。先选择1,输入车牌号,输出车在停车场的位置,再输入到达时间。随意选择1,2,3,4。假如选1,停车场满后停在便道上,输入车牌号。选择2,输入要离开的车辆在停车场的位置和离开时间。输出停车时间和费用。假如便道上有车,将一辆车移到停车场,输入现在时间。选择3,输出菜单“。选择1,2,3,分别显示停车场,便道,历史记录的情况。选择4返回到开始菜单。最后选择4完毕程序。 二、 详细设计1. 采用c语言定义相关的数据类型1typedef struct timeint hour;int min;Time; /*时间结点*/2typedef struct nodechar num10;Time reach;Time leave; int time;/车停在停车场的总时间CarNode; /*车辆信息结点*/3typedef struct NODECarNode stackMAX+1;int top;SeqStackCar; /*模拟车站*/4typedef struct carCarNode data;struct car *next;QueueNode;5typedef struct NodeQueueNode *head;QueueNode *rear;LinkQueueCar; /*模拟通道*/1主函数void main()SeqStackCar Enter,Temp;LinkQueueCar Wait,Leavecar;int ch;InitStack(&Enter); /*初始化车站*/ InitStack(&Temp); /*初始化让路的临时栈*/InitQueue(&Wait); /*初始化通道*/ InitQueue(&Leavecar); /*初始化离开的车*/while(1) printf("n*");printf("n1. 车辆到达");printf(" 2. 车辆离开");printf(" 3. 列表显示");printf(" 4. 退出系统n"); printf("*n");while(1)scanf("%d",&ch);if(ch>=1&&ch<=4)break;else printf("n请选择: 1|2|3|4.");switch(ch) case 1:Arrival(&Enter,&Wait);break; /*车辆到达*/case 2:Leave(&Enter,&Temp,&Wait,&Leavecar);break; /*车辆离开*/case 3:List(&Enter,&Wait,&Leavecar);break; /*列表打印信息*/case 4:exit(0); /*退出主程序*/default: break;2初始化栈void InitStack(SeqStackCar *carstack) /*初始化栈*/ carstack->top=0;3初始化便道int InitQueue(LinkQueueCar *carwait) /*初始化便道*/carwait->head=carwait->rear=(QueueNode *)malloc(sizeof(QueueNode);if(!carwait->head) exit(OVERFLOW);carwait->head->next=NULL;/队列初始化为NULLreturn OK;4车辆到达,登记车牌号和到达时间int Arrival(SeqStackCar *enter,LinkQueueCar *wait) /*车辆到达*/ if(enter->top<MAX) /车辆停入停车场并且登记车牌和到达时间printf("请输入车牌号<例如:苏A8888> : ");scanf("%s",enter->stackenter->top.num);printf("该车在停车场第%d个位置n",(enter->top)+1);printf("请输入该车的到达时间<例如:12:00> : ");scanf("%d:%d",&(enter->stackenter->top.reach.hour),&(enter->stackenter->top.reach.min);(enter->top)+;return OK;else /车辆停在便道上并且登记车牌和到达时间 EnQueue(wait);printf("请输入车牌号<例如:苏A8888> : ");scanf("%s",wait->rear->data.num);printf("该车停在便道上等待n");return OK; 5插入新的链表尾void EnQueue(LinkQueueCar *wait) /*插入新的队尾*/ QueueNode *p=wait->rear;wait->rear=(QueueNode *)malloc(sizeof(QueueNode);if(!wait->rear) exit(OVERFLOW);p->next=wait->rear;wait->rear->next=NULL;6车辆离开,登记离开时间,输出停车时间和收费。将便道内车辆int Leave(SeqStackCar *enter,SeqStackCar *temp,LinkQueueCar *wait,LinkQueueCar *leavecar)int i,j=enter->top; QueueNode *q=NULL; if(!enter->top) /假如停车场内没有车如此返回printf("停车场内没有车");return ERROR;printf("请输入车在停车场中的位序(1-%d): ",j);scanf("%d",&i);while(i<1|i>enter->top) printf("输入错误,请重新输入(1-%d): ",j); scanf("%d",&i); while(temp->top +i<j) /临时停放为给要离去的汽车让路而从停车场退出来的汽车temp->stack(temp->top)+=enter->stack-(enter->top);fee(enter,leavecar);while(temp->top) /将临时存放的车再停回停车场enter->stack(enter->top)+=temp->stack-(temp->top); if(wait->head!=wait->rear) /将便道里的一辆车停入停车场q=wait->head->next;printf("便道里的%s车进入停车场第%d个位置n",q->data.num,MAX);enter->stack(enter->top)+=q->data;printf("请输入现在时间<例如:12:00> : "); scanf("%d:%d",&(enter->stackenter->top-1.reach.hour),&(enter->stackenter->top-1.reach.min);wait->head->next=q->next;if(!q->next) wait->rear=wait->head;free(q); return OK;7计算收费,将离开车辆的信息登记入历史记录void fee(SeqStackCar *enter,LinkQueueCar *leavecar) /*车费计算以与登记历史记录*/ EnQueue(leavecar); -(enter->top); printf("请输入离开时间<例如:12:00> : ");scanf("%d:%d",&(enter->stackenter->top.leave.hour),&(enter->stackenter->top.leave.min);enter->stackenter->top.time=(enter->stackenter->top.leave.hour - enter->stackenter->top.reach.hour)*60;enter->stackenter->top.time+=enter->stackenter->top.leave.min - enter->stackenter->top.reach.min; printf(" <车牌号:%s 停车时间:%d分钟 停车费:%6.2f >n",enter->stackenter->top.num,enter->stackenter->top.time,enter->stackenter->top.time*price);leavecar->rear->data=enter->stackenter->top;/将离开的车的信息存在历史记录里8显示存车信息,输出历史记录int List(SeqStackCar *enter,LinkQueueCar *wait,LinkQueueCar *leavecar) /*显示存车信息*/ int i,j; QueueNode *q=wait->head,*p=leavecar->head; while(1)printf("*n");printf("1.停车场 2.便道 3.历史记录 4.返回n");printf("*n");scanf("%d",&i);switch(i)case 1:printf(" 位置 到达时间 车牌号n"); for(j=0;j<enter->top;j+)printf("%8d%8d:%2d %sn",j+1,enter->stackj.reach.hour,enter->stackj.reach.min,enter->stackj.num); break;case 2:if(wait->head=wait->rear)printf("便道里没有车n"); else printf("便道内等待车辆车牌号:n"); while(q=q->next) printf("%s ",q->data.num); printf("n"); break;case 3:printf(" 车牌号 到达时间 离开时间 停车时间 费用n"); while(p=p->next)printf("%8s%8d:%2d%8d:%2d%10d%8.2fn",p->data.num,p->data.reach.hour,p->data.reach.min,p->data.le ave.hour,p->data.leave.min,p->data.time,p->data.time*price); break;case 4:return OK;2. 画出函数的调用关系图主函数调用InitStack,InitQueue,Arrival,Leave,List函数。Arrival函数调用EnQueue函数。Leave函数调用fee函数。三、 调试分析1 调试中遇到的问题与对问题的解决方法序号错误信息解决方法1选择功能1出现“请输入车牌后出现应用程序错误初始化栈错误,不要再申请动态内存,只有赋初始值即可2选择功能1出现“请输入车牌后出现应用程序错误数据应用错误,将栈的结构体类型CarNode *stackMAX+1修改为CarNode stackMAX+13选择功能1,输入到达时间出现应用程序错误数据应用错误,将栈的结构体类型CarNode data;修改为CarNode data;4输出车费时小数点后又太多位5从便道转移到停车场的车,离开后费用是乱码忘记登记进入停车场的时间6当停车场只有一辆车,让其离开时,输出费用是乱码将车停放在临时车站的判断条件错误,while(temp->top +i<MAX)修改为while(temp->top +i<j),j为enter->top刚进入该调用函数的值7让便道车辆进入停车场第多少个位置输出有无推理可知总是第MAX个位置8当停车场内没有车时程序进入死循环加一个判断,if(!enter->top) return ERROR;9输出停车场信息是,停车位置错误将停车位置加1即可10车辆在便道里的位置输出错误不输出位置信息2 算法的时间复杂度序号函数功能函数名称时间复杂度1主函数void main()2初始化栈void InitStack(SeqStackCar *carstack)O13初始化便道int InitQueue(LinkQueueCar *carwaitO14车辆到达,登记车牌号和到达时间Arrival(SeqStackCar *enter,LinkQueueCar *wait)O15插入新的链表尾void EnQueue(LinkQueueCar *wait)O16车辆离开,登记离开时间,输出停车时间和收费。将便道内车辆int Leave(SeqStackCar *enter,SeqStackCar *temp,LinkQueueCar *wait,LinkQueueCar *leavecar)7计算收费,将离开车辆的信息记入历史记录void fee(SeqStackCar *enter,LinkQueueCar *leavecar)O18显示存车信息,输出历史记录int List(SeqStackCar *enter,LinkQueueCar *wait,LinkQueueCar *leavecar)四、 使用说明与测试结果 1. 使用说明:输出菜单“。先选择1,输入车牌号,输出车在停车场的位置,再输入到达时间。随意选择1,2,3,4。假如选1,停车场满后停在便道上,输入车牌号。选择2,输入要离开的车辆在停车场的位置和离开时间。输出停车时间和费用。假如便道上车,将一辆车移到停车场,输入现在时间。选择3,输出菜单“。选择1,2,3,分别显示停车场,便道,历史记录的情况。选择4返回到开始菜单。最后选择4完毕程序。 序号测试数据输出结果1停车场:车牌号 苏A1111 到达时间12:20 离开时间13:002停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 选择停车场内1号位离开,再选择停车场内2号位离开3停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 选择停车场内2号位离开,再选择选择停车场内2号位离开4停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 输出停车场内和便道的停车情况停车场内位置 达到时间 车牌号1 12:20 苏A11112 13:00 苏A2222便道内等待车辆车牌号苏A3333苏A44445停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 让苏A1111和苏A2222离开后,再输出停车场内和便道的停车情况,以与历史记录停车场内位置 达到时间 车牌号1 12:30 苏A33332 13:00 苏A4444便道内没有车辆历史记录车牌号 到达时间 离开时间 停车时间 费用6选择4退出系统成功退出程序10 / 10