2023年数据结构实验报告模拟停车场管理含代码_第1页
2023年数据结构实验报告模拟停车场管理含代码_第2页
2023年数据结构实验报告模拟停车场管理含代码_第3页
2023年数据结构实验报告模拟停车场管理含代码_第4页
2023年数据结构实验报告模拟停车场管理含代码_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

模拟停车场管理

班级:物联网姓名: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;

JSeqStackCar;//狭道的堆栈顺序存储

typedefstructcar{

®CarNode*data;

structear*next;

}QueueNode;〃队列的链式存储

typedefstructNode{

QueueNode*head;

QueueNode*rear;

}LinkQueueCar;//便道上等候的队列定义

2、主模块的流程及各子模块的重要功能

错误!车辆到达:intArrival(SeqStackCar*Enter,LinkQueueCar*W)一

方面定义一个栈和队列的结构体指针为:*p,*t。然后申请一个车辆信息的内存空间,

并把它赋给栈指针。车辆到达时就输入车牌号,并通过if(Enter—>topVMAX)来判断该

车是进车场内还是进便道上,假如是进车场内就把top加1,显示在车场内的位置,还要输入

进车场的时间,然后把该节点进栈。假如是else就显示该车要停在便道上,并进行进队列

的操作。

错误!车辆离开:voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,

LinkQueueCar*W)

定义一个整型变量room记录要离开车辆的位置,定义两个栈指针和一个队列指针,

用个if(Enler->top>0)保证栈不空,然后用个while(l)保证输入的车辆离开位

置的合法性。假如不和法,显示输入有误,要重新输入。通过while(Enter->top>room)

判断离开车辆的位置,假如是中间位置,就要再用一个栈前面临时开出来的车,等要开出的

车开出后,再把临时栈的车看进车场内,并要调用PRINT(p,room);这个函数计算显示费

用。然后还要用if((W->head!=W->rear)&&Enter->top<MAX)语句判断便道上

有没有车,假如有车就要显示进车场的车的车牌号,并登记进入时间。

3、模块之间的层次关系

主函数中包含着各个函数模块,各模块也在互相调用。比如,离开函数中要计算停车

费,故要调取价格函数。价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。

三、具体设计

1、采用C语言定义相关的数据类型

#defineMAX3//停车场最大容量为3辆,便于观测

ttdefineprice0.05

typedefstructtime{//定义时间结构体

inthour;

intmin;

}Time;

typedefstruetnode{//定义车辆信息结构体

charnum[10];

Timereach;

Timeleave;

}CarNode;

2、写出各模块的伪码算法

voidPRINT(CarNode*p,introom){//车辆收费

ointA1,A2,B1,B2;

printf(〃\n车辆离开的时间:”);

scanf&(p->1eave,hour),&(p->leave.min));

printf(〃\n离开车辆的车牌号为:〃);

puts(p—>num);

printf(0\n其到达停车位时间);

printfC\n离开停车位时间为:);

Al=p->reach.hour;

A2=p->reach.min;

Bl=p->1eave.hour;

B2=p->1eave.min;

printf(〃\n应交费用为:%2.If元〃,((B1—A1)*60+(B2-A2))*pric

+PRINTE(p,room));

free(p);

)

intArriva1(SeqStackCar*Enter,LinkQueueCar*W)〃进入便道或者狭道

{

CarNode*p;

QueueNode*t;

p=(CarNode*)maHoc(sizeof(CarNode));

flushall();

printfC\n请输入车牌号(例:豫B1234):〃);

gets(p->num);

f(Enter->top<MAX)

