数据结构实验报告模拟停车场管理.docx
《数据结构实验报告模拟停车场管理.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告模拟停车场管理.docx(18页珍藏版)》请在冰点文库上搜索。
数据结构实验报告模拟停车场管理
模拟停车场管理
班级:
物联网姓名:
XXX学号:
XXXXXXX日期:
4月9日
一、需求分析
1、程序的功能描述按照从终端输入的数据序列进行模拟管理。
1)狭道停车用栈来实现,并且用的顺序栈,等车位的便道用队列来实现,并用链式存储。
2)每一组输入信息包含三个数据项,汽车的“到达”和“离去”的信息,汽车牌照号码,汽车“到达”或“离去”的时刻。
3)对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车子离去,则输出车辆在停车场内停留的时间和缴纳的费用。
(假设在便道等车的时间不收费)
4)选作内容:
(1)便道也是要收费的,仅仅比狭道收费便宜点。
(2)狭道上的车可以直接开走。
2、输入/输出的要求首先选择操作的模块,根据提示输入车牌和到达时间,程序会告知是否停满或者停车车位。
车牌为10个字符以内的字符串,时间的输入中间有冒号把时分隔开。
3、测试数据
1苏D5431:
10
1苏Q1231:
20
1苏D1451:
30
二、概要设计
1、本程序所用的抽象数据类型的定义
typedefstructNODE{
CarNode*stack[MAX+1];
inttop;
}SeqStackCar;//狭道的堆栈顺序存储
typedefstructcar{
CarNode*data;
structcar*next;
}QueueNode;//队列的链式存储
typedefstructNode{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;//便道上等候的队列定义
2、主模块的流程及各子模块的主要功能
①车辆到达:
intArrival(SeqStackCar*Enter,LinkQueueCar*W)首先定义一个栈和队列的结构体指针为:
*p,*t。
然后申请一个车辆信息的内存空间,并把它赋给栈指针。
车辆
到达时就输入车牌号,并通过if(Enter->top如果是else就显示该车要停在便道上,并进行进队列的操作。③车辆离开:voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)定义一个整型变量room记录要离开车辆的位置,定义两个栈指针和一个队列指针,用个if(Enter->top>0)确保栈不空,然后用个while(1)确保输入的车辆离开位置的合法性。如果不和法,显示输入有误,要重新输入。通过while(Enter->top>room)判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进车场内,并要调用PRINT(p,room);这个函数计算显示费用。然后还要用if((W->head!=W->rear)&&Enter->top3、模块之间的层次关系主函数中包含着各个函数模块,各模块也在互相调用。比如,离开函数中要计算停车费,故要调取价格函数。价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。三、详细设计1、采用C语言定义相关的数据类型#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05typedefstructtime{//定义时间结构体inthour;intmin;}Time;typedefstructnode{//定义车辆信息结构体charnum[10];Timereach;Timeleave;}CarNode;2、写出各模块的伪码算法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其到达停车位时间);printf("\n离开停车位时间为:);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+PRINTE(p,room));free(p);intArrival(SeqStackCar*Enter,LinkQueueCar*W)//进入便道或者狭道{CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));进入队列,调整指针;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->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->top{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}车场里没有车.");elseprintf("\n3、画出函数的调用关系图>到达函数|>离开函数>停车费用主函数>显示车场里的情况1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。五、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。KttttttMKiittHttlttttittttt4”出系统”XtttttttttttttttttJIttMttttlt请选J牡1请输入车牌号<例=FgB1234>i苏沁羽话车须茁何道等待痣车位时进八车场i青输人进人便道的时闾第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include#include#include#defineMAX3//#defineprice0.05#definepricee0.02typedefstructtime{//停车场最大容量为3辆,便于观察定义时间结构体inthour;intmin;}Time;printf("\n欢迎使用停车场系统车辆到达登记.################\t\n");车辆离开登记.################\t\n");车辆列表显示.################\t\n");退出系统.################\t\n\n");探§探§\t\n\n");printf("\n\t################1.printf("\n\t################2.printf("\n\t################3.printf("\n\t################4.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);}floatPRINTE(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))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);free(p);车辆收费}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+PRINTE(p,room));free(p);//车辆的到达登记intArrival(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");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;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->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->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");车场里没有车.");}elseprintf("\n}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);%d:%dprintf("",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf("\n第%d车辆.",i);puts(p->data->num);p=p->next;}}elseprintf("\n便道里没有车.");printf("\n");}voidList(SeqStackCarS,LinkQueueCarW)//显示,遍历{intflag,tag;flag=1;while(flag)printf("查看车辆列表显示:");printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");printf("\n请选择1~3:");while(1){scanf("%d",&tag);if(tag>=1&&tag<=3)break;elseprintf("\n输入有误,请重新选择1~3:");}switch(tag){case1:List1(&S);break;case2:List2(&W);break;case3:flag=0;system("cls");break;default:break;}}
如果是else就显示该车要停在便道上,并进行进队列的操作。
③车辆离开:
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
定义一个整型变量room记录要离开车辆的位置,定义两个栈指针和一个队列指针,用个if(Enter->top>0)确保栈不空,然后用个while
(1)确保输入的车辆离开位置的合法性。
如果不和法,显示输入有误,要重新输入。
通过while(Enter->top>room)判断离开车
辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进车场内,并要调用PRINT(p,room);这个函数计算显示费用。
然后还要用if((W->head!
=W->rear)&&Enter->top3、模块之间的层次关系主函数中包含着各个函数模块,各模块也在互相调用。比如,离开函数中要计算停车费,故要调取价格函数。价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。三、详细设计1、采用C语言定义相关的数据类型#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05typedefstructtime{//定义时间结构体inthour;intmin;}Time;typedefstructnode{//定义车辆信息结构体charnum[10];Timereach;Timeleave;}CarNode;2、写出各模块的伪码算法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其到达停车位时间);printf("\n离开停车位时间为:);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+PRINTE(p,room));free(p);intArrival(SeqStackCar*Enter,LinkQueueCar*W)//进入便道或者狭道{CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));进入队列,调整指针;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->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->top{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}车场里没有车.");elseprintf("\n3、画出函数的调用关系图>到达函数|>离开函数>停车费用主函数>显示车场里的情况1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。五、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。KttttttMKiittHttlttttittttt4”出系统”XtttttttttttttttttJIttMttttlt请选J牡1请输入车牌号<例=FgB1234>i苏沁羽话车须茁何道等待痣车位时进八车场i青输人进人便道的时闾第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include#include#include#defineMAX3//#defineprice0.05#definepricee0.02typedefstructtime{//停车场最大容量为3辆,便于观察定义时间结构体inthour;intmin;}Time;printf("\n欢迎使用停车场系统车辆到达登记.################\t\n");车辆离开登记.################\t\n");车辆列表显示.################\t\n");退出系统.################\t\n\n");探§探§\t\n\n");printf("\n\t################1.printf("\n\t################2.printf("\n\t################3.printf("\n\t################4.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);}floatPRINTE(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))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);free(p);车辆收费}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+PRINTE(p,room));free(p);//车辆的到达登记intArrival(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");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;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->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->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");车场里没有车.");}elseprintf("\n}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);%d:%dprintf("",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf("\n第%d车辆.",i);puts(p->data->num);p=p->next;}}elseprintf("\n便道里没有车.");printf("\n");}voidList(SeqStackCarS,LinkQueueCarW)//显示,遍历{intflag,tag;flag=1;while(flag)printf("查看车辆列表显示:");printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");printf("\n请选择1~3:");while(1){scanf("%d",&tag);if(tag>=1&&tag<=3)break;elseprintf("\n输入有误,请重新选择1~3:");}switch(tag){case1:List1(&S);break;case2:List2(&W);break;case3:flag=0;system("cls");break;default:break;}}
3、模块之间的层次关系
主函数中包含着各个函数模块,各模块也在互相调用。
比如,离开函数中要计算停车费,故要调取价格函数。
价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。
三、详细设计
1、采用C语言定义相关的数据类型
#defineMAX3//停车场最大容量为3辆,便于观察
#defineprice0.05
typedefstructtime{//
定义时间结构体
inthour;intmin;
}Time;
typedefstructnode{//定义车辆信息结构体
charnum[10];
Timereach;
Timeleave;
}CarNode;
2、写出各模块的伪码算法
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其到达停车位时间);
printf("\n离开停车位时间为:
);
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+PRINTE(p,room));free(p);
intArrival(SeqStackCar*Enter,LinkQueueCar*W)//进入便道或者狭道{
CarNode*p;
QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();
printf("\n请输入车牌号(例:
豫B1234):
");gets(p->num);
if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));进入队列,调整指针;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->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->top{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}车场里没有车.");elseprintf("\n3、画出函数的调用关系图>到达函数|>离开函数>停车费用主函数>显示车场里的情况1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。五、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。KttttttMKiittHttlttttittttt4”出系统”XtttttttttttttttttJIttMttttlt请选J牡1请输入车牌号<例=FgB1234>i苏沁羽话车须茁何道等待痣车位时进八车场i青输人进人便道的时闾第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include#include#include#defineMAX3//#defineprice0.05#definepricee0.02typedefstructtime{//停车场最大容量为3辆,便于观察定义时间结构体inthour;intmin;}Time;printf("\n欢迎使用停车场系统车辆到达登记.################\t\n");车辆离开登记.################\t\n");车辆列表显示.################\t\n");退出系统.################\t\n\n");探§探§\t\n\n");printf("\n\t################1.printf("\n\t################2.printf("\n\t################3.printf("\n\t################4.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);}floatPRINTE(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))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);free(p);车辆收费}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+PRINTE(p,room));free(p);//车辆的到达登记intArrival(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");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;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->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->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");车场里没有车.");}elseprintf("\n}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);%d:%dprintf("",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf("\n第%d车辆.",i);puts(p->data->num);p=p->next;}}elseprintf("\n便道里没有车.");printf("\n");}voidList(SeqStackCarS,LinkQueueCarW)//显示,遍历{intflag,tag;flag=1;while(flag)printf("查看车辆列表显示:");printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");printf("\n请选择1~3:");while(1){scanf("%d",&tag);if(tag>=1&&tag<=3)break;elseprintf("\n输入有误,请重新选择1~3:");}switch(tag){case1:List1(&S);break;case2:List2(&W);break;case3:flag=0;system("cls");break;default:break;}}
{
Enter->top++;
printf("\n车辆在车场第%d位置.",Enter->top);
printf("\n车辆到达时间:
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
Enter->stack[top]=p;return
(1);
}
else
printf("\n该车须在便道等待!
有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));
进入队列,调整指针;
printf("请输入进入便道的时间");scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));return
{//车辆的离开
introom;
CarNode*p,*t;
QueueNode*q;
if(Enter->top>0)//判断车场是否为空
while
(1)
printf("\n请输入车在车场的位置/1--%d/:
",Enter->top);scanf("%d",&room);
if(room>=1&&room<=Enter->top)break;
elseprintf("\n输入有误,请重输:
}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。
Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;
Enter->top--;
}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。
Enter->stack[Enter->top]=NULL;
while(Temp->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{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}车场里没有车.");elseprintf("\n3、画出函数的调用关系图>到达函数|>离开函数>停车费用主函数>显示车场里的情况1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。五、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。KttttttMKiittHttlttttittttt4”出系统”XtttttttttttttttttJIttMttttlt请选J牡1请输入车牌号<例=FgB1234>i苏沁羽话车须茁何道等待痣车位时进八车场i青输人进人便道的时闾第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include#include#include#defineMAX3//#defineprice0.05#definepricee0.02typedefstructtime{//停车场最大容量为3辆,便于观察定义时间结构体inthour;intmin;}Time;printf("\n欢迎使用停车场系统车辆到达登记.################\t\n");车辆离开登记.################\t\n");车辆列表显示.################\t\n");退出系统.################\t\n\n");探§探§\t\n\n");printf("\n\t################1.printf("\n\t################2.printf("\n\t################3.printf("\n\t################4.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);}floatPRINTE(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))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);free(p);车辆收费}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+PRINTE(p,room));free(p);//车辆的到达登记intArrival(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");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;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->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->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");车场里没有车.");}elseprintf("\n}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);%d:%dprintf("",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf("\n第%d车辆.",i);puts(p->data->num);p=p->next;}}elseprintf("\n便道里没有车.");printf("\n");}voidList(SeqStackCarS,LinkQueueCarW)//显示,遍历{intflag,tag;flag=1;while(flag)printf("查看车辆列表显示:");printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");printf("\n请选择1~3:");while(1){scanf("%d",&tag);if(tag>=1&&tag<=3)break;elseprintf("\n输入有误,请重新选择1~3:");}switch(tag){case1:List1(&S);break;case2:List2(&W);break;case3:flag=0;system("cls");break;default:break;}}
{q=W->head->next;
t=q->data;Enter->top++;
%d",&(t->reach.hour),&(t->reach.min));
//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;
W->head->next=q->next;if(q==W->rear)W->rear=W->head;
Enter->stack[Enter->top]=t;PRINTE(t,room);
free(q);
elseprintf("\n便道里没有车.\n");
车场里没有车.");
elseprintf("\n
3、画出函数的调用关系图
>到达函数|
>离开函数>停车费用
主函数
>显示车场里的情况
1、调试中遇到的问题及对问题的解决方法
因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:
01这个时间的
话,会导致显示列表是1:
1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。
解决方法1:
可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。
解决方案2:
将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!
2、算法的时间复杂度和空间复杂度
由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)
=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。
其余的都是结构体和链式存储的队列属于动态存储。
当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。
五、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)
时间以24进制计算,停车时间不能跨越24进制。
车牌号是10个字符串以内,不可溢出。
KttttttMKiittHttlttttittttt4”出系统”XtttttttttttttttttJIttMttttlt
请选J牡1
请输入车牌号<例=FgB1234>i苏沁羽
话车须茁何道等待痣车位时进八车场i青输人进人便道的时闾
第一个应缴费用是在便道中的费用,第二个费用是总费用。
六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已
#include
#include#defineMAX3//#defineprice0.05#definepricee0.02typedefstructtime{//
停车场最大容量为3辆,便于观察
inthour;
intmin;}Time;
printf("\n
欢迎使用停车场系统
车辆到达登记.################\t\n");车辆离开登记.################\t\n");车辆列表显示.################\t\n");退出系统.################\t\n\n");
探§探§\t\n\n");
printf("\n\t################1.printf("\n\t################2.printf("\n\t################3.printf("\n\t################4.
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);
floatPRINTE(CarNode*p,introom){//车辆收费
printf("\n车辆离开便道的时间:
%d",&(p->leave.hour),&(p->leave.min));
printf("\n离开车辆的车牌号为:
printf("\n其到达便道时间为:
%d:
%d",p->reach.hour,p->reach.min);
printf("\n离开便道时间为:
%d",p->leave.hour,p->leave.min);
B1=p->leave.hour;
B2=p->leave.min;
%2.1f元",((B1-A1)*60+(B2-A2))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);
free(p);
车辆收费
voidPRINT(CarNode*p,introom){//intA1,A2,B1,B2;
printf("\n其到达停车位时间为:
printf("\n应交费用为:
%2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));
//车辆的到达登记
intArrival(SeqStackCar*Enter,LinkQueueCar*W){
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");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;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->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->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");车场里没有车.");}elseprintf("\n}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);%d:%dprintf("",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf("\n第%d车辆.",i);puts(p->data->num);p=p->next;}}elseprintf("\n便道里没有车.");printf("\n");}voidList(SeqStackCarS,LinkQueueCarW)//显示,遍历{intflag,tag;flag=1;while(flag)printf("查看车辆列表显示:");printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");printf("\n请选择1~3:");while(1){scanf("%d",&tag);if(tag>=1&&tag<=3)break;elseprintf("\n输入有误,请重新选择1~3:");}switch(tag){case1:List1(&S);break;case2:List2(&W);break;case3:flag=0;system("cls");break;default:break;}}
Enter->stack[Enter->top]=p;return
有车位时进入车场");
t=(QueueNode*)malloc(sizeof(QueueNode));t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开
",Enter->top);
scanf("%d",&room);if(room>=1&&room<=Enter->top)break;
while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。
while(Temp->top>=1)//再把临时栈里德车辆进停车场
{Enter->top++;
=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");车场里没有车.");}elseprintf("\n}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);%d:%dprintf("",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf("\n第%d车辆.",i);puts(p->data->num);p=p->next;}}elseprintf("\n便道里没有车.");printf("\n");}voidList(SeqStackCarS,LinkQueueCarW)//显示,遍历{intflag,tag;flag=1;while(flag)printf("查看车辆列表显示:");printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");printf("\n请选择1~3:");while(1){scanf("%d",&tag);if(tag>=1&&tag<=3)break;elseprintf("\n输入有误,请重新选择1~3:");}switch(tag){case1:List1(&S);break;case2:List2(&W);break;case3:flag=0;system("cls");break;default:break;}}
t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
printf("\n请输入%s号车进入车场的时间:
",t->num);
voidList1(SeqStackCar*S)//显示车场里的车辆情况
if(S->top>0)
printf("\n车场:
printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++)
printf("%d",i);
%d
printf("
",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);
elseprintf("\n车场里没有车");
voidList2(LinkQueueCar*W)//显示便道上的车辆情况{
QueueNode*p;
p=W->head->next;
if(W->head!
=W->rear)
printf("\n等待车辆的号码为:
for(i=1;(p!
=NULL);i++)
printf("\n第%d车辆.",i);puts(p->data->num);
p=p->next;
elseprintf("\n便道里没有车.");
printf("\n");
voidList(SeqStackCarS,LinkQueueCarW)//显示,遍历{
intflag,tag;
flag=1;
while(flag)
printf("查看车辆列表显示:
printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");printf("\n请选择1~3:
scanf("%d",&tag);
if(tag>=1&&tag<=3)break;
elseprintf("\n输入有误,请重新选择1~3:
switch(tag)
List1(&S);break;
List2(&W);break;
flag=0;system("cls");break;
default:
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2