2023年數(shù)據(jù)結構實驗報告模擬停車場管理含代碼_第1頁
2023年數(shù)據(jù)結構實驗報告模擬停車場管理含代碼_第2頁
2023年數(shù)據(jù)結構實驗報告模擬停車場管理含代碼_第3頁
2023年數(shù)據(jù)結構實驗報告模擬停車場管理含代碼_第4頁
2023年數(shù)據(jù)結構實驗報告模擬停車場管理含代碼_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

模擬停車場管理

班級:物聯(lián)網(wǎng)姓名:XXX學號:XXXXXXX日期:4月9日

一、需求分析

1、程序的功能描述

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

1)狹道停車用棧來實現(xiàn),并且用的順序棧,等車位的便道用隊列來實現(xiàn),并用鏈

式存儲。

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

號碼,汽車“到達”或“拜別”的時刻。

3)對每一組輸入數(shù)據(jù)進行操作后的輸出信息為:若是車輛到達,則輸出車輛在停車場內

或便道上的停車位置;若是車子拜別,則輸出車輛在停車場內停留的時間和繳納的費用。(假

設在便道等車的時間不收費)

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

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

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

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

車車位。車牌為10個字符以內的字符串,時間的輸入中間有冒號把時分隔開。

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

1蘇D5431:10

1蘇Q1231:20

1蘇D1451:30

二、概要設計

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

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,顯示在車場內的位置,還要輸入

進車場的時間,然后把該節(jié)點進棧。假如是else就顯示該車要停在便道上,并進行進隊列

的操作。

錯誤!車輛離開:voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,

LinkQueueCar*W)

定義一個整型變量room記錄要離開車輛的位置,定義兩個棧指針和一個隊列指針,

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

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

判斷離開車輛的位置,假如是中間位置,就要再用一個棧前面臨時開出來的車,等要開出的

車開出后,再把臨時棧的車看進車場內,并要調用PRINT(p,room);這個函數(shù)計算顯示費

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

有沒有車,假如有車就要顯示進車場的車的車牌號,并登記進入時間。

3、模塊之間的層次關系

主函數(shù)中包含著各個函數(shù)模塊,各模塊也在互相調用。比如,離開函數(shù)中要計算停車

費,故要調取價格函數(shù)。價格函數(shù)計算要用到離開和進入的時間,又要調用進入和離開函數(shù)。

三、具體設計

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

#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];〃把要刪除的車輛節(jié)點賦給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);//調用計費函數(shù)計費。。

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、畫出函數(shù)的調用關系圖

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

------------>離開函數(shù)---------->停車費用

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

>顯示便道里的情況

四、調試分析

1、調試中碰到的問題及對問題的解決方法

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

會導致顯示列表是1:1;這樣的話會導致人的誤解,同時會導致程序對停車繳納的費用計算

錯誤。

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

停車費有點問題,要廢上一段時間的,會提高復雜度。

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

2、算法的時間復雜度和空間復雜度

由于沒有進行循環(huán)嵌套之類的運算,只有簡樸的循環(huán)語句,所以時間復雜度T(0)

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

申請一定的存儲空間的,這樣非動態(tài)分派的存儲空間,在某些時候是會導致空間的浪費,增長

其空間復雜度。其余的都是結構體和鏈式存儲的隊列屬于動態(tài)存儲。當停車場的規(guī)模較小時,

空間復雜度較小,隨著規(guī)模的增長,動態(tài)存儲的擴充,空間復雜度也隨之增長。

五、使用說明及測試結果(給出程序的使用說明、注意事項及不同情況的測試結果)

時間以24進制計算,停車時間不能跨越24進制。車牌號是10個字符串以內,不可溢出。

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

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

請選擇:i

請輸入車牌號<例:豫Bi234〉:蘇g23

該車須在便道等待,有車位時進入車場請輸入進入便道的時間

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

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

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

請選擇:2

給俞人車在車場的位置〃一3/:1

離開車輛的車牌號為:蘇D543

達停

位時

間為110

停車

1間為120

4::

離開

^時間:1:10

寓開車輛的車牌號為:蘇D543

到達便

間1:

為10

^元

X用

X0.元

顯0.

道Af3

輸wl23gA5

U123

第一個應繳費用是在便道中的費用,第二個費用是總費用。

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

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

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

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

printf(〃\n\t################2.車輛離開登記.#######

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

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

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

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;

//自定義函數(shù)

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];〃把要刪除的車輛節(jié)點賦給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);//調用計費函數(shù)計費。。

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論