2023年數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告模擬停車場(chǎng)管理含代碼_第1頁(yè)
2023年數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告模擬停車場(chǎng)管理含代碼_第2頁(yè)
2023年數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告模擬停車場(chǎng)管理含代碼_第3頁(yè)
2023年數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告模擬停車場(chǎng)管理含代碼_第4頁(yè)
2023年數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告模擬停車場(chǎng)管理含代碼_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

模擬停車場(chǎng)管理

班級(jí):物聯(lián)網(wǎng)姓名:XXX學(xué)號(hào):XXXXXXX日期:4月9日

一、需求分析

1、程序的功能描述

按照從終端輸入的數(shù)據(jù)序列進(jìn)行模擬管理。

1)狹道停車用棧來(lái)實(shí)現(xiàn),并且用的順序棧,等車位的便道用隊(duì)列來(lái)實(shí)現(xiàn),并用鏈

式存儲(chǔ)。

2)每一組輸入信息包含三個(gè)數(shù)據(jù)項(xiàng),汽車的“到達(dá)”和“拜別”的信息,汽車牌照

號(hào)碼,汽車“到達(dá)”或“拜別”的時(shí)刻。

3)對(duì)每一組輸入數(shù)據(jù)進(jìn)行操作后的輸出信息為:若是車輛到達(dá),則輸出車輛在停車場(chǎng)內(nèi)

或便道上的停車位置;若是車子拜別,則輸出車輛在停車場(chǎng)內(nèi)停留的時(shí)間和繳納的費(fèi)用。(假

設(shè)在便道等車的時(shí)間不收費(fèi))

4)選作內(nèi)容:(1)便道也是要收費(fèi)的,僅僅比狹道收費(fèi)便宜點(diǎn)。

(2)狹道上的車可以直接開(kāi)走。

2,輸入/輸出的規(guī)定

一方面選擇操作的模塊,根據(jù)提醒輸入車牌和到達(dá)時(shí)間,程序會(huì)告知是否停滿或者停

車車位。車牌為10個(gè)字符以內(nèi)的字符串,時(shí)間的輸入中間有冒號(hào)把時(shí)分隔開(kāi)。

3、測(cè)試數(shù)據(jù)

1蘇D5431:10

1蘇Q1231:20

1蘇D1451:30

二、概要設(shè)計(jì)

1、本程序所用的抽象數(shù)據(jù)類型的定義

typedefstructNODE{

?CarNode*stack[MAX+1];

inttop;

JSeqStackCar;//狹道的堆棧順序存儲(chǔ)

typedefstructcar{

?CarNode*data;

structear*next;

}QueueNode;〃隊(duì)列的鏈?zhǔn)酱鎯?chǔ)

typedefstructNode{

QueueNode*head;

QueueNode*rear;

}LinkQueueCar;//便道上等候的隊(duì)列定義

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

錯(cuò)誤!車輛到達(dá):intArrival(SeqStackCar*Enter,LinkQueueCar*W)一

方面定義一個(gè)棧和隊(duì)列的結(jié)構(gòu)體指針為:*p,*t。然后申請(qǐng)一個(gè)車輛信息的內(nèi)存空間,

并把它賦給棧指針。車輛到達(dá)時(shí)就輸入車牌號(hào),并通過(guò)if(Enter—>topVMAX)來(lái)判斷該

車是進(jìn)車場(chǎng)內(nèi)還是進(jìn)便道上,假如是進(jìn)車場(chǎng)內(nèi)就把top加1,顯示在車場(chǎng)內(nèi)的位置,還要輸入

進(jìn)車場(chǎng)的時(shí)間,然后把該節(jié)點(diǎn)進(jìn)棧。假如是else就顯示該車要停在便道上,并進(jìn)行進(jìn)隊(duì)列

的操作。

錯(cuò)誤!車輛離開(kāi):voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,

LinkQueueCar*W)

定義一個(gè)整型變量room記錄要離開(kāi)車輛的位置,定義兩個(gè)棧指針和一個(gè)隊(duì)列指針,

用個(gè)if(Enler->top>0)保證棧不空,然后用個(gè)while(l)保證輸入的車輛離開(kāi)位

置的合法性。假如不和法,顯示輸入有誤,要重新輸入。通過(guò)while(Enter->top>room)

判斷離開(kāi)車輛的位置,假如是中間位置,就要再用一個(gè)棧前面臨時(shí)開(kāi)出來(lái)的車,等要開(kāi)出的

