c语言数据结构停车场系统实验报告.docx
《c语言数据结构停车场系统实验报告.docx》由会员分享,可在线阅读,更多相关《c语言数据结构停车场系统实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
c语言数据结构停车场系统实验报告
实验题目:
实验六停车场管理
一、需求分析
1.程序的功能:
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列〔大门在最南端,最先到达的第一辆车停放在车场的最北端〕,假设车场内已停满n辆汽车,那么后来的汽车只能在门外的便道上等候,一旦有车开走,那么排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
〔1〕建立静态数组栈作为模拟停车场,动态链表栈作为模拟便道。
〔2〕车辆到达,停入停车场或者便道,记录车牌号,到达时间。
〔3〕车辆离开,记录离开时间,输出停车时间和收费。
将便道内车停入停车场,记录进入时间。
〔4〕列表显示停车场,便道内车辆情况。
〔5〕列表显示历史记录〔已经离开车的车牌号,到达离开时间,收费〕。
2.输入输出的要求:
(1)输入:
字符串车牌号,到达时间,离开时间
(2)输出:
停车时间和收费,停车场和便道的停车情况,历史记录。
3.测试数据:
1
停车场:
车牌号苏A1111到达时间12:
20离开时间13:
00
2
停车场:
车牌号苏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.本程序所用的抽象数据类型的定义
ADTStack{
数据对象:
D={ai|ai为ElemSet,i为正整数}
数据关系:
R1={|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语言定义相关的数据类型
〔1〕typedefstructtime
{
inthour;
intmin;
}Time;/*时间结点*/
〔2〕typedefstructnode
{
charnum[10];
Timereach;
Timeleave;
inttime;//车停在停车场的总时间
}CarNode;/*车辆信息结点*/
〔3〕typedefstructNODE
{
CarNodestack[MAX+1];
inttop;
}SeqStackCar;/*模拟车站*/
〔4〕typedefstructcar
{
CarNodedata;
structcar*next;
}QueueNode;
〔5〕typedefstructNode
{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;/*模拟通道*/
〔1〕主函数
voidmain()
{
SeqStackCarEnter,Temp;
LinkQueueCarWait,Leavecar;
intch;
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;
elseprintf("\n请选择:
1|2|3|4.");
}
switch(ch)
{
case1:
Arrival(&Enter,&Wait);break;/*车辆到达*/
case2:
Leave(&Enter,&Temp,&Wait,&Leavecar);break;/*车辆离开*/
case3:
List(&Enter,&Wait,&Leavecar);break;/*列表打印信息*/
case4:
exit(0);/*退出主程序*/
default:
break;
}}}
〔2〕初始化栈
voidInitStack(SeqStackCar*carstack)/*初始化栈*/
{
carstack->top=0;
}
〔3〕初始化便道
intInitQueue(LinkQueueCar*carwait)/*初始化便道*/
{
carwait->head=carwait->rear=(QueueNode*)malloc(sizeof(QueueNode));
if(!
carwait->head)exit(OVERFLOW);
carwait->head->next=NULL;//队列初始化为NULL
returnOK;
}
〔4〕车辆到达,登记车牌号和到达时间
intArrival(SeqStackCar*enter,LinkQueueCar*wait)/*车辆到达*/
{
if(enter->top{
printf("请输入车牌号<例如:
苏A8888>:
");
scanf("%s",enter->stack[enter->top].num);
printf("该车在停车场第%d个位置\n",(enter->top)+1);
printf("请输入该车的到达时间<例如:
12:
00>:
");
scanf("%d:
%d",&(enter->stack[enter->top].reach.hour),&(enter->stack[enter->top].reach.min));
(enter->top)++;
returnOK;
}
else
{//车辆停在便道上并且登记车牌和到达时间
EnQueue(wait);
printf("请输入车牌号<例如:
苏A8888>:
");
scanf("%s",wait->rear->data.num);
printf("该车停在便道上等待\n");
returnOK;
}
}
〔5〕插入新的链表尾
voidEnQueue(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〕车辆离开,登记离开时间,输出停车时间和收费。
将便道内车辆
intLeave(SeqStackCar*enter,SeqStackCar*temp,LinkQueueCar*wait,LinkQueueCar*leavecar)
{
inti,j=enter->top;
QueueNode*q=NULL;
if(!
enter->top)//假设停车场内没有车那么返回
{
printf("停车场内没有车");
returnERROR;
}
printf("请输入车在停车场中的位序(1-%d):
",j);
scanf("%d",&i);
while(i<1||i>enter->top)
{
printf("输入错误,请重新输入(1-%d):
",j);
scanf("%d",&i);
}
while(temp->top+itemp->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->stack[enter->top-1].reach.hour),&(enter->stack[enter->top-1].reach.min));
wait->head->next=q->next;
if(!
q->next)wait->rear=wait->head;
free(q);
}
returnOK;
}
〔7〕计算收费,将离开车辆的信息登记入历史记录
voidfee(SeqStackCar*enter,LinkQueueCar*leavecar)/*车费计算以及登记历史记录*/
{
EnQueue(leavecar);
--(enter->top);
printf("请输入离开时间<例如:
12:
00>:
");
scanf("%d:
%d",&(enter->stack[enter->top].leave.hour),&(enter->stack[enter->top].leave.min));
enter->stack[enter->top].time=(enter->stack[enter->top].leave.hour-enter->stack[enter->top].reach.hour)*60;
enter->stack[enter->top].time+=enter->stack[enter->top].leave.min-enter->stack[enter->top].reach.min;
printf("<车牌号:
%s停车时间:
%d分钟停车费:
%6.2f>\n",enter->stack[enter->top].num,enter->stack[enter->top].time,enter->stack[enter->top].time*price);
leavecar->rear->data=enter->stack[enter->top];//将离开的车的信息存在历史记录里
}
〔8〕显示存车信息,输出历史记录
intList(SeqStackCar*enter,LinkQueueCar*wait,LinkQueueCar*leavecar)/*显示存车信息*/
{
inti,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)
{
case1:
{printf("位置到达时间车牌号\n");
for(j=0;jtop;j++)
printf("%8d%8d:
%2d%s\n",j+1,enter->stack[j].reach.hour,enter->stack[j].reach.min,
enter->stack[j].num);break;}
case2:
{if(wait->head==wait->rear)printf("便道里没有车\n");
else
{printf("便道内等待车辆车牌号:
\n");
while(q=q->next)
printf("%s",q->data.num);
printf("\n");
}break;}
case3:
{printf("车牌号到达时间离开时间停车时间费用\n");
while(p=p->next)printf("%8s%8d:
%2d%8d:
%2d%10d%8.2f\n",p->data.num,p->data.reach.hour,p->data.reach.min,p->data.leave.hour,p->data.leave.min,p->data.time,p->data.time*price);
break;}
case4:
returnOK;
}}}
2.画出函数的调用关系图
主函数调用InitStack〔〕,InitQueue〔〕,Arrival〔〕,Leave〔〕,List〔〕函数。
Arrival〔〕函数调用EnQueue〔〕函数。
Leave〔〕函数调用fee〔〕函数。
三、调试分析
1.调试中遇到的问题及对问题的解决方法
序号
错误信息
解决方法
1
选择功能1出现“请输入车牌〞后出现应用程序错误
初始化栈错误,不要再申请动态内存,只有赋初始值即可
2
选择功能1出现“请输入车牌〞后出现应用程序错误
数据应用错误,将栈的构造体类型CarNode*stack[MAX+1]修改为CarNodestack[MAX+1]
3
选择功能1,输入到达时间出现应用程序错误
数据应用错误,将栈的构造体类型CarNodedata;修改为CarNodedata;
4
输出车费时小数点后又太多位
5
从便道转移到停车场的车,离开后费用是乱码
忘记登记进入停车场的时间
6
当停车场只有一辆车,让其离开时,输出费用是乱码
将车停放在临时车站的判断条件错误,while(temp->top+itop+itop刚进入该调用函数的值
7
让便道车辆进入停车场第多少个位置输出有无
推理可知总是第MAX个位置
8
当停车场内没有车时程序进入死循环
加一个判断,if(!
enter->top)returnERROR;
9
输出停车场信息是,停车位置错误
将停车位置加1即可
10
车辆在便道里的位置输出错误
不输出位置信息
2.算法的时间复杂度
序号
函数功能
函数名称
时间复杂度
1
主函数
voidmain()
2
初始化栈
voidInitStack(SeqStackCar*carstack)
O〔1〕
3
初始化便道
intInitQueue(LinkQueueCar*carwait
O〔1〕
4
车辆到达,登记车牌号和到达时间
Arrival(SeqStackCar*enter,LinkQueueCar*wait)
O〔1〕
5
插入新的链表尾
voidEnQueue(LinkQueueCar*wait)
O〔1〕
6
车辆离开,登记离开时间,输出停车时间和收费。
将便道内车辆
intLeave(SeqStackCar*enter,SeqStackCar*temp,LinkQueueCar*wait,LinkQueueCar*leavecar)
7
计算收费,将离开车辆的信息记入历史记录
voidfee(SeqStackCar*enter,LinkQueueCar*leavecar)
O〔1〕
8
显示存车信息,输出历史记录
intList(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:
00
2
停车场:
车牌号苏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
输出停车场内和便道的停车情况
停车场内
位置到达时间车牌号
112:
20苏A1111
213:
00苏A2222
便道内等待车辆车牌号
苏A3333苏A4444
5
停车场:
车牌号苏A1111到达时间12:
20离开时间13:
00;车牌号苏A2222到达时间13:
00离开时间14:
00
便道:
车牌号苏A3333到达时间12:
30离开时间13:
00;车牌号苏A4444到达时间13:
00离开时间15:
00
让苏A1111和苏A2222离开后,再输出停车场内和便道的停车情况,以及历史记录
停车场内
位置到达时间车牌号
112:
30苏A3333
213:
00苏A4444
便道内没有车辆
历史记录
车牌号到达时间离开时间停车时间费用
6
选择4退出系统
成功退出程序
【本文档内容可以自由复制内容或自由编辑修改内容期待你的好评和关注,我们将会做得更好】