数据结构实验报告模拟停车场管理.docx

上传人:b****1 文档编号:13251822 上传时间:2023-06-12 格式:DOCX 页数:18 大小:96.23KB
下载 相关 举报
数据结构实验报告模拟停车场管理.docx_第1页
第1页 / 共18页
数据结构实验报告模拟停车场管理.docx_第2页
第2页 / 共18页
数据结构实验报告模拟停车场管理.docx_第3页
第3页 / 共18页
数据结构实验报告模拟停车场管理.docx_第4页
第4页 / 共18页
数据结构实验报告模拟停车场管理.docx_第5页
第5页 / 共18页
数据结构实验报告模拟停车场管理.docx_第6页
第6页 / 共18页
数据结构实验报告模拟停车场管理.docx_第7页
第7页 / 共18页
数据结构实验报告模拟停车场管理.docx_第8页
第8页 / 共18页
数据结构实验报告模拟停车场管理.docx_第9页
第9页 / 共18页
数据结构实验报告模拟停车场管理.docx_第10页
第10页 / 共18页
数据结构实验报告模拟停车场管理.docx_第11页
第11页 / 共18页
数据结构实验报告模拟停车场管理.docx_第12页
第12页 / 共18页
数据结构实验报告模拟停车场管理.docx_第13页
第13页 / 共18页
数据结构实验报告模拟停车场管理.docx_第14页
第14页 / 共18页
数据结构实验报告模拟停车场管理.docx_第15页
第15页 / 共18页
数据结构实验报告模拟停车场管理.docx_第16页
第16页 / 共18页
数据结构实验报告模拟停车场管理.docx_第17页
第17页 / 共18页
数据结构实验报告模拟停车场管理.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构实验报告模拟停车场管理.docx

《数据结构实验报告模拟停车场管理.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告模拟停车场管理.docx(18页珍藏版)》请在冰点文库上搜索。

数据结构实验报告模拟停车场管理.docx

数据结构实验报告模拟停车场管理

模拟停车场管理

班级:

物联网姓名:

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->top

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("\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

#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:

%d

printf("

",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;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2