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