第一篇:停車場管理系統銷售員摸底考試
濰 坊 恒 盛 智 能 控 制 科 技 有 限 公 司
停車場管理系統銷售人員培訓
摸底考試(含參考答案)
1、標準軟件最多支持幾路圖像對比(選擇題)
A:2路B:4路C:6路D:8路
2、無電腦模式下,P001可以脫機發卡嗎?
A:是B:否
3、一體機可以裝吐卡機臨時收費嗎?
不可以4、9021控制板是IC/ID互讀的嗎?
不是,P001是
5、車輛檢測器的作用有那些?
防砸車,車過自動落桿
6、藍牙遠距離系統的優勢,適用范圍。
優勢:
1、讀卡距離為1—30米,可以在較遠的距離內讀到卡片信息,擋車桿自動感應升起,不需要停車就可以經過系統驗證,實現車輛通過并收費;
2、擁有完善的管理中心軟件,能夠進行財務管理,可查詢打印詳細信息,并進行收費,方便管理;
3、能夠對車牌號進出圖像對比,提高停車場安全系數,大大增強停車場的防盜措施;
4、在沒有剩余車位(滿位)時會提示已滿位,并且禁止讀卡,即車輛不能入內;
5、支持脫機運行功能;
適用范圍:商業大廈、住宅小區、花園別墅停車場、高速路口、軍隊、物流管理、醫院、黨政機關、彎道、上下坡道地下車庫出入口
7、一套簡易的藍牙,出口和入口不在一起,相隔100米,基本配置有哪些? 普通藍牙設備的接線說明。
入口:一個道閘,一個車輛檢測器,一個地感線圈,一個藍牙主機,一個藍牙立柱,一個9021控制板
入口出口一樣
接線說明:讀卡器——控制板(9021)——道閘
8、有商住兩用地下停車場一個,兩個口均可進出,客戶想要標準收費系統,臨時車收費、長期用戶用遠距離,圖像對比功能,配置清單。
入口*2:一個道閘,兩個車輛檢測器,兩個地感線圈,一個LED,一個P001,一個語音模塊,讀卡器(一個IC,一個藍牙),一個24V/3A的電源,一個12V/3A的電源,一個吐卡機,一個藍牙立柱
出口*2:一個道閘,兩個車輛檢測器,兩個地感線圈,一個LED,一個P001,一個語音模塊,讀卡器(一個IC,一個藍牙),一個12V/3A的電源,一個藍牙立柱 管理中心:一臺電腦,一個485轉換器,一個視頻采集卡,一個加密狗,一套管理軟件,四個攝像頭
9.同行做停車場系統的知道哪些?(選答)
全國:捷順、富士、紅門
濟南:藍鵬
濰坊:昌通
第二篇:停車場收費管理系統
大手控制 www.tmdps.cn |引|領|停|車|管|理|新|概|念|
停車場收費管理系統
停車場收費管理系統是指基于現代化電子與信息技術,在停車區域的出入口處安裝自動識別裝置,通過非接觸式卡或車牌識別來對出入此區域的車輛實施判斷識別、準入/拒絕、引導、記錄、收費、放行等智能管理,其目的是有效的控制車輛與人員的出入,記錄所有詳細資料并自動計算收費額度,實現對場內車輛與收費的安全管理。
出入口處安裝自動識別裝置,通過非接觸式卡或車牌識別來對出入此區域的車輛實施判斷識別、準入/拒絕、引導、記錄、收費、放行等智能管理,其目的是有效的控制車輛與人員的出入,記錄所有詳細資料并自動計算收費額度,實現對場內車輛與收費的安全管理。停車場收費管理系統集感應式智能卡技術、計算機網絡、視頻監控、圖像識別與處理及自動控制技術于一體,對停車場內的車輛進行自動化管理,包括車輛身份判斷、出入控制、車牌自動識別、車位檢索、車位引導、會車提醒、圖像顯示、車型校對、時間計算、費用收取及核查、語音對講、自動取(收)卡等系列科學、有效的操作。這些功能可根據用戶需要和現場實際靈活刪減或增加,形成不同規模與級別的豪華型、標準型、節約型停車場收費管理系統。
停車場收費管理系統的組成
1、入口部分:
入口部分主要由入口票箱(內含感應式ID卡讀寫器、自動出卡機、車輛感應器、語音提示系統、語音對講系統)、自動路閘、車輛檢測線圈、入口攝像系統等組成。
2、出口部分:
出口部分主要由出口票箱(內含感應式ID卡讀寫器、自動吞卡機、語音提示系統、語音對講系統)、自動路閘、車輛檢測線圈、出口攝像系統等組成。
3、收費控制處:
收費控制處設備由收費控制電腦、UPS,報表打印機、操作臺、入口手動按
大手控制 www.tmdps.cn |引|領|停|車|管|理|新|概|念|
鈕、出口手動按鈕、語音提示系統、語音對講系統組成[2]。
主要設備
停車場收費管理系統配置包括停車場控制器(也叫停車場出入口控制器)、自動吐卡機、遠程遙控、遠距離卡讀感器、感應卡(有源卡和無源卡)、自動道閘、車輛感應器、壓力波檢測器、地感線圈、通訊適配器、攝像機、傳輸設備、停車場系統管理軟件等。
這種系統有助于公司企業、政府機關等對于內部車輛和外來車輛的進出進行現代化的管理,對加強企業的管理力度和提高公司的形象有較大的幫助。
控制器介紹
停車場專用控制器:專為停車場系統自主研制,四層板設計,信號和電源分層走線,集成度高、可靠性強,功能全面,接口豐富,電壓適應范圍大,防脈沖沖擊,確保使用的安全性和可靠性。
停車場收費管理系統設立在小區內,有若干入口和出口。所有出入口都要求聯網,實現數據通訊,并采用統一的計算機管理。最遠的出入口之間的距離約為800米,和兩個辦公樓的地下室設有一個出入口,整個停車場采用IC卡和視頻圖像管理。
停車場收費管理系統流程
車輛感應IC卡,可以存儲持卡人的各種信息。感應IC卡安裝在每輛車的駕駛室里面,當車駛過讀感器的感應區(離讀感器2米左右)時,感應IC卡通過讀感器發過來的激發信號產生回應信號發回給讀感器。讀感器再將這個讀取信號傳遞給停車場控制器,停車場控制器收到信息后,經自動核對為有效卡后,車閘自動開啟,數字錄像機開始錄像,拍下該車進入時的照片,電腦記錄車子牌號及駕駛員姓名和進出入的信息。
臨時車收費功能,臨時車進場時從出票機中領取臨時卡,出場時需繳納規定的費用,并經保安確認后方能離開。臨時車進入停車場時,地感線圈自動檢測到車輛的到來,自動出票機的中文電子顯示屏上顯示“歡迎光臨,請取卡”。根據出票機上的提示,司機按“入口自動出票機”上的出票按鈕,自動出票機將自己
大手控制 www.tmdps.cn |引|領|停|車|管|理|新|概|念|
吐出一張感應IC卡,并且讀卡器已自動讀完臨時卡。道閘開啟,MP4NET數字錄像機啟動拍照功能,控制器記錄下該車進入時間。臨時車駛出停車場時,司機將感應IC卡(臨時卡)在出口票箱處的感應區一晃,停車場控制自動檢測出是臨時卡,道閘將不會自動開啟。出口票箱的中文電子顯示屏上顯示“請交**元”,司機將卡還給保安,交完費后,保安將各市停車特用發票給司機。交完費后,經保安載收費電腦上確認,道閘開啟,數字錄像機啟動拍照功能,照片存入電腦硬盤,控制器記錄下該出場時間。臨時車將實行按次和時間停車交費,交費條件由用戶自己在電腦的管理軟件中設置。
大手控制 www.tmdps.cn |引|領|停|車|管|理|新|概|念|
停車場收費管理系統功能
可選用讀感距離和近距離兩種形式,選遠距離時,采用車載 有源卡最遠可達到3-25米。可以根據用戶實際需要進行選擇。
圖像對比功能:車輛進出停車場時,攝像機自動啟動攝像功能,并將照片文件存儲在電腦里。出場時,電腦自動將新照片和該車最后入場的照片進行對比,監控人員能實時監視車輛的安全情況。
常用卡管理:固定車主使用常用卡,確定有效期限(可精確到分、秒),在確認的時限內可隨意進出車場,否則不能進入車場,常用卡資料包括卡號、車號、有效時間等。常用卡實行按月交費,到期后軟件和中文電子顯示屏上將提示該卡已到期,請辦理續期和交款手續。
臨時車收費功能,臨時車進場時從出票機中領取臨時卡,出場時需繳納規定的費用,并經保安確認后方能離開。臨時車進入停車場時,地感線圈自動檢測到車輛的到來,自動出票機的中文電子顯示屏上顯示“歡迎光臨,請取卡”。根據出票機上的提示,司機按“入口自動出票機”上的出票按鈕,自動出票機將自己吐出一張感應IC卡,并且讀卡器已自動讀完臨時卡。道閘開啟,攝像機啟動拍照功能,控制器記錄下該車進入時間。臨時車駛出停車場時,司機將感應IC卡(臨時卡)在出口票箱處的感應區一晃,停車場控制自動檢測出是臨時卡,道閘將不會自動開啟。出口票箱的中文電子顯示屏上顯示“請交**元”,司機將卡還給保安,交完費后,保安將各市停車特用發票給司機。交完費后,經保安載收費電腦上確認,道閘開啟,MP4NET數字錄像機啟動拍照功能,照片存入電腦硬盤,控制器記錄下該出場時間。臨時車將實行按次和時間停車交費,交費條件由用戶自己在電腦的管理軟件中設置。
自動切換視頻,進出場無沖突。所有攝入的車輛照片文件存在電腦的硬盤中,可備以后查證。每一幅圖片都有時間記錄,查驗方便。
實時監視功能:無車進入時,可在監控電腦上實時監視進出口的車輛及一切事物的活動情況。
支持永久卡和臨時卡的工作方式,自動識別,記錄存儲。
防砸車功能:當車輛處于道閘的正下方時,地感線圈檢測到車輛存在,道閘
大手控制 www.tmdps.cn |引|領|停|車|管|理|新|概|念|
將不會落下,直至車輛全部駛離其正下方。
滿位檢測功能:在管理電腦中設置好該停車場的車位,如進入該停車場的車輛到達車位數時,電腦提醒管理員,并在電子顯示屏上顯示車位已滿。
支持脫機運行,網絡中斷或PC故障時,停車場系統工作正常。手動控制功能,停電時道閘能正常使用。系統自動維護,數據自動更新,自動檢測復位。
停車場控制器支持局域網網絡通訊功能,可實現多個出入口的聯網。出入口聯網時,必須安裝局域網網絡服務器和通訊服務器。
支持Wiegand26、Wiegand27、Wiegand32讀感器格式,自動檢測輸入。支持5000個用戶,可編輯用戶詳細信息。各種事件查詢功能,提供攝像的圖片時間查詢。
強大的報表功能,能生成各類報表,并提供多功能數據檢索。具有延時、過壓、欠壓自動保護。
停車場收費管理系統應用
隨著科技的進步和人類文明的發展停車場無論是從外形、功能、操作方面都有跨越式的改進,國內目前最薄的停車場收費管理系統達到令人驚訝的170MM的厚度,而且配備雙發卡模式和雙倍卡量來降低故障率。
智能停車場收費管理系統在住宅小區、大廈、機關單位的應用越來越普遍。而人們對停車場管理的要求也越來越高,智能化程度也越來越高,使用更加方便快捷,也給人類的生活帶來了方便和快樂。不僅提高了現代人類的工作效率,也大大的節約了人力物力,降低了公司的運營成本,并使得整個管理系統安全可靠。包括車輛人員身份識別、車輛資料管理、車輛的出入情況、位置跟蹤和收費的管理等等。
停車場收費管理系統發展
前些年,我國停車場智能管理技術還是一片空白,也談不上技術理念。為了擺脫這種現狀,有關部門采取了相應的措施,制定了長遠的發展規劃,為我國停
大手控制 www.tmdps.cn |引|領|停|車|管|理|新|概|念|
車場收費管理系統奠定了堅實的基礎,技術獲得較快發展。
目前,隨著新的智能化停車管理技術不斷發展,停車場管理正在向更開放、更靈活的方向發展。今后,車庫系統將作為樓宇自控系統的一個子系統納入建筑自動化網絡,形成一個綜合的計算機管理網絡信息系統。遠距離的管理人員可以通過聯網的方式,直接監視與控制車庫情況;停車場的信息也可通過網絡傳送到各部門,再由中心計算機對各部門的信息統一管理,形成決策支持信息系統,確保管理人員做出正確的決策。
停車場收費管理系統的一個主流技術是采用感應式IC/ID卡和圖像識別作為管理手段,同時具有紅外遙感控車門開關和防盜報警及倒車限位等功能。這套系統是伴隨著ID/IC卡、近距RF射頻識別卡、遠距離RF射頻識別卡等新型識別技術的興起而發展起來的。它克服了磁卡及條碼技術的缺點,具有壽命長、使用方便、不易損壞、高保密性等特點,使停車場智能管理上升到一個新的高度。
感應式ID/IC卡加圖像識別的管理技術,支持遠距離和近距離兩種讀感器,支持永久卡和臨時卡的工作方式,具有自動識別、記錄存儲等功能,能夠防止資金流失。由于這項技術是圖形對比與ID卡配合使用,達到防盜車的目的。
此外,目前業內還有一種主流技術:非接觸RFID卡識別技術。它繼承了IC/ID卡技術的優點,保密性高,省去了刷卡過程,提高了識別速度。由于該技術在識別系統中不存在活動機械裝置,杜絕了塞卡現象,提高了系統的可靠性。對于收費停車場而言,識別系統的可靠性就意味著停車場的可靠性。因此,只讀式RFID非接觸識別卡成為停車場收費管理系統中理想的識別技術。
停車場收費系統是小區建設的必然趨勢
隨著社會的進步和科學技術的迅猛發展,社會生活方式在不斷變化,人類開始邁入以數字化、網絡化為平臺的智能化社會。人們追求人性化、智能化的生活條件。其中正在興起的智能化小區,反映和適應了社會信息化和智能化的要求,是21世紀住宅的發展方向。
智能化小區為住戶提供了一種更加安全、舒適、方便、快捷和開放的智能化、信息化的生活空間,同時,它依靠高科技,實現了回歸自然的環境氛圍,促進了
大手控制 www.tmdps.cn |引|領|停|車|管|理|新|概|念|
優秀的人文環境發展,并依托先進的科學技術,實現小區物業運行的高效化、節能化、環保化。
根據這一發展形勢,建設部1999年發布了《全國住宅小區智能化技術示范工程工作大綱》。目前,建設部正組織實施全國住宅小區智能化示范工程,根據建設部規定,將智能建筑分為三個層次:即普及型住宅小區、先進型住宅小區與領先型住宅小區。三個層次都將一卡通管理系統作為大綱的基本要求,如今一卡通系統已成為樓市經營的必備內容和重要賣點,而智能停車場收費管理系統又是一卡通管理系統的重要組成部分,是智能小區建設的必然。
智能停車場收費管理系統采用先進技術和高度自動化的機電設備,將機械、電子計算機和自控設備以及智能IC卡技術有機地結合起來,通過電腦管理可實現車輛出入控制管理、自動數據存儲等功能,實現自動化運行,并提供—種高效管理服務的系統。非接觸式IC卡是智能IC卡技術中應用最廣的一種。非接觸式IC卡停車場收費管理系統是目前較先進的電腦收費管理系統之一,具有方便快捷、收費準確可靠、保密性好、靈敏度高、使用壽命長、形式靈活、功能強大等眾多優點,是磁卡、接觸式IC卡所不能比擬的,它已取代磁卡、接觸式IC卡而成為應用的主流。文章來源自:www.tmdps.cn
第三篇:《停車場管理系統》實驗設計報告
重慶郵電大學計算機科學與技術學院
《數據結構》實驗設計報告
題目:停車場管理系統 姓名:** 學號: 2010211998 班級:0491002 學院:計算機科學與技術學院
重慶郵電大學計算機科學與技術學院
目錄
一、問題描述………………………………………………………03
二、問題分析………………………………………………………03
三、數據結構描述…………………………………………………04
四、算法設計………………………………………………………04
五、程序優缺點分析及優化………………………………………05
六、程序源代碼……………………………………………………07
七、程序運行結果…………………………………………………13
八、心得體會………………………………………………………15 附
一、優化后的程序…………………………………………………16 附
二、優化后程序的運行結果………………………………………23
重慶郵電大學計算機科學與技術學院
一、問題描述
設計一個停車場管理系統。
設停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先后順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在停車場的最北端),若停車場內已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。【基本要求】
以棧模擬停車場,以隊列模擬車場外的便道,按照從終端讀入的輸入數據序列進行模擬管理。每一組輸入數據包括三個數據項:汽車?到達?或?離去?信息、汽車牌照號碼以及到達或離去的時刻。對每一組輸入數據進行操作后的輸出信息為:若是車輛到達,則輸出汽車在停車場內或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內停留的時間和應交納的費用(在便道上停留的時間不收費)。棧以順序結構實現,隊列以鏈表結構實現。【選作內容】
(1)兩個棧共享空間,思考應開辟數組的空間是多少?
(2)汽車可有不同種類,則他們的占地面積不同,收費標準也不同,如1輛客車和1.5輛小汽車的占地面積相同,1輛十輪卡車占地面積相當于3輛小汽車的占地面積。
(3)汽車可以直接從便道上開走,此時排在它前面的汽車要先開走讓路,然后再依次排到隊尾。
二、問題分析
該問題需要以棧和隊列作為基本的存儲結構,以順序棧模擬停車場,以鏈隊列模擬車場外的便道。汽車進入停車場,即是在順序棧上執行進棧操作,退出停車場即是在順序棧上執行出棧操作;汽車進入便道,即是在鏈隊列上執行入隊操作,退出便道即是在鏈隊列上執行出隊操作。
當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場。設要刪除的元素在順序表St中位置為i,則從i到top之間的全部元素進入到一個臨時棧St1中, 其次再刪除該元素,然后將臨棧St1的元素按照?先進后出?的原則重新回到St中。若鏈隊不空,則使隊頭進棧St,并以當前時刻開始計費。
程序需要構造兩個順序棧St和St1,其中St用于模擬停車場,St1用作臨時棧,臨時停放為給要離去的汽車讓路而從停車場退出來的汽車。此外還需要構
重慶郵電大學計算機科學與技術學院
造一個鏈隊列Qu用于模擬便道。
三、數據結構描述
/*定義順序棧類型*/ typedefstruct { intCarNo[N];
/*車牌號*/ intCarTime[N];
/*進場時間*/ int top;
/*棧指針*/ } SqStack;
/*定義順序棧類型*/
/*定義鏈隊類型*/ typedefstructqnode { intCarNo;
/*車牌號*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*隊首和隊尾指針*/ QNode *rear;} LiQueue;
四、算法設計
1.對于子函數模塊,則調用順序棧的基本操作和鏈隊列的基本操作。如下:
/*順序棧的基本運算算法*/ voidInitStack(SqStack *&s)
intStackEmpty(SqStack *s)
intStackFull(SqStack *s)
/*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2)
重慶郵電大學計算機科學與技術學院
/*刪除S的棧頂元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2)
voidDispStack(SqStack *s)
/*以下為鏈隊列的基本運算算法*/ voidInitQueue(LiQueue *&q)
intQueueLength(LiQueue *q)
intQueueEmpty(LiQueue *q)
voidenQueue(LiQueue *&q, int e)} intdeQueue(LiQueue *&q,int&e)
voidDisplayQueue(LiQueue *q)
2.主程序模塊 void main(){ 初始化; do { 接受命令;
處理命令;
} while(命令!=?退出?); }
五、程序優缺點分析及優化
1.程序的優點
在程序中設置了kind變量,用于保存車的類別,便于計算不同類別車的停車費用,如下程序段:
printf(“n請輸入車的類別【車的類別:1.代表小汽車 2.代表客車 3.代表卡車】:n”);scanf(“%d”,&kind);
其中kind可取值1,2,3;若kind取2,則表示一輛客車單位時間內的停車費用
重慶郵電大學計算機科學與技術學院
是一輛小汽車的2倍,若kind取3,則表示一輛卡車單位時間內的停車費用是一輛小汽車的3倍。
當然printf(“n請輸入車的類別【車的類別:1.代表小汽車 2.代表客車 3.代表卡車】:n”);中的1.2.3也可以根據實際情況改變。比如,若實際中,一輛小汽車單位時間內的停車費用
是一輛客車的2倍,一輛卡車單位時間內的停車費用是一輛客車的4倍,則可以改成:
printf(“n請輸入車的類別【車的類別:1.代表客車2.代表小汽車 4.代表卡車】:n”);
則kind可取值1,2,4; kind取1時對應的是客車,表示計算停車費用時以一輛客車單位時間內的停車費用為基數,若kind取2,則表示一輛小汽車單位時間內的停車費用是一輛客車的2倍,若kind取4,則表示一輛卡車單位時間內的停車費用是一輛客車的4倍。
2.程序的缺點
(1)輸入時間時,程序沒有檢測錯誤功能 程序的輸入形式如下: 設n=2,輸入數據為:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。其中:‘A’表示到達(arrival);‘D’表示離去(departure);‘E’表示輸出結束(end)。
設每個輸入項的形式為(Choose, CarNumber, Time),其中Choose表示每個括號中的第一項數據,即A/D/E; CarNumber表示每個括號中的第二項,即1/2/3;Time表示每個括號中的第三項,即5/10/15。設前后兩次輸入的數據中的第三項分別為Time1,Time2;則必須滿足Time2≧Time1。而在實際輸入過程中用戶可能會忽略這一點,所以應該在輸入Time是設置一個判斷語句,若前后兩次輸入的Time不滿足Time2≧Time1,則要求用戶重新輸入,直至滿足要求為止。
(2)程序的界面不夠清晰,一次性輸入的數據項比較多,容易出錯。3.改進思想(1)
為了保證前后兩次輸入的Time必須滿足Time2≧Time1,使程序具有錯誤檢測功能,在程序輸入部分添加了如下代碼:
printf(“輸入現在的時刻:n”);
scanf(“%d”,&time2);
while(time2 { printf(“時間輸入錯誤,請重新輸入:n”); scanf(“%d”,&time2); 重慶郵電大學計算機科學與技術學院 } time1=time2;//time1定義為靜態變量 (2)為了使程序有更清晰的界面,可在主函數中加入菜單的顯示方式。且數據可以采用一次輸入一個數據項,分步輸入的方式,使輸入過程少出錯。于是可以將主函數進行修改。(見附錄一) 六、程序源代碼 #include /*停車場內最多的停車數*/ #define Price 2 /*每單位停車費用*/ typedefstruct { intCarNo[N]; /*車牌號*/ intCarTime[N]; /*進場時間*/ int top; /*棧指針*/ } SqStack; /*定義順序棧類型*/ /*定義鏈隊類型*/ typedefstructqnode { intCarNo; /*車牌號*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*隊首和隊尾指針*/ QNode *rear;} LiQueue; /*順序棧的基本運算算法*/ voidInitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1; 重慶郵電大學計算機科學與技術學院 } intStackEmpty(SqStack *s){ return(s->top==-1);} intStackFull(SqStack *s){ return(s->top==N-1);} /*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2){ if(s->top==N-1) return 0;s->top++;s->CarNo[s->top]=e1;s->CarTime[s->top]=e2;return 1;} /*刪除S的棧頂元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2){ if(s->top==-1) return 0;e1=s->CarNo[s->top];e2=s->CarTime[s->top];s->top--;return 1;} voidDispStack(SqStack *s){ int i;for(i=0;i<=s->top;i++) printf(“%d ”,s->CarNo[i]);printf(“n”);} /*以下為鏈隊列的基本運算算法*/ 重慶郵電大學計算機科學與技術學院 voidInitQueue(LiQueue *&q){ q=(LiQueue *)malloc(sizeof(LiQueue));q->front=q->rear=NULL;} intQueueLength(LiQueue *q){ int n=0;QNode *p=q->front;while(p!=NULL){ n++; p=p->next;} return(n);} intQueueEmpty(LiQueue *q){ if(q->rear==NULL) return 1;else return 0;} voidenQueue(LiQueue *&q, int e){ QNode *s;s=(QNode *)malloc(sizeof(QNode));s->CarNo=e;s->next=NULL;if(q->rear==NULL)/*若鏈隊為空,則新結點是隊首結點又是隊尾結點*/ q->front=q->rear=s;else { q->rear->next=s;/*將*s結點鏈到隊尾,rear指向它*/ q->rear=s;} } intdeQueue(LiQueue *&q,int&e){ QNode *t;if(q->rear==NULL)/*隊列為空*/ return 0; 重慶郵電大學計算機科學與技術學院 if(q->front==q->rear)/*隊列中只有一個結點時*/ { t=q->front; q->front=q->rear=NULL;} else /*隊列中有多個結點時*/ { t=q->front; q->front=q->front->next;} e=t->CarNo;free(t);return 1;} voidDisplayQueue(LiQueue *q){ QNode *p=q->front;while(p!=NULL){ printf(“%d ”,p->CarNo); p=p->next;} } void main(){ char choose;/*用于選擇命令*/ int no,e1,time,e2,kind;/*用于存放車牌號、當前停車時刻*/ inti,j;SqStack *St,*St1;/*臨時棧St1,當停車場中間的車要推出去時,用于倒車*/ LiQueue *Qu;InitStack(St);InitStack(St1);InitQueue(Qu);printf(“ #”);printf(“n# #”);printf(“n# 歡迎使用停車場管理系統 #”); 重慶郵電大學計算機科學與技術學院 printf(“n# #”);printf(“n# 【輸入提示】:汽車狀態由A、D、E 表示。其中,A:表示汽車到達 D:表示汽車離去, #”);printf(“n# E:表示輸出結束。每次輸入的數據由三項構成,即:(汽車狀態,車牌號,當前時刻)#”);printf(“n# 數據項之間以逗號分開。例如輸入示范:A,1,5 #”);printf(“n #n”);printf(“n正在讀取汽車信息...n”); do { printf(“n*****************************************************************”);printf(“n請分別輸入汽車狀態(A/D/E)、車牌號和當前時刻(數據之間以逗號分開):n”);scanf(“ %c,%d,%d”,&choose,&no,&time); switch(choose){ /*************************** 汽車到達 ******************************/ case 'A': case 'a': if(!StackFull(St)) /*停車場不滿*/ { Push(St,no,time); printf(“該車在停車場中的位置是:%dn”,St->top+1); } else /*停車場滿*/ { enQueue(Qu,no); printf(“n停車場已滿,該車進入便道,在便道中的位置是:%dn”,QueueLength(Qu)); } break;/************************* 汽車離開 ********************************/ case 'D': case 'd': 重慶郵電大學計算機科學與技術學院 printf(“n請輸入車的類別【車的類別:1.代表小汽車 2.代表客車 3.代表卡車】:n”);scanf(“%d”,&kind); for(i=0;i<=St->top && St->CarNo[i]!=no;i++); if(i>St->top)/*要離開的汽車在便道上*/ { /*汽車可以直接從便道上開走,此時排在它前面的汽車要先開走讓路,然后再依次排到隊尾*/ while(Qu->front->CarNo!=no) { enQueue(Qu,Qu->front->CarNo); // deQueue(Qu,Qu->front->CarNo); Qu->front = Qu->front->next; } deQueue(Qu,no);printf(“n便道上車牌號為%d的汽車已離開!n”,no); printf(“n當前便道中的車輛的車牌號分別是:”); DisplayQueue(Qu); printf(“n”); } else /*要離開的汽車在停車場中*/ { for(j=i;j<=St->top;j++) { Pop(St,e1,e2);/*e1,e2用來返回被刪元素的車牌號和停車時刻*/ Push(St1,e1,e2);/*倒車到臨時棧St1中,將e1,e2插入到臨時棧中*/ } Pop(St,e1,e2); /*該汽車離開*/ printf(“n車牌號為%d的汽車停車時間為:%d。停車費用為:%dn”,no,time-e2,(time-e2)*Price*kind); /*對小汽車而言:當前時刻 減去 該車當時停車的時刻,再乘以價格就是費用,而對于客車和卡車而言,就要乘以kind倍小汽車的價格*/ while(!StackEmpty(St1))/*將臨時棧St1重新回到St中*/ { Pop(St1,e1,e2); Push(St,e1,e2); } if(!QueueEmpty(Qu))/*隊不空時,將隊頭進棧St*/ { 重慶郵電大學計算機科學與技術學院 deQueue(Qu,e1); Push(St,e1,time);/*以當前時間開始計費*/ } printf(“n當前停車場中的車輛的車牌號分別是:”);//輸出停車場中的車輛 DispStack(St); } break;/************************ 結束 *********************************/ case 'E': case 'e': printf(“n正在退出系統...n”); if(!StackEmpty(St))//顯示停車場情況 { printf(“n當前停車場中的車輛的車牌號分別是:”);//輸出停車場中的車輛 DispStack(St); printf(“n”); } else printf(“n當前停車場中無車輛nn”); break;/************************ 結束 *********************************/ default: /*其他情況*/ printf(“輸入的命令錯誤!n”); break;} } while(choose!='E'&&choose!='e');} 七、程序運行結果 取N=2,即停車場內最多的停車數為2 取 Price=2,即每單位停車費用為2 輸入數據為:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),重慶郵電大學計算機科學與技術學院 (‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。程序演示結果如下圖所示: 重慶郵電大學計算機科學與技術學院 八、心得體會 (1)該實驗涉及到順序棧的建立、插入、刪除等操作,涉及到了鏈隊列的建立、插入、刪除等操作。做這個實驗,加深了我對以上知識點的認識和理解。(2)提高了 C 語言編程的能力。在程序設計過程中,需要經過反復地編寫,調試,運行,發現問題并解決問題,在這次實驗的設計中,我加深對程序的了解,提高自己的實際動手能力和獨立思考的能力同時我也學會了綜合以前學到的基本知識來解決較大問題的方法。 (3)一方面我養成了注重程序細節的意識。例如: printf(“n請分別輸入汽車狀態(A/D/E)、車牌號和當前時刻(數據之間以逗號分開):n”);scanf(“ %c,%d,%d”,&choose,&no,&time); 重慶郵電大學計算機科學與技術學院 %c,前面必須留一個空格,否則程序在顯示的時候就會有一些問題。 (4)另一方面我也深刻地認識到了《數據結構》這門課程的重要性。“數據結構”在計算機科學中是一門綜合性的專業基礎課。數據結構的研究不僅涉及到計算機硬件的研究,而且和計算機軟件的研究有著更密切的關系,無論是編譯程序還是操作系統,都涉及到數據元素在存儲器中的分配問題。在研究信息檢索時也必須 考慮如何組織數據,以便使查找和存取數據元素更為方便。可以認為數據結構是介于數學、計算機硬件和計算機軟件三者之間的一個核心內容,是從事計算機科學研究及其應 用的科技工作者必須掌握的重要內容 附 一、優化后的程序 #include /*停車場內最多的停車數*/ #define Price 2 /*每單位停車費用*/ typedefstruct { intCarNo[N]; /*車牌號*/ intCarTime[N]; /*進場時間*/ int top; /*棧指針*/ } SqStack; /*定義順序棧類型*/ /*定義鏈隊類型*/ typedefstructqnode { intCarNo;/*車牌號*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*隊首和隊尾指針*/ QNode *rear;} LiQueue; /*順序棧的基本運算算法*/ voidInitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;} 重慶郵電大學計算機科學與技術學院 intStackEmpty(SqStack *s){ return(s->top==-1);} intStackFull(SqStack *s){ return(s->top==N-1);} /*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2){ if(s->top==N-1) return 0;s->top++;s->CarNo[s->top]=e1;s->CarTime[s->top]=e2;return 1;} /*刪除S的棧頂元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2){ if(s->top==-1) return 0;e1=s->CarNo[s->top];e2=s->CarTime[s->top];s->top--;return 1;} voidDispStack(SqStack *s){ int i;for(i=0;i<=s->top;i++) printf(“%d ”,s->CarNo[i]);printf(“n”);} /*以下為鏈隊列的基本運算算法*/ voidInitQueue(LiQueue *&q){ q=(LiQueue *)malloc(sizeof(LiQueue)); 重慶郵電大學計算機科學與技術學院 q->front=q->rear=NULL;} intQueueLength(LiQueue *q){ int n=0;QNode *p=q->front;while(p!=NULL){ n++; p=p->next;} return(n);} intQueueEmpty(LiQueue *q){ if(q->rear==NULL) return 1;else return 0;} voidenQueue(LiQueue *&q, int e){ QNode *s;s=(QNode *)malloc(sizeof(QNode));s->CarNo=e;s->next=NULL;if(q->rear==NULL)/*若鏈隊為空,則新結點是隊首結點又是隊尾結點*/ q->front=q->rear=s;else { q->rear->next=s;/*將*s結點鏈到隊尾,rear指向它*/ q->rear=s;} } intdeQueue(LiQueue *&q,int&e){ QNode *t;if(q->rear==NULL)/*隊列為空*/ return 0;if(q->front==q->rear)/*隊列中只有一個結點時*/ { t=q->front; 重慶郵電大學計算機科學與技術學院 q->front=q->rear=NULL;} else /*隊列中有多個結點時*/ { t=q->front; q->front=q->front->next;} e=t->CarNo;free(t);return 1;} voidDisplayQueue(LiQueue *q){ QNode *p=q->front;while(p!=NULL){ printf(“%d ”,p->CarNo); p=p->next;} printf(“n”);} void main(){ int choose;/*用于選擇命令*/ int no,e1,time2,e2,no_away;/*no_away:汽車離開時輸入車牌號;time2:當前停車時刻;*/ static int time1;/*靜態變量time1用于存放上次時刻*/ inti,j;int kind;/*車的類別*/ time1=time2=0;SqStack *St,*St1;/*臨時棧St1,當停車場中間的車要推出去時,用于倒車*/ LiQueue *Qu;InitStack(St);InitStack(St1);InitQueue(Qu);printf(“ ”);printf(“n# #”); 重慶郵電大學計算機科學與技術學院 printf(“n# 歡迎使用停車場管理系統 #”);printf(“n# #”);printf(“n n”);do { printf(“n******************** 主菜單 ****************************n”); printf(“** 1:車輛到達 **n”); printf(“** 2:車輛離開 **n”); printf(“** 3:顯示停車場的車輛 **n”); printf(“** 4:顯示便道中的車輛 **n”); printf(“** 0:退出 **n”); printf(“********************************************************n”); printf(“請選擇:”); scanf(“%d”,&choose); switch(choose) { case 1: // #汽車到達 ###### printf(“輸入輸入車牌號、當前時刻(數據之間以逗號隔開):n”); scanf(“%d,%d”,&no,&time2);/*依次輸入車牌號、當前停車時刻*/ while(time2 { printf(“時間輸入錯誤,請重新輸入當前時刻:n”); scanf(“%d”,&time2); } time1=time2; if(!StackFull(St)) /*停車場不滿*/ { Push(St,no,time1); printf(“該車在停車場中的位置是:%dn”,St->top+1); 重慶郵電大學計算機科學與技術學院 } else /*停車場滿*/ { enQueue(Qu,no); printf(“n停車場已滿,該車進入便道,在便道中的位置是:%dn”,QueueLength(Qu)); } break; case 2: // ##汽車離開 #### printf(“輸入車牌號:n”); scanf(“%d”,&no_away); printf(“請輸入車的類別【車的類別:1.代表小汽車 2.代表客車 3.代表卡車】:n”);scanf(“%d”,&kind); printf(“輸入現在的時刻:n”);/*現在的時刻time1得大于之前的時刻time1*/ scanf(“%d”,&time2); while(time2 { printf(“時間輸入錯誤,請重新輸入:n”); scanf(“%d”,&time2); } time1=time2; for(i=0;i<=St->top && St->CarNo[i]!=no_away;i++); if(i>St->top)/*汽車可以直接從便道上開走,此時排在它前面的汽車要先開走讓路,然后再依次排到隊尾*/ { while(Qu->front->CarNo!=no_away) { enQueue(Qu,Qu->front->CarNo); Qu->front = Qu->front->next; } deQueue(Qu,no_away);printf(“n便道上車牌號為%d的汽車已離開!n”,no_away); printf(“n當前便道中的車輛的車牌號分別是:”); DisplayQueue(Qu); printf(“n”); } else 重慶郵電大學計算機科學與技術學院 { for(j=i;j<=St->top;j++) { Pop(St,e1,e2);/*e1,e2用來返回被刪元素的車牌號和停車時刻*/ Push(St1,e1,e2);/*倒車到臨時棧St1中,將e1,e2插入到臨時棧中*/ } Pop(St,e1,e2); /*該汽車離開*/ printf(“n車牌號為%d的汽車停車費用為:%dn”,no_away,(time2-e2)*Price*kind);/*對小汽車而言:當前時刻 減去 該車當時停車的時刻,再乘以價格就是費用,而對于客車和卡車而言,就要乘以kind倍小汽車的價格*/ while(!StackEmpty(St1))/*將臨時棧St1重新回到St中*/ { Pop(St1,e1,e2); Push(St,e1,e2); } if(!QueueEmpty(Qu))/*隊不空時,將隊頭進棧St*/ { deQueue(Qu,e1); Push(St,e1,time1);/*以當前時間開始計費*/ } } break; case 3: // #####顯示停車場情況 if(!StackEmpty(St)) { printf(“當前停車場中的車輛的車牌號分別是:”);/*輸出停車場中的車輛*/ DispStack(St); } else printf(“停車場中無車輛!n”); break; case 4: // ######顯示便道情況 # if(!QueueEmpty(Qu)) { 重慶郵電大學計算機科學與技術學院 printf(“ 當前便道中的車輛的車牌號分別是:”);/*輸出便道中的車輛*/ DisplayQueue(Qu); } else printf(“便道中無車輛!n”); break; case 0: // # 結束 ### printf(“n正在退出系統...n”); if(!StackEmpty(St)) { printf(“當前停車場中的車輛的車牌號分別是:”);/*輸出停車場中的車輛*/ DispStack(St); } if(!QueueEmpty(Qu)) { printf(“ 當前便道中的車輛的車牌號分別是:”);/*輸出便道中的車輛*/ DisplayQueue(Qu); } break; /**********************************************************/ default: /*其他情況*/ printf(“輸入的命令錯誤!n”); break; } } while(choose!=0);} 附 二、優化后程序的運行結果 取N=2,即停車場內最多的停車數為2 取 Price=2,即每單位停車費用為2 輸入數據為:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。程序演示結果如下圖所示: 重慶郵電大學計算機科學與技術學院 重慶郵電大學計算機科學與技術學院 重慶郵電大學計算機科學與技術學院 重慶郵電大學計算機科學與技術學院 重慶郵電大學計算機科學與技術學院 停車場收費管理系統 需求報告 目錄 1 2 3 摘要 項目背景介紹 停車場收費管理系統的現狀 功能需求 4.1 通用基本功能 4.2 圖像識別比較功能 4.3 先進的閘機安全安裝 4.4 可增設中遠距離車輛感應 5 性能需求 5.1 系統基本要求 5.2 數據管理能力要求 5.3 故障處理要求 外部接口說明 6.1 入口和出口部分 6.2 數據流程 7 修正系統開發計劃 摘要 停車場電腦收費管理系統是現代化停車場車輛收費及設備自動化管理的統稱,是將車場完全置于計算機管理下的高科技機電一體化產品。 根據多年設計、安裝停車場收費系統的實際經驗,我們在軟件和系統設計上為停車場提供了一套最嚴格、最先進、易用、便于維護和運行可靠的收費系統;一套能有效的堵塞收費漏洞,降低操作成本,提高經濟效益和減輕勞動強度,提高工作效率的現代化收費管理系統 隨著時代的發展,私家車越來越多,而車位卻十分緊張。在市區內有很多空間沒 有被充分利用,大多車輛是停在路邊或者簡易停車場,缺乏管理,這樣導致了資源的浪費,也造成了街道的擁堵。為了適應社會的發展,大量的現代化大規模的停車場會被投入使用,但管理方面又容易出現問題。因此,停車場管理系統的開發和應用是十分必要的。 此報告的目的重在分析此程序的總體需求,實現方案,并分析開發系統的可行性,為決策者提供是否開發該系統的依據和建議。項目背景介紹 2.1 開發軟件名稱:停車場管理系統 2.2項目開發者: 某軟件開發小組 2.3用戶單位: 某公司 2.4大體框架: 智能停車場收費管理系統 門禁管理系統 智能通道管理系統 考勤管理系統 智能巡更管理系統 收費管理系統等子系統 閉路監視系統(CCTV) 消防安全系統(FA)和保安系統(SA)緊急廣播系統 停車場收費管理系統的現狀 該系統具有很大的市場潛力,以現在的車輛增長速度推測,在不久的將來肯定會有許多大規模停車場(包括住宅小區)建成,此系統的開發很有價值。本系統現有的技術條件完全有能力順利完成開發工作,硬件、軟件上的配置也很容易滿足開發者的要求,開發系統的計算機硬件已經非常普及,完全沒有問題;現在的計算機各方面的技術都非常成熟,相對來說開發此系統的技術也要求比較簡單,因此在技術方面是可行的;各類技術人員的數量、水平、來源等也能很容易滿足;而且此系統的專業性不強,因此不需要相關行業人士,開發人員的選擇就有很大余地。停車場計費管理系統的主要工作是減少人工計費帶來的不便,提高辦事效率,使車輛管理工作更加信息化,電子化。充分發揮計算機的信息傳輸速度快、準確度高的優勢。功能需求 4.1通用基本功能: 入口讀卡升閘、出口讀卡驗卡收費、車滿顯示、出入口與收費亭對講、公正收費等等。 4.2 圖像識別比較功能: 其他有圖像識別功能的系統,其識別都是單向識別,即僅入口攝取,出口須由管理員目測比較。本系統入口、出口均采用攝像機比較,方便管理員直觀比較。 4.3 先進的閘機安全安裝: 道閘欄桿配的自動平穩裝置,以及防抬桿、防砸車功能,檢測功能具有高靈敏度和高可靠性。能很好地識別非機動車及人員等誤報情況。 4.4 可增設中遠距離車輛感應: 采用50-80cm中距離或5-8m遠距離感應范圍的讀卡器,經多次實際認證為最方便的操作距離。系統如果沒有特殊要求一般車輛經過讀卡器的距離約為10--15cm。性能需求 5.1 系統基本要求 響應時間:系統的響應時間不能超過1分鐘 警告時間及次數:每隔三分鐘重復警告一次,每次警告時間持續一分鐘。主存容量:內存:128MB RAM 磁盤容量:不小于1G 顯示器:256色,800*600以上的兼容顯示器 5.2 車輛管理能力要求 計費 分為入口和出口,中間設立崗樓,一人操作,高峰時期可兩人操作,入口處發放計費卡,出口處憑借計費卡繳費,放行,操作簡單快速方便。長期客戶可辦理月票。客戶也可購買車位,實現車位預留 監控 全范圍監控,無死角,監控畫面與保安室相連接,可錄像。一旦出現事故或意外,保安可第一時間趕到現場,必要時可以直接報警。出現緊急情況,如火災時,會自動啟動消防設備,并自動開啟大門,放行車輛。自動引導車位 停車更加快速,有效,方便。 5.3 故障處理要求 列出可能的軟件、硬件故障以及對各項性能而言所產生的后果和對故障處理的要求。輸出發生錯誤時,在系統的代碼部分進行修改 外部接口說明 6.1 入口和出口部分 入口控制部分: 智能停車場收費管理系統 門禁管理系統 智能通道管理系統 考勤管理系統 智能巡更管理系統 出口控制部分: 收費管理系統等子系統 閉路監視系統(CCTV) 消防安全系統(FA)和保安系統(SA)緊急廣播系統 6.2 數據流程 修正系統開發計劃 對于車輛的管理有待提高,如停車位置,出場路線等。在以后的系統中,會提供諸如此類的更加人性化的服務。 本系統會提供多國語言的電子錄音,使此系統對不懂中文的客戶也適用。 一.問題描述 1.實驗題目: 設停車場是一個可停放 n 輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先后順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在車場的最北端)。若停車場內已經停滿 n輛車,那么后來的車只能在門外的便道上等候。一旦有車開走,則排在便道上的第一輛車即可開入。當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場。每輛停放在車場的車在它離開停車場時必須按它停留的時間長短繳納費用。試為停車場編制按上述要求進行管理的模擬程序。 要求:根據各結點的信息,調用相應的函數或者語句,將結點入棧入隊,出棧或者出隊。 二.需求分析 1.程序所能達到的基本可能: 程序以棧模擬停車場,以隊列模擬車場外的便道,按照從終端讀入數據的序列進行模擬管理。棧以順序結構實現,隊列以鏈表結構實現。同時另設一個棧,臨時停放為給要離去的汽車讓路而從停車場退出來的汽車。輸入數據按到達或離去的時刻有序。當輸入數據包括數據項為汽車的“到達”(‘A’表示)信息,汽車標識(牌照號)以及到達時刻時,應輸出汽車在停車場內或者便道上的停車位置;當輸入數據包括數據項為汽車的“離去”(‘D’表示)信息,汽車標識(牌照號)以及離去時刻時,應輸出汽車在停車場停留的時間和應繳納的費用(便道上停留的時間不收費);當輸入數據項為(‘P’,0,0)時,應輸出停車場的車數;當輸入數據項為(‘W’, 0, 0)時,應輸出候車場車數;當輸入數據項為(‘E’, 0, 0),退出程序;若輸入數據項不是以上所述,就輸出“ERROR!”。2.輸入輸出形式及輸入值范圍: 程序運行后進入循環,顯示提示信息:“Please input the state,number and time of the car:”,提示用戶輸入車輛信息(“到達”或者“離開”,車牌編號,到達或者離開的時間)。若車輛信息為“到達”,車輛信息開始進棧(模擬停車場),當棧滿,會顯示棧滿信息:“The parking place is full!”,同時車輛進隊列(模擬停車 場旁便道),并顯示該進入便道車輛的車牌編號,讓用戶知道該車的具體位置;若車輛信息為“離開”,會顯示該車進入停車場的時間以及相應的停車費用,若該車較部分車早進停車場,這部分車需先退出停車場,暫時進入一個新棧為其讓道,會顯示進入新棧的車輛的車牌編號及其入停車場的時間,當待離開車離開停車場后,這部分車會重新進入停車場,同時便道上的第一輛車進入停車場;若輸入(‘P’,0,0),會顯示停車場的車數;若輸入(‘W’,0,0),會顯示便道上的車數;若輸入(‘E’,0,0),程序會跳出循環,同時程序結束;若輸入為其他字母,程序會顯示“ERROR!”報錯。若便道上沒有車輛停靠,會顯示便道為空的信息:用戶每輸入一組數據,程序就會根據相應輸入給出輸出。輸入值第一個必須為字母,后兩個為數字。 三.概要設計 為了實現上述功能,該程序以棧模擬停車場以及臨時停放為給要離去的汽車讓路而從停車場退出來的汽車的場地,以隊列模擬車場外的便道,因此需要棧和隊列這兩個抽象數據類型。1.棧抽象數據類型定義: ADT SqStack{ 數據對象:D={ai,bi,ci,di|ai?int,bi?int,ci?int,di?char,i=1,2,3....,n,n?0} 數據關系:R={(ai,bi,di)|ai,bi,di?D,ai,bi,di?struct car}; 基本操作: Judge_Output(s,q,r);//根據r中車輛信息控制車輛是入棧s還是 入隊q以及相關操作 A_cars(s,q, a);//將到達車輛a的信息入棧s或者入隊q D_cars(s,q, d);//將待離開車輛d出棧s,并將q中相應車輛 入棧并進行相關的操作 }ADT SqStack 2.隊列抽象數據類型定義: ADT LinkQueue{ 2 數據對象:D={ai,bi,ci|ai?Qnode *,bi?Qnode *,ci?int,i=1,2,3....,n,n?0}; 數據關系:R=?; 基本操作: Judge_Output(s,q,r);//根據r中車輛信息控制車輛是入棧s 還是入隊q以及相關操作 A_cars(s,q, a);//將到達車輛a的信息入棧s或者入隊q D_cars(s,q, d);//將待離開車輛d出棧s,并將q中相應車 輛入棧并進行相關的操作 }ADT LinkQueue 3.主要算法流程圖: I.Judge_Output算法流程圖: 開始F輸入為E(e)TF輸出輸入為P(p)“STOP!”TF輸入為W(w)輸出停車場車輛的數目TF輸入為A(a)輸出便道上車輛數目T輸入為D(d)調用A_cars函數調用D_cars函數結束II.A_cars算法流程圖: 開始停車場未滿TF車進停車場車進便道結束III.D_cars算法流程圖: 開始該車是最后進T停車場的車F在該車后進的車退結賬離開出停車場后讓其結賬離開便道上有車TF便道上第一輛車進停車場結束 4.本程序保護模塊: 主函數模塊 棧單元模塊:實現棧的抽象數據類型 隊列單元模塊:實現隊列的抽象數據類型 調用關系: 棧單元模塊主函數模塊隊列單元模塊四.詳細設計 1.相關頭文件庫的調用說明: #include #include { char bb; int num; int time; };struct rangweicar {int num;int time;};typedef struct stackk {struct rangweicar H[MAXSIZE];int topp; }SqStackk;#define QNODE struct Qnode QNODE { int data; QNODE *next; };3.棧類型和隊列類型: typedef struct stack {struct car G[n]; int top;}SqStack;typedef struct linkqueue {QNODE *front,*rear; int geshu;}LinkQueue;//部分基本操作的偽碼實現 void Judge_Output(SqStack *s,LinkQueue *q,struct car *r){ if((*r).bb=='E'||(*r).bb=='e')printf(“STOP!n”);else if((*r).bb=='P'||(*r).bb=='p')printf(“The number of parking cars is %dn”,(s->top)+1);else if((*r).bb=='W'||(*r).bb=='w')printf(“The number of waiting cars is %dn”,q->geshu);else if((*r).bb=='A'||(*r).bb=='a')A_cars(s,q,*r);else if((*r).bb=='D'||(*r).bb=='d')D_cars(s,q,*r);else printf(“ERROR!n”);} A_cars(SqStack *s,LinkQueue *q,struct car a){QNODE *t;if(s->top!=n-1){(s->top)++;(s->G[s->top]).bb=a.bb;(s->G[s->top]).num=a.num;(s->G[s->top]).time=a.time;} else {printf(“The parking place is full!n”);t=(QNODE *)malloc(sizeof(QNODE));t->data=a.num;t->next=NULL;q->rear->next=t;q->rear=t;printf(“the number of the car in the access road is:%dn”,q->rear->data);q->geshu++;} } int D_cars(SqStack *s,LinkQueue *q,struct car d){int i,j,l;float x,y;QNODE *p;SqStackk *k;if(d.num==(s->G[s->top]).num){x=d.time-(s->G[s->top]).time;y=fee*x;printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y);if(q->geshu==0){printf(“The queue is empty!n”); return 0;} else {p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; return 1; } } else {for(i=0;i<(s->top);i++) {if((s->G[i]).num!=d.num)continue;else break;} if(i>=(s->top)) {printf(“ERROR!n”); return-1; } x=d.time-(s->G[i]).time; y=fee*x; printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); k=(SqStackk *)malloc(sizeof(SqStackk)); k->topp=-1; for(j=(s->top);j>i;j--) {k->topp++;(k->H[k->topp]).num=(s->G[j]).num; (k->H[k->topp]).time=(s->G[j]).time; s->top--; } for(l=0;l<=(k->topp);l++){printf(“the information(number and time)in the new stack is:n”); printf(“%d,%dn”,(k->H[l]).num,(k->H[l]).time);} s->top--; while(k->topp>=0) {s->top++; (s->G[s->top]).bb='A'; (s->G[s->top]).num=(k->H[k->topp]).num; (s->G[s->top]).time=(k->H[k->topp]).time; k->topp--; } if(q->geshu==0) {printf(“The access road is empty!n”); return 2; } else {s->top++; p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; return 3; } } } 4.主函數的偽碼: main() {SqStack *s; LinkQueue *q; QNODE *p; struct car aa[MAXSIZE]; int i; s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; q=(LinkQueue *)malloc(sizeof(LinkQueue)); p=(QNODE *)malloc(sizeof(QNODE)); p->next=NULL; q->front=q->rear=p; q->geshu=0;printf(“******************************************************************************n”); printf(“************************* *************************n”); printf(“************************* 停車場管理系統 *************************n”); printf(“************************* *************************n”); printf(“******************************************************************************n”); for(i=0;i {printf(“Please input the state,number and time of the car:n”); scanf(“%c,%d,%d”,&(aa[i].bb),&(aa[i].num),&(aa[i].time)); getchar();Judge_Output(s,q,&aa[i]); if(aa[i].bb=='E'||aa[i].bb=='e')break; } } 5.函數調用關系: 調用A_cars函數調用Judge_Output函數main函數調用D_cars函數 五.測試分析: 1.出現問題及解決辦法: 該程序是四個程序調試中最順利的一個,只在一個地方上出了問題,就是輸入字符時由于回車鍵也是字符,回車鍵總會被讀入,導致經常輸出“ERROR!”。后來找到原因后在scanf函數后緊接著加了一個getchar();語句后就恢復了正常。 2.方法優缺點分析: 優點:用棧和隊列來模擬停車場讓整個問題顯得簡單,易于實現; 缺點:棧和隊列這兩個數學模型用在停車場管理上還是有失妥當的,現實中停車場出口入口不可能為同一處,不可能當一輛車要離開,在它后面進來的車必須為它讓路,因此無法用棧的“后進先出”原則來模擬;而且沒有考慮便道上的車在等待過程中可以中途開走等情況,而這些都無法用隊列的“先進先出”原則來模擬。 3.主要算法的時間和空間復雜度分析: (1)由于算法Judge_Output函數根據判斷條件,每次只選擇一個程序段執行,所以其時間復雜度是O(1); (2)由于算法A_cars函數根據判斷條件,將數據入棧或入隊列,所以其時間復雜度也是O(1); (3)由于算法D_cars函數在出棧數據不在最頂端時需將n個數據先出該棧,再入新棧,再回舊棧的操作,故其時間復雜度是O(n);(4)所有算法的空間復雜度都是O(1)。六.使用說明 程序運行后用戶根據提示一次輸入車輛的狀態信息,車牌編號,時間,程序會根據車輛的狀態信息調用相應的函數,并輸出用戶想得到的信息。 七.調試結果 輸入數據:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘P’,0,0),(‘W’,0,0),(‘F’,0,0),(‘E’,0,0)。 輸出數據:1號車停放時間為10小時,收費100元;2號車停放時間為25小時,收費250元;4號車停放5小時,收費50元;此時停車場有兩輛車,便道上無車。若停車場已滿,則會顯示停車場已滿的信息;若便道上無車等待停車,會顯示便道上無車的信息;若中途有車離開,需其后的車讓道,會顯示進入臨時停車場的車輛的信息;若輸入(‘F’,0,0),輸出“ERROR!”;若輸入(‘E’,0,0),程序結束。運行結果截屏: 八.附錄 源程序文件清單: #include /*調用的頭文件庫聲明*/ #include /*用該結構體來存放車的狀態,編號和時間信息 */ { char bb; int num; int time; };typedef struct stack /*用該棧來模擬停車場*/ {struct car G[n]; int top;}SqStack;struct rangweicar /*用該結構體來存放臨時讓出的車輛的編號以及時間信息*/ {int num;int time;};typedef struct stack /*用該棧來模擬臨時讓出的車輛的停靠場地*/ {struct rangweicar H[MAXSIZE];int topp;}SqStackk;#define QNODE struct Qnode QNODE { int data; /*鏈隊結點的類型*/ QNODE *next; };typedef struct linkqueue /*用該鏈隊來模擬便道*/ {QNODE *front,*rear; int geshu; }LinkQueue;void Judge_Output(SqStack *s,LinkQueue *q,struct car *r)/*該算法通過傳遞來的車輛信息調 { 用相關函數實現操作*/ if((*r).bb=='E'||(*r).bb=='e') /*若車輛狀態為‘E’,終止程序*/ printf(“STOP!n”);else if((*r).bb=='P'||(*r).bb=='p') /*若車輛狀態為‘P’,輸出停車場車輛數*/ printf(“The number of parking cars is %dn”,(s->top)+1);else if((*r).bb=='W'||(*r).bb=='w') /*若車輛狀態為‘W’,輸出便道車輛數*/ printf(“The number of waiting cars is %dn”,q->geshu);else if((*r).bb=='A'||(*r).bb=='a') /*若車輛狀態為‘A’,調用A_cars函數*/ A_cars(s,q,*r); else if((*r).bb=='D'||(*r).bb=='d') /*若車輛狀態為‘D’,調用D_cars函數*/ D_cars(s,q,*r);else printf(“ERROR!n”); /*若車輛狀態為其他字母,報錯*/ } A_cars(SqStack *s,LinkQueue *q,struct car a) /*該算法實現對車輛狀態為到達的車輛的操 {QNODE *t; 作*/ if(s->top!=n-1) /*若停車場還沒有滿,則車進停車場,并存入車輛的狀態,車牌編 {(s->top)++; 號和到達時間信息*/ (s->G[s->top]).bb=a.bb; (s->G[s->top]).num=a.num; (s->G[s->top]).time=a.time;} else {printf(“The parking place is full!n”); /*若停車場已滿,車進便道,并顯示該車的車牌編 t=(QNODE *)malloc(sizeof(QNODE)); 號,同時記錄便道車輛數目*/ t->data=a.num; t->next=NULL; q->rear->next=t; q->rear=t; printf(“the number of the car in the access road is:%dn”,q->rear->data); q->geshu++;} } int D_cars(SqStack *s,LinkQueue *q,struct car d) /*該算法實現車輛狀態為離開的車 {int i,j,l; 輛的操作*/ float x,y;QNODE *p;SqStackk *k;if(d.num==(s->G[s->top]).num) /*若待離開車為最后進停車場的車的情況*/ {x=d.time-(s->G[s->top]).time; y=fee*x; /*直接計算停車時間,費用并離去*/ printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); if(q->geshu==0) /*若便道上無車,函數返回*/ {printf(“The queue is empty!n”); return 0; } Else /*若便道上有車,第一輛車進停車場*/ {p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; /*并存入其車牌編號及進停車場的時間*/ (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; /*若此時便道上無車,返回1*/ return 1; } } Else /*待離開的車不是最后進停車場的那輛車的情況*/ {for(i=0;i<(s->top);i++) /*先找到待離開車在停車場中的位置*/ {if((s->G[i]).num!=d.num)continue;else break;} if(i>=(s->top)) {printf(“ERROR!n”); return-1; } x=d.time-(s->G[i]).time; /*計算待離開車的停車時間并計算費用*/ y=fee*x; printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); k=(SqStackk *)malloc(sizeof(SqStackk)); /*設立一個新棧臨時停放為該車離開而讓 k->topp=-1; 路的車輛*/ for(j=(s->top);j>i;j--) {k->topp++;(k->H[k->topp]).num=(s->G[j]).num; (k->H[k->topp]).time=(s->G[j]).time; s->top--; } for(l=0;l<=(k->topp);l++){printf(“the information(number and time)in the new stack is:n”); printf(“%d,%dn”,(k->H[l]).num,(k->H[l]).time);} /*顯示在新棧中的車輛信息*/ s->top--; while(k->topp>=0) /*將新棧中的車重新開入停車場中*/ {s->top++; (s->G[s->top]).bb='A'; (s->G[s->top]).num=(k->H[k->topp]).num; (s->G[s->top]).time=(k->H[k->topp]).time; k->topp--; } if(q->geshu==0) /*若便道上無車,則返回2,無車開入停車場中*/ {printf(“The access road is empty!n”); return 2; } Else /*若便道上有車,則第一輛車開入停車場中*/ {s->top++; p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; return 3; } } } main() {SqStack *s; LinkQueue *q; QNODE *p; struct car aa[MAXSIZE]; int i; s=(SqStack *)malloc(sizeof(SqStack)); /*對停車場初始化*/ s->top=-1; q=(LinkQueue *)malloc(sizeof(LinkQueue)); p=(QNODE *)malloc(sizeof(QNODE)); /*對便道初始化*/ p->next=NULL; q->front=q->rear=p; q->geshu=0;printf(“******************************************************************************n”); printf(“************************* *************************n”); printf(“************************* 停車場管理系統 *************************n”); printf(“************************* *************************n”); printf(“******************************************************************************n”); for(i=0;i /*輸入車輛信息*/ {printf(“Please input the state,number and time of the car:n”); scanf(“%c,%d,%d”,&(aa[i].bb),&(aa[i].num),&(aa[i].time)); getchar();Judge_Output(s,q,&aa[i]); if(aa[i].bb=='E')break; } } 17第四篇:停車場管理系統需求報告
第五篇:停車場模擬管理系統實驗報告