(

Enter->top++;

printf("\n车辆在车场第%d位置.Enter->top);

printf(”\n车辆到达时间:");

scanf("%d:%d&(p->reach.hour),&(p->reach,min));

Enter->stack[top]=p;

return(1);

0)

oelse

°(

^printf(〃\n该车须在便道等待!有车位时进入车场”);

t=(QueueNode*)malloc(sizeof(QueueNode));

进入队列,调整指针;

叩rintf(〃请输入进入便道的时间〃);

scanf(〃%d:%d”,&(p—>reach,hour),&(p->reach.min));

return(1);

}

voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)

{〃车辆的离开

ointroom;

CarNode*p,*t;

QueueNode*q;

oif(Enter->top>0)//判断车场是否为空

°(

while(1)

6(

。叩rintf(〃\n请输入车在车场的位置/1--%d/:”,Enter—>top);

scanf("%d〃,&room);

if(room>=l&&room<=Enter—>top)break;

eIseprintf("\n输入有误,请重输:");

)

whi1e(Enter->top>room)//把要删除的车辆的前面的车开出来,进临

时栈。

00{

°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)//再把临时栈里德车辆进停车场

0(

Enter->top++;

Enter->stack[Enter->top]=Temp->stack[Temp->top];

Temp->stack[Temp—>top]=NULL;

Temp->top一;

J

oPRINT(p,room);//调用计费函数计费。。

if((W—>head!=W->rear)&&Enter->top<MAX)//假如便道上有车,则再开进停车

场。

q=W->head—>next;

t=q->data;

Enter->top++;

scanf(,z%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;

t»Enter->stack[Enter->top]=t;

oPRINTE(t,room);

free(q);

oe1seprintf(,z\n便道里没有车.\n");

0}

oelseprintf("\n车场里没有车.〃);

)

3、画出函数的调用关系图

>到达函数------

------------>离开函数---------->停车费用

主函数--------------->显示车场里的情况

>显示便道里的情况

四、调试分析

1、调试中碰到的问题及对问题的解决方法

由于时间结构体里的小时,分钟都是用的是整型,所以假如出现1:01这个时间的话,

会导致显示列表是1:1;这样的话会导致人的误解,同时会导致程序对停车缴纳的费用计算

错误。

解决方法1:可以用数组和或者字符串来表达时间,但是问题来了,要是用字符串的话,算

停车费有点问题,要废上一段时间的,会提高复杂度。

解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!

2、算法的时间复杂度和空间复杂度

由于没有进行循环嵌套之类的运算,只有简朴的循环语句,所以时间复杂度T(0)

=0(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要

申请一定的存储空间的,这样非动态分派的存储空间,在某些时候是会导致空间的浪费,增长

其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,

空间复杂度较小,随着规模的增长,动态存储的扩充,空间复杂度也随之增长。

五、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)

时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。

ttttttitsitttttttnttttttttttn3.车辆列表显示."*###“##11*****#

4.退出系统.ititsHttitttitttitititttttttit

请选择:i

请输入车牌号<例:豫Bi234〉:苏g23

该车须在便道等待,有车位时进入车场请输入进入便道的时间

a"G:\新皿除(2)\停2\Debug\2.exe"□

ttsxttttttnitttttititttttntt3.车辆列表显示.wttt***###******

ttttttttttttttttttltttttSIttttt4.退出系统.ttttttttttttttttitttitttttltttit

请选择:2

给俞人车在车场的位置〃一3/:1

离开车辆的车牌号为:苏D543

达停

位时

间为110

停车

1间为120

4::

离开

^时间:1:10

寓开车辆的车牌号为:苏D543

到达便

间1:

为10

^元

X用

X0.元

显0.

道Af3

输wl23gA5

U123

第一个应缴费用是在便道中的费用,第二个费用是总费用。

六、源程序(规定程序简洁、清楚、重要语句带注释)代码非本人写,对其进行改善而已

#include<stdio.h>

#include<stdlib.h>

#inc1ude<string.h>

#defineMAX3//停车场最大容量为3辆,便于观测

#defineprice0.05

#definepricee0.02

typedefstructtime{//定义时间结构体

inthour;

intmin;

}Time;

typedefstructnode{//定义车辆信息结构体

ocharnum[10];

Timereach;

Timeleave;

}CarNode;

typedefstructNODE{

CarNode/stack[MAX+l];

inttop;

}SeqStackCar;

typedefstructcar{

oCarNode*data;

structcar*next;

}QueueNode;

typedefstructNode{

oQueueNode*head;

QueueNode*rear;

}LinkQueueCar;

voidInitStack(SeqStackCar*);

intInitQueue(LinkQueueCar*);

intArriva1(SeqStackCar*,LinkQueueCar*);

voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);

voidList(SeqStackCar,LinkQueueCar);

voidmain()

SeqStackCarEnter,Temp;

LinkQueueCarWait;

intch;

osystem("color4AH);

InitStack(&Enter);

InitStack(&Temp);

InitQueue(&Wait);

while⑴

ooprintf(H\n§X§X§X§X§X§欢迎使用停车场系统.§X§X§X§X

§X§\t\n\n〃);

printf(〃\n\t################1.车辆到达登记.#######

printf(〃\n\t################2.车辆离开登记.#######

#########、t\n〃);

printf(〃\n\t################3.车辆列表显示.###########

printf#########4.退出系统.#########

awhile(1)

°°{

。printf(〃请选择:〃);

scanf(z,%dz/,&ch);

if(ch>=1&&ch<=4)break;

elseprintf("\n输入有误,请重新选择:1~4:”);

switch(ch)

(

case1:Arriva1(&Enter,&Wait);obreak;

case2:Leave(&Enter,&Temp,&Wait);break;

case3:List(Enter,Wait);break;

case4:exit(0);

defauIt: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)

oQ—>head->next=NULL;

Q->rear=Q->head;

return(1);

)

elsereturn(-1);

floatPRINTE(CarNode*p,introom){//车辆收费

ointAl,A2,B1,B2;

printf(M\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:%dz/,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.If元“,((B1-A1)*60+(B2-A2))*pricee);

return(((B1~A1)*6O+(B2~A2))*pricee);

free(p);

}

voidPRINT(CarNode*p,introom){//车辆收费

ointAl,A2,B1,B2;

oprintf(〃\n车辆离开的时间:〃);

scanf(z,%d:%dz,,&(p->1eave,hour),&(p—>leave,min));

printf(1'\n离开车辆的车牌号为:〃);

puts(p->num);

printf(〃\n其到达停车位时间为:%d:%d/z,p->reach.hour,p->reach.min);

printf("\n离开停车位时间为:%d:%d/z,p->leave.hour,p->leave.min);

A1=p->reach.hour;

A2=p->reach.min;

Bl=p->leave.hour;

B2=p->leave.min;

printf(〃\n应交费用为:%2.If元”,((Bl—Al)*60+(B2—A2))*price+PRINTE(p,

room));

free(p);

)

//车辆的到达登记

intArriva1(SeqStackCar*Enter,LinkQueueCar*W){

0

CarNode*p;

QueueNode*t;

p=(CarNode*)malloc(sizeof(CarNode));

flusha11();

printf(M\n请输入车牌号(例:豫Bl234):〃);

gets(p->num);

oif(Enter->top<MAX)

(

nter—>top++;

printf(',\n车辆在车场第%d位置.Enter—>top);

printf(〃\n车辆到达时间:〃);

0

seanf(〃%d:%d",&(p->reach.hour),&(p->reach,min));

Enter->stack[Enter->top]=p;

return(1);

}

else

6{

-printf(〃\n该车须在便道等待!有车位时进入车场〃);

t=(QueueNode*)ma11oc(sizeof(QueueNode));

t->data=p;

t—>next=NULL;

W->rear->next=t;

W->rear=t;

叩rintf(〃请输入进入便道的时间〃);

scanf(,z%d:%dn,&(p->reach.hour),&(p->reach.min));

return(1);

)

)

voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)

{//车辆的离开

ointroom;

CarNode*p,*t;

QueueNode*q;

0

if(Enter->top>0)//判断车场是否为空

(

gwhile(l)

00彳

»printf(0\n请输入车在车场的位置/I—%d/:",Enter->top);

scanfftroom);

if(room>=l&&room<=Enter->top)break;

。elseprintf("\n输入有误,请重输:〃);

°}

while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。

0(

BTemp->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—;

owhi1e(Temp->top>=l)再把临时栈里德车辆进停车场

。。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<MAX)//假如便道上有车,则再开进

停车场。

(

q=W->head->next;

t=q->data;

Enter->top++;

printf(〃\n便道的%s号车进入车场第%(1位置.〃,t->num,Enter->to

P);

printf(”\n请输入%s号车进入车场的时间:“,t->num);

seanf(n%d:%dH,&(t—>reach.hour),&(t->reach.min));

//t->leave.hour=t—>reach.hour;

g//t->leave.min=t—>reach.min;

。W->head—>next=q->next;

oif(q==W-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论