車開(kāi)出后,再把臨時(shí)棧的車看進(jìn)車場(chǎng)內(nèi),并要調(diào)用PRINT(p,room);這個(gè)函數(shù)計(jì)算顯示費(fèi)

用。然后還要用if((W->head!=W->rear)&&Enter->top<MAX)語(yǔ)句判斷便道上

有沒(méi)有車,假如有車就要顯示進(jìn)車場(chǎng)的車的車牌號(hào),并登記進(jìn)入時(shí)間。

3、模塊之間的層次關(guān)系

主函數(shù)中包含著各個(gè)函數(shù)模塊,各模塊也在互相調(diào)用。比如,離開(kāi)函數(shù)中要計(jì)算停車

費(fèi),故要調(diào)取價(jià)格函數(shù)。價(jià)格函數(shù)計(jì)算要用到離開(kāi)和進(jìn)入的時(shí)間,又要調(diào)用進(jìn)入和離開(kāi)函數(shù)。

三、具體設(shè)計(jì)

1、采用C語(yǔ)言定義相關(guān)的數(shù)據(jù)類型

#defineMAX3//停車場(chǎng)最大容量為3輛,便于觀測(cè)

ttdefineprice0.05

typedefstructtime{//定義時(shí)間結(jié)構(gòu)體

inthour;

intmin;

}Time;

typedefstruetnode{//定義車輛信息結(jié)構(gòu)體

charnum[10];

Timereach;

Timeleave;

}CarNode;

2、寫出各模塊的偽碼算法

voidPRINT(CarNode*p,introom){//車輛收費(fèi)

ointA1,A2,B1,B2;

printf(〃\n車輛離開(kāi)的時(shí)間:”);

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

printf(〃\n離開(kāi)車輛的車牌號(hào)為:〃);

puts(p—>num);

printf(0\n其到達(dá)停車位時(shí)間);

printfC\n離開(kāi)停車位時(shí)間為:);

Al=p->reach.hour;

A2=p->reach.min;

Bl=p->1eave.hour;

B2=p->1eave.min;

printf(〃\n應(yīng)交費(fèi)用為:%2.If元〃,((B1—A1)*60+(B2-A2))*pric

+PRINTE(p,room));

free(p);

)

intArriva1(SeqStackCar*Enter,LinkQueueCar*W)〃進(jìn)入便道或者狹道

{

CarNode*p;

QueueNode*t;

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

flushall();

printfC\n請(qǐng)輸入車牌號(hào)(例:豫B1234):〃);

gets(p->num);

f(Enter->top<MAX)

