停车场汽车管理系统
文章目錄
- 一、停車(chē)場(chǎng)管理
- 二、算法設(shè)計(jì)
- 三、數(shù)據(jù)結(jié)構(gòu)選擇
- 四、功能設(shè)計(jì)
- 五、特色
最近花時(shí)間寫(xiě)了一個(gè)停車(chē)場(chǎng)管理系統(tǒng)。算是比較完善的一個(gè)小系統(tǒng),在這里分享一下該系統(tǒng)的一些設(shè)計(jì)。
一、停車(chē)場(chǎng)管理
設(shè)停車(chē)場(chǎng)內(nèi)只有一個(gè)可停放n輛汽車(chē)的狹長(zhǎng)通道,且只有一個(gè)大門(mén)可供汽車(chē)進(jìn)出。汽車(chē)在停車(chē)場(chǎng)內(nèi)按車(chē)輛到達(dá)時(shí)間的先后順序,依次由北向南排列(大門(mén)在最南端,最先到達(dá)的第一輛車(chē)停放在車(chē)場(chǎng)的最北端),若車(chē)場(chǎng)內(nèi)已停滿(mǎn)n輛汽車(chē),則后來(lái)的汽車(chē)只能在門(mén)外的便道上等候,一旦有車(chē)開(kāi)走,則排在便道上的第一輛車(chē)即可開(kāi)入;當(dāng)停車(chē)場(chǎng)內(nèi)某輛車(chē)要離開(kāi)時(shí),在它之后開(kāi)入的車(chē)輛必須先退出車(chē)場(chǎng)為它讓路,待該輛車(chē)開(kāi)出大門(mén)外,其它車(chē)輛再按原次序進(jìn)入車(chē)場(chǎng),每輛停放在車(chē)場(chǎng)的車(chē)在它離開(kāi)停車(chē)場(chǎng)時(shí)必須按它停留的時(shí)間長(zhǎng)短交納費(fèi)用。
試為停車(chē)場(chǎng)編制按上述要求進(jìn)行管理的模擬程序。
(1)汽車(chē)可有不同種類(lèi),則它們的占地面積不同,收費(fèi)標(biāo)準(zhǔn)也不同,如1輛客車(chē)和1.5輛小汽車(chē)的占地面積相同,1輛十輪卡車(chē)占地面積相當(dāng)于3輛小汽車(chē)的占地面積。如何處理該問(wèn)題?
解決方案:為了簡(jiǎn)化問(wèn)題,根據(jù)車(chē)型(本題中有三種:小汽車(chē),大卡車(chē),十輪客車(chē))的不同,收費(fèi)標(biāo)準(zhǔn)直接和占地面積成正比例。
(2)汽車(chē)可以直接從便道上開(kāi)走,此時(shí)排在它前面的汽車(chē)要先開(kāi)走讓路,然后再依次排到隊(duì)尾。如何處理該問(wèn)題?
解決方案:汽車(chē)從便道開(kāi)到停車(chē)場(chǎng)時(shí),可使用隊(duì)列的數(shù)據(jù)結(jié)構(gòu)(先進(jìn)先出,且只能在隊(duì)尾增加元素,隊(duì)頭不能增加元素);當(dāng)汽車(chē)直接從便道開(kāi)走時(shí),排在他前面的汽車(chē)要開(kāi)走在排到隊(duì)尾,可見(jiàn),先開(kāi)入便道的車(chē)輛 ,即隊(duì)頭,先離開(kāi)便道,然后到隊(duì)尾入隊(duì)。因此,在允許汽車(chē)可以直接從便道開(kāi)走時(shí),應(yīng)該使用隊(duì)列來(lái)存儲(chǔ)便道上的汽車(chē)。
二、算法設(shè)計(jì)
1、利用棧和隊(duì)列模擬車(chē)輛進(jìn)出;
2、充分考慮停車(chē)時(shí)間的復(fù)雜計(jì)算,包括平年和閏年,大月和小月以及任意日期之間的小時(shí)數(shù)計(jì)算;
3、運(yùn)用順序查找和折半查找對(duì)比查詢(xún)功能的時(shí)間復(fù)雜度;
三、數(shù)據(jù)結(jié)構(gòu)選擇
對(duì)象car:
自定義一個(gè)Car的類(lèi),包含汽車(chē)的車(chē)牌號(hào),車(chē)的顏色,車(chē)型,停車(chē)時(shí)間。
停車(chē)場(chǎng)
根據(jù)汽車(chē)在停車(chē)場(chǎng)的特點(diǎn)(后進(jìn)先出),存儲(chǔ)停車(chē)場(chǎng)內(nèi)的各種汽車(chē)選擇棧stack來(lái)存儲(chǔ)。考慮到棧無(wú)法遍歷(遍歷時(shí)無(wú)法存儲(chǔ)已有的數(shù)據(jù))的特點(diǎn),同時(shí)定義一個(gè)Car類(lèi)型的數(shù)組a[100]來(lái)存儲(chǔ)停車(chē)場(chǎng)內(nèi)的車(chē)輛信息,里面的數(shù)據(jù)和stack的數(shù)據(jù)是同步的。
便道
根據(jù)汽車(chē)在便道的進(jìn)出特點(diǎn)(先進(jìn)入便道的車(chē)先進(jìn)入停車(chē)場(chǎng)),選擇隊(duì)列queue來(lái)存儲(chǔ)在便道上的車(chē)輛信息。
停車(chē)時(shí)間
考慮到要從文件中讀取車(chē)輛信息,讀取的信息是string類(lèi)型,但時(shí)間計(jì)算是數(shù)值型,為了方便通過(guò)時(shí)間計(jì)算停車(chē)費(fèi)用,沒(méi)有單獨(dú)對(duì)年月日進(jìn)行定義,而是將時(shí)間格式(形如2019-7-30,12:30)統(tǒng)一,定義為string類(lèi)型。讀取信息后對(duì)字符串進(jìn)行分割處理,得到汽車(chē)停車(chē)時(shí)間(年、月、日、時(shí)、分)。
四、功能設(shè)計(jì)
class Manage{ public:void add();//停車(chē) void inquire();//查詢(xún) void show();//顯示函數(shù) void modification();//信息修改函數(shù) void del();//出停車(chē)場(chǎng)void statistics();//統(tǒng)計(jì)車(chē)輛信息函數(shù) void save();//寫(xiě)入文件函數(shù) void loadsave();//修改信息后重新寫(xiě)入文件函數(shù) void load();//運(yùn)行程序后加載最新數(shù)據(jù)函數(shù) };具體函數(shù)實(shí)現(xiàn)可下載我上傳的資源進(jìn)行查看,里面包含輸入輸出的TXT文件以及各個(gè)文件的作用說(shuō)明。
資源鏈接:https://download.csdn.net/download/chengxuyuanliwanwan/11461187
五、特色
出停車(chē)場(chǎng)時(shí),時(shí)間格式的轉(zhuǎn)化、時(shí)間的準(zhǔn)確計(jì)算以及折半查找的應(yīng)用都在一定程度上優(yōu)化了代碼。
出停車(chē)場(chǎng)模擬
折半查找實(shí)現(xiàn)查詢(xún)功能
int BinSearch(Car a[],string k){int n=i;int low=0,high=n-1,mid;int data1[3],data2[3],time1[2],time2[2];char *s1;char *t1[5];int l=0,atime[i][5];while(l<n){s1=(char*)a[l].time.data();//停車(chē)時(shí)間 int count1=0;while((t1[count1]=strtok(s1,"-,:"))!=NULL){count1++;s1=NULL;} //構(gòu)造停車(chē)時(shí)間的參數(shù) atime[l][0]=atoi(t1[0]);atime[l][1]=atoi(t1[1]);atime[l][2]=atoi(t1[2]);atime[l][3]=atoi(t1[3]);atime[l][4]=atoi(t1[4]);l++;}char *s2=(char*)k.data();//離開(kāi)停車(chē)場(chǎng)的時(shí)間 char *t2[5];int count2=0;while((t2[count2]=strtok(s2,"-,:"))!=NULL){count2++;s2=NULL;} //構(gòu)造離開(kāi)停車(chē)場(chǎng)的時(shí)間的參數(shù) data2[0]=atoi(t2[0]);data2[1]=atoi(t2[1]);data2[2]=atoi(t2[2]);time2[0]=atoi(t2[3]);time2[1]=atoi(t2[4]); start=clock(); while(low<=high){mid=(low+high)/2; if(data2[0]<atime[mid][0]){ high=mid-1;}else if(data2[0]>atime[mid][0]){ low=mid+1;}else {if(data2[1]<atime[mid][1]){ high=mid-1; }else if(data2[1]>atime[mid][1]){ low=mid+1; }else {if(data2[2]<atime[mid][2]){ high=mid-1; }else if(data2[2]>atime[mid][2]){ low=mid+1; }else {if(time2[0]<atime[mid][3]){ high=mid-1; }else if(time2[0]>atime[mid][3]){ low=mid+1; }else {if(time2[1]<atime[mid][4]){ high=mid-1; }else if(time2[1]>atime[mid][4]){ low=mid+1; }else { end=clock();x=end-start;return mid;}}}}}} return -1; }本次設(shè)計(jì)過(guò)程中學(xué)會(huì)了很多東西,很多庫(kù)函數(shù)的應(yīng)用大大簡(jiǎn)化了代碼,自己還需努力!
總結(jié)
- 上一篇: 干货!基于神经网络的多粒度图表征学习
- 下一篇: Let's Encrypt申请证书-保姆