(

Enter->top++;

printf("\n車輛在車場(chǎng)第%d位置.Enter->top);

printf(”\n車輛到達(dá)時(shí)間:");

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

Enter->stack[top]=p;

return(1);

0)

oelse

°(

^printf(〃\n該車須在便道等待!有車位時(shí)進(jìn)入車場(chǎng)”);

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

進(jìn)入隊(duì)列,調(diào)整指針;

叩rintf(〃請(qǐng)輸入進(jìn)入便道的時(shí)間〃);

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

return(1);

}

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

{〃車輛的離開(kāi)

ointroom;

CarNode*p,*t;

QueueNode*q;

oif(Enter->top>0)//判斷車場(chǎng)是否為空

°(

while(1)

6(

。叩rintf(〃\n請(qǐng)輸入車在車場(chǎng)的位置/1--%d/:”,Enter—>top);

scanf("%d〃,&room);

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

eIseprintf("\n輸入有誤,請(qǐng)重輸:");

)

whi1e(Enter->top>room)//把要?jiǎng)h除的車輛的前面的車開(kāi)出來(lái),進(jìn)臨

時(shí)棧。

00{

°Temp->top++;

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

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

Enter->top一;

°)

p=Enter->stack[Enter->top];〃把要?jiǎng)h除的車輛節(jié)點(diǎn)賦給p。

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

Enter->top-一;

while(Temp—>top>=1)//再把臨時(shí)棧里德車輛進(jìn)停車場(chǎng)

0(

Enter->top++;

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

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

Temp->top一;

J

oPRINT(p,room);//調(diào)用計(jì)費(fèi)函數(shù)計(jì)費(fèi)。。

if((W—>head!=W->rear)&&Enter->top<MAX)//假如便道上有車,則再開(kāi)進(jìn)停車

場(chǎng)。

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便道里沒(méi)有車.\n");

0}

oelseprintf("\n車場(chǎng)里沒(méi)有車.〃);

)

3、畫出函數(shù)的調(diào)用關(guān)系圖

>到達(dá)函數(shù)------

------------>離開(kāi)函數(shù)---------->停車費(fèi)用

主函數(shù)--------------->顯示車場(chǎng)里的情況

>顯示便道里的情況

四、調(diào)試分析

1、調(diào)試中碰到的問(wèn)題及對(duì)問(wèn)題的解決方法

由于時(shí)間結(jié)構(gòu)體里的小時(shí),分鐘都是用的是整型,所以假如出現(xiàn)1:01這個(gè)時(shí)間的話,

會(huì)導(dǎo)致顯示列表是1:1;這樣的話會(huì)導(dǎo)致人的誤解,同時(shí)會(huì)導(dǎo)致程序?qū)ν\嚴(yán)U納的費(fèi)用計(jì)算

錯(cuò)誤。

解決方法1:可以用數(shù)組和或者字符串來(lái)表達(dá)時(shí)間,但是問(wèn)題來(lái)了,要是用字符串的話,算

停車費(fèi)有點(diǎn)問(wèn)題,要廢上一段時(shí)間的,會(huì)提高復(fù)雜度。

解決方案2:將輸出用右對(duì)齊方式,缺位的用0補(bǔ)齊,這樣最快捷啦!

2、算法的時(shí)間復(fù)雜度和空間復(fù)雜度

由于沒(méi)有進(jìn)行循環(huán)嵌套之類的運(yùn)算,只有簡(jiǎn)樸的循環(huán)語(yǔ)句,所以時(shí)間復(fù)雜度T(0)

=0(n),在數(shù)據(jù)的存儲(chǔ)方面,除了車牌號(hào)用的是數(shù)組以外,便道用的是順序棧,這些是提前要

申請(qǐng)一定的存儲(chǔ)空間的,這樣非動(dòng)態(tài)分派的存儲(chǔ)空間,在某些時(shí)候是會(huì)導(dǎo)致空間的浪費(fèi),增長(zhǎng)

其空間復(fù)雜度。其余的都是結(jié)構(gòu)體和鏈?zhǔn)酱鎯?chǔ)的隊(duì)列屬于動(dòng)態(tài)存儲(chǔ)。當(dāng)停車場(chǎng)的規(guī)模較小時(shí),

空間復(fù)雜度較小,隨著規(guī)模的增長(zhǎng),動(dòng)態(tài)存儲(chǔ)的擴(kuò)充,空間復(fù)雜度也隨之增長(zhǎng)。

五、使用說(shuō)明及測(cè)試結(jié)果(給出程序的使用說(shuō)明、注意事項(xiàng)及不同情況的測(cè)試結(jié)果)

時(shí)間以24進(jìn)制計(jì)算,停車時(shí)間不能跨越24進(jìn)制。車牌號(hào)是10個(gè)字符串以內(nèi),不可溢出。

ttttttitsitttttttnttttttttttn3.車輛列表顯示."*###“##11*****#

4.退出系統(tǒng).ititsHttitttitttitititttttttit

請(qǐng)選擇:i

請(qǐng)輸入車牌號(hào)<例:豫Bi234〉:蘇g23

該車須在便道等待,有車位時(shí)進(jìn)入車場(chǎng)請(qǐng)輸入進(jìn)入便道的時(shí)間

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

ttsxttttttnitttttititttttntt3.車輛列表顯示.wttt***###******

ttttttttttttttttttltttttSIttttt4.退出系統(tǒng).ttttttttttttttttitttitttttltttit

請(qǐng)選擇:2

給俞人車在車場(chǎng)的位置〃一3/:1

離開(kāi)車輛的車牌號(hào)為:蘇D543

達(dá)停

位時(shí)

間為110

時(shí)

停車

1間為120

4::

離開(kāi)

^時(shí)間:1:10

寓開(kāi)車輛的車牌號(hào)為:蘇D543

到達(dá)便

時(shí)

機(jī)

間1:

開(kāi)

時(shí)

為10

應(yīng)

^元

X用

X0.元

顯0.

號(hào)

道Af3

號(hào)

輸wl23gA5

U123

第一個(gè)應(yīng)繳費(fèi)用是在便道中的費(fèi)用,第二個(gè)費(fèi)用是總費(fèi)用。

六、源程序(規(guī)定程序簡(jiǎn)潔、清楚、重要語(yǔ)句帶注釋)代碼非本人寫,對(duì)其進(jìn)行改善而已

#include<stdio.h>

#include<stdlib.h>

#inc1ude<string.h>

#defineMAX3//停車場(chǎng)最大容量為3輛,便于觀測(cè)

#defineprice0.05

#definepricee0.02

typedefstructtime{//定義時(shí)間結(jié)構(gòu)體

inthour;

intmin;

}Time;

typedefstructnode{//定義車輛信息結(jié)構(gòu)體

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§歡迎使用停車場(chǎng)系統(tǒng).§X§X§X§X

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

printf(〃\n\t################1.車輛到達(dá)登記.#######

printf(〃\n\t################2.車輛離開(kāi)登記.#######

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

printf(〃\n\t################3.車輛列表顯示.###########

printf#########4.退出系統(tǒng).#########

awhile(1)

°°{

。printf(〃請(qǐng)選擇:〃);

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

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

elseprintf("\n輸入有誤,請(qǐng)重新選擇: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;

//自定義函數(shù)

voidInitStack(SeqStackCar*s){//棧的初始化

inti;

s->top=0;

for(i=0;i<=MAX;i++)

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

intInitQueue(LinkQueueCar*Q){//隊(duì)列的初始化

?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){//車輛收費(fèi)

ointAl,A2,B1,B2;

printf(M\n車輛離開(kāi)便道的時(shí)間:");

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

printf(”\n離開(kāi)車輛的車牌號(hào)為:〃);

puts(p->num);

printf("\n其到達(dá)便道時(shí)間為:%d:%d”,p->reach.hour,p->reach,min);

printf(〃\n離開(kāi)便道時(shí)間為:%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應(yīng)交費(fèi)用為:%2.If元“,((B1-A1)*60+(B2-A2))*pricee);

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

free(p);

}

voidPRINT(CarNode*p,introom){//車輛收費(fèi)

ointAl,A2,B1,B2;

oprintf(〃\n車輛離開(kāi)的時(shí)間:〃);

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

printf(1'\n離開(kāi)車輛的車牌號(hào)為:〃);

puts(p->num);

printf(〃\n其到達(dá)停車位時(shí)間為:%d:%d/z,p->reach.hour,p->reach.min);

printf("\n離開(kāi)停車位時(shí)間為:%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應(yīng)交費(fèi)用為:%2.If元”,((Bl—Al)*60+(B2—A2))*price+PRINTE(p,

room));

free(p);

)

//車輛的到達(dá)登記

intArriva1(SeqStackCar*Enter,LinkQueueCar*W){

0

CarNode*p;

QueueNode*t;

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

flusha11();

printf(M\n請(qǐng)輸入車牌號(hào)(例:豫Bl234):〃);

gets(p->num);

oif(Enter->top<MAX)

(

nter—>top++;

printf(',\n車輛在車場(chǎng)第%d位置.Enter—>top);

printf(〃\n車輛到達(dá)時(shí)間:〃);

0

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

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

return(1);

}

else

6{

-printf(〃\n該車須在便道等待!有車位時(shí)進(jìn)入車場(chǎng)〃);

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

t->data=p;

t—>next=NULL;

W->rear->next=t;

W->rear=t;

叩rintf(〃請(qǐng)輸入進(jìn)入便道的時(shí)間〃);

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

return(1);

)

)

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

{//車輛的離開(kāi)

ointroom;

CarNode*p,*t;

QueueNode*q;

0

if(Enter->top>0)//判斷車場(chǎng)是否為空

(

gwhile(l)

00彳

?printf(0\n請(qǐng)輸入車在車場(chǎng)的位置/I—%d/:",Enter->top);

scanfftroom);

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

。elseprintf("\n輸入有誤,請(qǐng)重輸:〃);

°}

while(Enter->top>room)//把要?jiǎng)h除的車輛的前面的車開(kāi)出來(lái),進(jìn)臨時(shí)棧。

0(

BTemp->top++;

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

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

Enter->top--;

P=Enter—>stack[Enter->top];〃把要?jiǎng)h除的車輛節(jié)點(diǎn)賦給p。

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

Enter—>top—;

owhi1e(Temp->top>=l)再把臨時(shí)棧里德車輛進(jìn)停車場(chǎng)

。。Enter->top++;

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

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

Temp->top一;

。PRINT(p,room);//調(diào)用計(jì)費(fèi)函數(shù)計(jì)費(fèi)。。

if((W->head!=W—>rear)&&Enter->top<MAX)//假如便道上有車,則再開(kāi)進(jìn)

停車場(chǎng)。

(

q=W->head->next;

t=q->data;

Enter->top++;

printf(〃\n便道的%s號(hào)車進(jìn)入車場(chǎng)第%(1位置.〃,t->num,Enter->to

P);

printf(”\n請(qǐng)輸入%s號(hào)車進(jìn)入車場(chǎng)的時(shí)間:“,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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論