第一篇:EDA報(bào)告模擬停車場(chǎng)管理系統(tǒng)的設(shè)計(jì)
遼東學(xué)院信息技術(shù)學(xué)院
《可編程邏輯器件原理及應(yīng)用》教學(xué)實(shí)習(xí)報(bào)告
模擬停車場(chǎng)管理系統(tǒng)的設(shè)計(jì)
學(xué)生姓名:
學(xué) 號(hào): 0915110606 班 級(jí): B1106 專 業(yè): 電子信息工程 指導(dǎo)教師:
2014年07月
【摘要】
隨著人民生活水平的提高,我國汽車保有量不斷提升,私家車的數(shù)量越來越多,在生活小區(qū)、辦公場(chǎng)所、商場(chǎng)、旅游景點(diǎn)等地方,停車難問題也日益突出。解決停車難問題,除了加大基礎(chǔ)設(shè)施投入(擴(kuò)建停車場(chǎng))外,有效地對(duì)現(xiàn)有的停車場(chǎng)進(jìn)行合理分配、調(diào)度與管理,也是行之有效的措施,因而建設(shè)配套的停車場(chǎng)管理系統(tǒng),對(duì)停車位進(jìn)行有序地管理十分必要。目前,無論在生活小區(qū)或是在寫字樓宇的建設(shè)規(guī)劃中,均已對(duì)停車位的規(guī)劃配備進(jìn)行了充分考慮,停車場(chǎng)已成為人們生活服務(wù)的必備場(chǎng)所之一,停車場(chǎng)的數(shù)目增多,對(duì)停車場(chǎng)管理系統(tǒng)產(chǎn)生了強(qiáng)大的市場(chǎng)需求?;谏鲜鰞牲c(diǎn)需求,本文設(shè)計(jì)了一套停車場(chǎng)管理系統(tǒng),從地感線圈、道閘、吐卡機(jī)、主控板到微機(jī)管理系統(tǒng),全套軟硬件系統(tǒng)實(shí)現(xiàn)了對(duì)場(chǎng)內(nèi)車位有序地分配與調(diào)度。本文將從整體方案、硬件設(shè)計(jì)、軟件設(shè)計(jì)、安裝實(shí)施等方面進(jìn)行全面地介紹該系統(tǒng)。同時(shí),本套系統(tǒng)在比較市場(chǎng)同類產(chǎn)品的基礎(chǔ)上,獨(dú)到地將停車管理中的日常處理從上位機(jī)(微機(jī))移至下位機(jī)(主控板),降低了整個(gè)系統(tǒng)對(duì)微機(jī)的依賴,顯出了自己的競(jìng)爭(zhēng)優(yōu)勢(shì)。
【關(guān)鍵詞】:停車場(chǎng)、管理系統(tǒng)、無線射頻卡
【Abstract】
With the improvement of people's living standard, car ownership in China is rising, more and more people own private cars, in the living quarters, offices, shopping malls, tourist attractions and other places, parking difficult issues are also increasingly prominent.To solve the parking problem, in addition to increase the investment of infrastructure(expansion of parking lot), effectively carries on the rational distribution, the existing parking lot scheduling and management, is the effective measure, parking management system and construction, the parking spaces for orderly management is very necessary.At present, no matter in the living quarters and office building planning, have parking space with the planning for a full account, parking has become one of the necessary place living services, the number of parking lots more, produced a strong market demand for parking management system.Based on the above two demands, this paper designs a set of parking management system, induction coil, main control gate, temple card machines, plate to the microcomputer management system from the ground, a full set of hardware and software system of the parking spaces and orderly allocation and scheduling.This paper from the overall system design, hardware design, software design, installation and other aspects of the implementation of a comprehensive introduction to the system.At the same time, the system based on the comparison of similar products on the market, will be unique to the daily management of parking from the host computer(PC)to the next machine(main control board), reduce the entire system to rely on the computer, showing its competitive advantage.Keywords:The parking lot, management system, radio frequency card
目錄
緒論..........................................................................................................................1 1系統(tǒng)工作原理.......................................................................................................2
1.1 基本原理...................................................................................................2 2 設(shè)計(jì)......................................................................................................................2
2.1系統(tǒng)結(jié)構(gòu)設(shè)計(jì)及分析................................................................................2 2.2分頻模塊....................................................................................................4 2.3消抖模塊....................................................................................................4 2.4車牌顯示模塊...........................................................................................5 2.5 計(jì)時(shí)模塊...................................................................................................5 2.6 費(fèi)率器模塊..............................................................................................6 2.7滾動(dòng)模塊....................................................................................................6 2.8譯碼模塊....................................................................................................7 3 使用說明......................................................................................................8 4 結(jié)論......................................................................................................................8 參考文獻(xiàn)..................................................................................................................9 附錄A 源程序.....................................................................................................10 附錄B 系統(tǒng)原理圖...............................................................................................29
I
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
緒論
近年來,隨著中國經(jīng)濟(jì)的快速增長和國民收入的不斷提高,汽車擁有量也日益增多,汽車已經(jīng)逐步走進(jìn)千家萬戶,使很多城市出現(xiàn)了“停車難”問題。為了滿足日益增長的停車需求,大型、超大型停車場(chǎng)不斷涌現(xiàn),傳統(tǒng)停車場(chǎng)管理系統(tǒng)已不能滿足實(shí)際需求。存在的問題突出表現(xiàn)在:現(xiàn)有的停車場(chǎng)管理系統(tǒng)要求車輛在出入停車場(chǎng)時(shí)須停車驗(yàn)卡,車輛進(jìn)出極其緩慢,經(jīng)常造成上、下班堵車現(xiàn)象,不僅浪費(fèi)時(shí)間,能源浪費(fèi)也非常嚴(yán)重;隨著停車場(chǎng)中車輛數(shù)量的增加,管理工作量和難度都成倍加大,傳統(tǒng)停車場(chǎng)管理系統(tǒng)在安全性和效率方面暴露出嚴(yán)重的缺陷。因此,對(duì)現(xiàn)有的停車場(chǎng)管理系統(tǒng)進(jìn)行升級(jí)更新,是停車場(chǎng)建設(shè)中的當(dāng)務(wù)之急。本文針對(duì)上述實(shí)際問題,通過研究開發(fā)射頻識(shí)別技術(shù)和紅外通信技術(shù),設(shè)計(jì)實(shí)現(xiàn)了一種遠(yuǎn)距離智能識(shí)別的停車場(chǎng)管理系統(tǒng),以解決傳統(tǒng)停車管理系統(tǒng)存在的問題。本設(shè)計(jì)基于射頻芯片,設(shè)計(jì)了無線閱讀器和無線智能電子標(biāo)簽通信系統(tǒng),解決了遠(yuǎn)距離自動(dòng)識(shí)別車輛信息的問題;所設(shè)計(jì)的車輛無線閱讀識(shí)別系統(tǒng)與后臺(tái)計(jì)算機(jī)管理系統(tǒng)相聯(lián)結(jié),便形成了一個(gè)功能強(qiáng)大和系統(tǒng)完善的遠(yuǎn)距離智能車輛識(shí)別系統(tǒng)。系統(tǒng)可以實(shí)現(xiàn)遠(yuǎn)距離車輛信息自動(dòng)識(shí)別,實(shí)現(xiàn)車輛自動(dòng)安全檢測(cè)管理和收費(fèi)等功能;系統(tǒng)還具有圖像比對(duì)校驗(yàn),車輛數(shù)據(jù)網(wǎng)絡(luò)自動(dòng)更新等新功能。遠(yuǎn)距離智能識(shí)別停車場(chǎng)管理系統(tǒng)將新穎的生活理念和建筑藝術(shù)、信息技術(shù)、計(jì)算機(jī)技術(shù)等現(xiàn)代高科技完美結(jié)合,提供的是一種操作簡(jiǎn)單、使用方便、功能先進(jìn)的人性化系統(tǒng)。
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
1系統(tǒng)工作原理
1.1 基本原理
當(dāng)一輛車進(jìn)入停車場(chǎng),按鍵A被按下:計(jì)時(shí)器開始計(jì)時(shí),同時(shí)把該車的車牌號(hào)和費(fèi)率送入數(shù)碼管顯示(3個(gè)數(shù)碼管顯示撥碼開關(guān)對(duì)應(yīng)的十進(jìn)制數(shù):采用BCD碼轉(zhuǎn)換的方法;費(fèi)率顯示采用輸入設(shè)置,可以通過按鍵+1的方式設(shè)置從1~99的費(fèi)率)。當(dāng)車駛出停車場(chǎng)時(shí),按鍵B被按下,此時(shí)計(jì)時(shí)器停止計(jì)時(shí),并把計(jì)時(shí)時(shí)間送入數(shù)碼管顯示(2位小時(shí)數(shù)、兩位分鐘數(shù)),同時(shí)顯示車牌號(hào)信息及停車費(fèi)用(三位顯示:停車費(fèi)用=停車時(shí)間×費(fèi)率)。由于數(shù)碼管位數(shù)不夠采用滾動(dòng)顯示的方式。設(shè)計(jì)
2.1系統(tǒng)結(jié)構(gòu)設(shè)計(jì)及分析
本系統(tǒng)主要包括以下七個(gè)模塊:分頻模塊fpq,車牌BCD轉(zhuǎn)換模塊chepai,消抖模塊xiaodou,計(jì)時(shí)模塊jishi,費(fèi)率模塊feilvqi,滾動(dòng)模塊gundong,譯碼器模塊ymq。先通過VHDL文本生成這些模塊,再在頂層文件中調(diào)用這些模塊。
系統(tǒng)的主程序流程圖如圖1所示。
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
圖1
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
2.2分頻模塊
該模塊對(duì)實(shí)驗(yàn)箱上的50MHz時(shí)鐘進(jìn)行分頻,分成所需要的幾種不同頻率的時(shí)鐘。分頻的原理為:對(duì)50MHz時(shí)鐘每來一個(gè)上升沿計(jì)一次數(shù),當(dāng)計(jì)數(shù)到一定值的時(shí)候,計(jì)數(shù)值清零并且讓輸出電平取反,根據(jù)計(jì)數(shù)值的不同可以得到不同的輸出頻率。在本設(shè)計(jì)中分頻出0.1HZ,1HZ,100Hz,200Hz,500Hz的頻率,以供不同的需要。
inst2fpqclkFP500HZoutFP200HZoutFP100HZoutFP1HZoutFP01HZout圖2 2.3消抖模塊
作為機(jī)械開關(guān)的鍵盤,在按鍵操作時(shí),機(jī)械觸點(diǎn)的彈性及電壓突跳等原因,在觸點(diǎn)閉合和開啟瞬間會(huì)出現(xiàn)電壓的抖動(dòng)。為保證按鍵識(shí)別的準(zhǔn)確性,在按鍵電壓信號(hào)抖動(dòng)的情況下不能進(jìn)行狀態(tài)輸入。為此必須進(jìn)行去抖動(dòng)處理,消除抖動(dòng)部分的電壓信號(hào),一般有硬件和軟件兩種方法。硬件就是加去抖動(dòng)電路,這樣可以從根本上解決按鍵抖動(dòng)問題。軟件消抖就是利用軟件延時(shí)消抖,具體說就是當(dāng)檢測(cè)到高電平(有按鍵按下),1kHz脈沖來一個(gè)高電平計(jì)數(shù)值加1,一遇到低電平計(jì)數(shù)值清零,當(dāng)計(jì)數(shù)值大于10時(shí),說明按鍵是被真的按下,消除了抖動(dòng)。本系統(tǒng)采用軟件消抖。
xiaodouinst7dinclkdout圖3
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
2.4車牌顯示模塊
用8位撥碼開關(guān)表示車號(hào),撥碼開關(guān)對(duì)應(yīng)的8位二進(jìn)制通過BCD轉(zhuǎn)換為12位BCD碼。
chepaikey[7..0]chep[11..0]inst圖4
2.5 計(jì)時(shí)模塊
當(dāng)A鍵按下時(shí),計(jì)時(shí)器開始計(jì)時(shí),B鍵按下時(shí),計(jì)時(shí)器停止計(jì)時(shí),clk為計(jì)時(shí)脈沖,來一個(gè)上升沿,計(jì)數(shù)器加1,reset為總復(fù)位信號(hào)。
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
2.6 費(fèi)率器模塊
初值為0,當(dāng)費(fèi)率在0-99范圍內(nèi)時(shí),費(fèi)率按鍵每按一次,費(fèi)率加1。
圖7
inst3feilvqiresetanjianfeilv[7..0]2.7滾動(dòng)模塊
滾動(dòng)顯示模塊,當(dāng)C=1時(shí)不滾動(dòng),但當(dāng)C=0時(shí)滾動(dòng)顯示車牌、停車時(shí)間、及停車中費(fèi)用。y[3..0]輸出到譯碼器,sel為位選信號(hào)。
圖8
gundongABdata[15..0]chep[11..0]price[11..0]feilv[7..0]clk_200Hzclk_1Hzsel[7..0]y[3..0]inst4遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
2.8譯碼模塊
該模塊將將輸入的二進(jìn)制信號(hào)譯成相應(yīng)的七段共陽極數(shù)碼管的編碼。數(shù)據(jù)輸入data[3..0],譯碼輸出led7s[6..0]。
圖9
YMQIN4[3..0]DOUT7[6..0]inst8遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告 使用說明
按鍵說明:
A按鍵:為開始按鈕,即當(dāng)車輛進(jìn)入停車場(chǎng)時(shí),按下A開始計(jì)時(shí),并顯示進(jìn)入車輛的車牌號(hào)及收費(fèi)費(fèi)率。B按鍵:為停止按鈕,即當(dāng)車輛駛出停車場(chǎng)時(shí),按下B按鈕,停止計(jì)時(shí),并滾動(dòng)顯示,車牌號(hào)、停車時(shí)間及停車費(fèi)用。費(fèi)率按鍵:為費(fèi)率設(shè)置按鈕,每按一次,費(fèi)率加1。Reset按鈕為總復(fù)位按鈕。clk為系統(tǒng)時(shí)鐘,綁定到實(shí)驗(yàn)箱上的50MHz的時(shí)鐘上,led7s[6..0]為數(shù)碼管段選控制信號(hào),sel[7..0]為8個(gè)數(shù)碼管的位選控制信號(hào)。
測(cè)試方法:首先按下復(fù)位鍵,然后設(shè)置八位撥碼開關(guān)的值(車牌號(hào)),此時(shí),數(shù)碼管顯示三位車牌號(hào)信息和費(fèi)率,按下費(fèi)率按鍵可以設(shè)置費(fèi)率的值(每按一次加1,范圍0~99),過一段時(shí)間,按下B鍵,此時(shí)8位數(shù)碼管會(huì)滾動(dòng)顯示,三位車牌號(hào),四位停車時(shí)間和三位停車費(fèi)。按下復(fù)位鍵,可重新測(cè)試。結(jié)論
模擬停車場(chǎng)管理系統(tǒng),雖然在速度上我沒能趕上大部分同學(xué),但是經(jīng)過在之前將近一個(gè)月的前期準(zhǔn)備和一周的集中設(shè)計(jì)讓我體會(huì)到了很多的東西。
雖然在查找資料中找到了一個(gè)相似的程序,但是還是有很多的錯(cuò)誤。后來,進(jìn)過與同課題的同學(xué)的一起分析和改進(jìn)終于還是完成了可用的程序。
在這場(chǎng)戰(zhàn)斗中我有很大的收獲,首先我采用層次化結(jié)構(gòu)化設(shè)計(jì),將此項(xiàng)設(shè)計(jì)任務(wù)分成若干模塊,規(guī)定每一模塊的功能和各模塊之間的接口,然后再將各模塊聯(lián)合起來調(diào)試,加深了我們對(duì)層次化設(shè)計(jì)的概念的認(rèn)識(shí)。在設(shè)計(jì)的過程中,雖然遇到了很多困難,但是通過向老師和同學(xué)請(qǐng)教以及自己不斷摸索、測(cè)試,一個(gè)個(gè)難題迎刃而解。從而提高了我獨(dú)立發(fā)現(xiàn)問題、分析問題、解決問題的能力,其次,我也明白了一個(gè)道理,任何一件事情,只有親自去做的時(shí)候才知道它到底難不難,有多難。我們就像小馬過河中的小馬,需要自己多去嘗試。
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
參考文獻(xiàn)
[1].《 EDA技術(shù)實(shí)用教程》潘松,黃繼業(yè)..北京:科學(xué)出版社,2006 [2].《 VHDL設(shè)計(jì)實(shí)例與仿真》姜雪松,吳鈺淳,王鷹等..北京:機(jī)械工業(yè)出版社,2007 [3].《基于Quartus Ⅱ的FPGA/CPLD設(shè)計(jì)》李洪偉,袁斯華..北京:電子工業(yè)出版社,2006
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
附錄A 源程序
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fpq is port(clk:in std_logic;
FP500HZout,FP200HZout,FP100HZout,FP1HZout,FP01HZout:out std_logic);end entity;architecture one of fpq is signal clkjs1:std_logic;signal clkjs2:std_logic;signal clkjs3:std_logic;signal clkjs4:std_logic;signal clkjs5:std_logic;signal cnq1:integer range 5000000 downto 0;signal cnq2:integer range 5000000 downto 0;signal cnq3:integer range 5000000 downto 0;signal cnq4:integer range 5000000 downto 0;signal cnq5:integer range 50000000 downto 0;
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
begin
mk1: process(clk)
begin if clk'event and clk='1' then if cnq5<=2500000 then cnq5<=cnq5+1;else cnq5<=0;clkjs5<=not(clkjs5);
end if;end if;FP01HZout<=clkjs5;end process;mk2:process(clk)begin if clk'event and clk='1' then if cnq1<=500 then
cnq1<=cnq1+1;
else
cnq1<=0;clkjs1<=not(clkjs1);
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
end if;end if;FP500HZout<=clkjs1;end process;mk3:process(clk)begin if clk'event and clk='1' then if cnq2<=12500000 then
cnq2<=cnq2+1;cnq2<=cnq2+1;else cnq2<=0;clkjs2<=not(clkjs2);end if;end if;FP200Hzout<=clkjs2;end process;mk4:process(clk)begin if clk'event and clk='1' then if cnq3<2500 then cnq3<=cnq3+1;
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
else cnq3<=0;clkjs3<=not(clkjs3);end if;end if;FP100HZout<=clkjs3;end process;mk5:process(clk)begin if clk'event and clk='1'then if cnq4<250000000 then
cnq4<=cnq4+1;else cnq4<=0;clkjs4<=not(clkjs4);end if;end if;FP1HZout<=clkjs4;end process;end;library ieee;use ieee.std_logic_1164.all;
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
use ieee.std_logic_unsigned.all;entity xiaodou is
port(clk:in std_logic;
din:in std_logic;
dout:out std_logic);end xiaodou;architecture arc of xiaodou is begin
process(clk,din)
variable temp:integer;
begin
if clk'event and clk='1' then
if(din='0')then
temp:=0;
end if;
if temp>15 then
dout<='1';
else
dout<='0';
end if;
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
temp:=temp+1;
end if;
end process;
end arc;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity chepai is
port(--clk : in std_logic;--時(shí)鐘輸入
key
: in
std_logic_vector(7 downto 0);--鍵入
--l : out
std_logic_vector(7 downto 0);--輸出數(shù)碼管位選 std_logic_vector(11 downto 0)--數(shù)碼管段碼
chep
: out);END chepai;architecture an of chepai is signal clock : std_logic;--分頻后時(shí)鐘 signal p : integer range 0 to 255;
signal b0,b1,b2 : integer range 0 to 9;--顯示數(shù)位寄存器,b0表示個(gè)位,signal cnt : integer range 0 to 3:=0;--數(shù)碼管位選掃描程序 begin p<=conv_integer(key);--數(shù)據(jù)輸入
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
process(p)--顯示查表進(jìn)程
functionb_to_s4(bcd8421:integer 0 tO 9)return std_logic_vector is--BCD std_logic_vector
variable smg4: std_logic_vecto(3 downto 0);
begin
case bcd8421 IS
WHEN 0 => smg4:=“0000”;--0
WHEN 1 => smg4:=“0001”;--1
WHEN 2 => smg4:=“0010”;--2
WHEN 3 => smg4:=“0011”;--3
WHEN 4 => smg4:=“0100”;--4
WHEN 5 => smg4:=“0101”;--5
WHEN 6 => smg4:=“0110”;--6
WHEN 7 => smg4:=“0111”;--7
WHEN 8 => smg4:=“1000”;--8
WHEN 9 => smg4:=“1001”;--9 when others=>null;
END CASE;
RETURN smg4;
END b_to_s4;begin case p is
--計(jì)算輸出值
--gfedcba 共陽
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
when 0|10|20|30|40|50|60|70|80|90|100|110|120|130|140|150|160|170 |180|190|200|210|220|230|240|250=>b0<=0;when 1|11|21|31|41|51|61|71|81|91|101|111|121|131|141|151|161|171 |181|191|201|211|221|231|241|251=>b0<=1;when 2|12|22|32|42|52|62|72|82|92|102|112|122|132|142|152|162|172 |182|192|202|212|222|232|242|252=>b0<=2;When 3|13|23|33|43|53|63|73|83|93|103|113|123|133|143|153|163|173 |183|193|203|213|223|233|243|253=>b0<=3;
When 4|14|24|34|44|54|64|74|84|94|104|114|124|134|144|154|164|174 |184|194|204|214|224|234|244|254=>b0<=4;
When 5|15|25|35|45|55|65|75|85|95|105|115|125|135|145|155|165|175 |185|195|205|215|225|235|245|255=>b0<=5;
When 6|16|26|36|46|56|66|76|86|96|106|116|126|136|146|156|166|176 |186|196|206|216|226|236|246=>b0<=6;
When 7|17|27|37|47|57|67|77|87|97|107|117|127|137|147|157|167|177 |187|197|207|217|227|237|247=>b0<=7;
When
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
8|18|28|38|48|58|68|78|88|98|108|118|128|138|148|158|168|178 |188|198|208|218|228|238|248=>b0<=8;When
9|19|29|39|49|59|69|79|89|99|109|119|129|139|149|159|169|179 |189|199|209|219|229|239|249=>b0<=9;
when others=> end case;case p is when 0|1|2|3|4|5|6|7|8|9|100|101|102|103|104|105|106|107|108|109 |200|201|202|203|204|205|206|207|208|209=>b1<=0;when 10|11|12|13|14|15|16|17|18|19|110|111|112|113|114|115|116|117 |118|119|210|211|212|213|214|215|216|217|218|219=>b1<=1;when 20|21|22|23|24|25|26|27|28|29|120|121|122|123|124|125|126|127 |128|129|220|221|222|223|224|225|226|227|228|229=>b1<=2;when 30|31|32|33|34|35|36|37|38|39|130|131|132|133|134|135|136|137 |138|139|230|231|232|233|234|235|236|237|238|239=>b1<=3;when 40|41|42|43|44|45|46|47|48|49|140|141|142|143|144|145|146|147
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
|148|149|240|241|242|243|244|245|246|247|248|249=>b1<=4;when
50|51|52|53|54|55|56|57|58|59|150|151|152|153|154|155|156|157 |158|159|250|251|252|253|254|255=>b1<=5;when 60|61|62|63|64|65|66|67|68|69|160|161|162|163|164|165|166|167 |168|169=>b1<=6;when 70|71|72|73|74|75|76|77|78|79|170|171|172|173|174|175|176|177 |178|179=>b1<=7;when 80|81|82|83|84|85|86|87|88|89|180|181|182|183|184|185|186|187 |188|189=>b1<=8;when 90|91|92|93|94|95|96|97|98|99|190|191|192|193|194|195|196|197 |198|199=>b1<=9;
when others=>--b0<=10;end case;if p<100 then b2<=0;elsif p>=100 and p<200 then b2<=1;
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
elsif p>=200 then b2<=2;end if;chep(3 downto 0)<=b_to_s4(b0);chep(7 downto 4)<=b_to_s4(b1);chep(11 downto 8)<=b_to_s4(b2);end process;end an;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jishi is port(A,B,reset:in std_logic;
clk_minhz:in std_logic;
data:out std_logic_vector(15 downto 0));end;architecture one of jishi is signal data1:std_logic_vector(15 downto 0);signal c:std_logic;begin process(clk_minhz,reset,A,B)begin
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
if reset='1' then data1(15 downto 0)<=“***0”;else if(A'event and A='1')then
c<='1';end if;if B='1' then c<='0';end if;if c='1' then if clk_minhz'event and clk_minhz='1' then if data1(3 downto 0)=“1001” then
data1(3 downto 0)<=“0000”;if data1(7 downto 4)=“0101”then
data1(15 downto 8)<=data1(15 downto 8)+1;
data1(7 downto 4)<=“0000”;
else data1(7 downto 4)<=data1(7 downto 4)+1;end if;else data1(3 downto 0)<=data1(3 downto 0)+1;end if;end if;elsif c='0' then
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
data(15 downto 0)<=data1(15 downto 0);end if;end if;end process;end;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity feilvqi is port(reset:in std_logic;
clk_minhz:in std_logic;
feilv:out std_logic_vector(7 downto 0));end feilvqi;architecture one of feilvqi is signal feilv1:std_logic_vector(7 downto 0);--signal c:std_logic;begin process(reset,clk_minhz)begin if reset='1'then feilv1<=“00000000”;elsif clk_minhz'event and clk_minhz='1'then
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
if feilv1(3 downto 0)=“1001”then feilv1(3 downto 0)<=“0000”;if feilv1(7 downto 4)=“1001”then feilv1(7 downto 4)<=“0000”;else feilv1(7 downto 4)<=feilv1(7 downto 4)+1;end if;else feilv1(3 downto 0)<=feilv1(3 downto 0)+1;end if;end if;feilv<=feilv1;end process;end;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity gundong is port(A,B:in std_logic;
data:in std_logic_vector(15 downto 0);
chep:in std_logic_vector(11 downto 0);
feilv:in std_logic_vector(7 downto 0);
clk_200HZ,clk_1HZ: in std_logic;
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
sel:out std_logic_vector(7 downto 0);
y:out std_logic_vector(3 downto 0));
end;architecture body_chooser of gundong is signal c:std_logic;signal count:std_logic_vector(2 downto 0);signal cnt: std_logic_vector(3 downto 0);begin--process(clk_200hz)--begin process(A,B)begin if(A'event and A='1')then c<='1';end if;if b='1' then c<='0';end if;end process;process(clk_200HZ)begin if(clk_200Hz'event and clk_200HZ='1')then
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
if count<“111” then count<=count+1;else count<=“000”;end if;end if;end process;process(clk_1HZ)begin if clk_1HZ'event and clk_1HZ='1' THEN IF cnt<“1100” then
cnt<=cnt+1;else cnt<=“0000”;end if;end if;end process;process(c,cnt,count)begin if c='1' then case count is when “000”=>y<=“0001”;sel<=“00000001”;when“001”=>y<=data(11 downto 8);sel<=“00010000”;when“010”=>y<=data(7 downto 4);sel<=“00001000”;
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
when“011”=>y<=data(3 downto 0);sel<=“00000100”;--when “001”=>y<=“1010”;sel<=“00001000”;when“100”=>y<=chep(3 downto 0);sel<=“00100000”;when“101”=>y<=chep(7 downto 4);sel<=“01000000”;when“110”=>y<=chep(11 downto 8);sel<=“10000000”;when others=>null;end case;elsif cnt=“0000” then case count is when “000”=>y<=chep(11 downto 8);sel<=“10000000”;when “001”=>y<=chep(7 downto 4);sel<=“01000000”;when “010”=>y<=chep(3 downto 0);sel<=“00100000”;when“011”=>y<=data(15 downto 12);sel<=“00010000”;when“100”=>y<=data(11 downto 8);sel<=“00001000”;when“101”=>y<=data(7 downto 4);sel<=“00000100”;when“110”=>y<=data(3 downto 0);sel<=“00000010”;when “111”=>y<=“0000”;sel<=“00000001”;
when others=>null;end case;elsif cnt=“0001” then case count is
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
when“000”=>y<=feilv(3 downto 0);sel<=“00000001”;when“001”=>y<=feilv(7 downto 4);sel<=“00000010”;
when others=>null;end case;elsif cnt=“0010” then elsif cnt=“0011” then elsif cnt=“0100” then
elsif cnt=“0101” then
elsif cnt=“0110” then
elsif cnt=“0111” then
elsif cnt=“1000” then
elsif cnt=“1001” then
elsif cnt=“1010” then
elsif cnt=“1011” then
elsif cnt=“1100” then case count is when“000”=>y<=“1010”;sel<=“10000000”;when“001”=>y<=chep(11 downto 8);sel<=“01000000”;when“010”=>y<=chep(7 downto 4);sel<=“00100000”;when“011”=>y<=chep(3 downto 0);sel<=“00010000”;
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
when“100”=>y<=“1010”;sel<=“00001000”;when“101”=>y<=data(15 downto 12);sel<=“00000100”;when“110”=>y<=data(11 downto 8);sel<=“00000010”;when“111”=>y<=data(7 downto 4);sel<=“00000001”;when others=>null;end case;end if;end process;end body_chooser;ry ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ymq is port(y:in std_logic_vector(3 downto 0);led7s:out std_logic_vector(6 downto 0));end;architecture one of ymq is begin process(y)begin case y is when“0000”=>led7s<=“1000000”;--0 when“0001”=>led7s<=“1111001”;--1 when“0010”=>led7s<=“0100100”;--2 when“0011”=>led7s<=“0110000”;--3 when“0100”=>led7s<=“0011001”;--4 when“0101”=>led7s<=“0010010”;--5 when“0110”=>led7s<=“0000010”;--6 when“0111”=>led7s<=“1111000”;--7 when“1000”=>led7s<=“0000000”;--8 when“1001”=>led7s<=“0010000”;--9
libra
遼東學(xué)院信息技術(shù)學(xué)院EDA課程設(shè)計(jì)報(bào)告
when others=>null;end case;
附錄B 系統(tǒng)原理圖
第二篇:停車場(chǎng)模擬管理系統(tǒng)實(shí)驗(yàn)報(bào)告
一.問題描述
1.實(shí)驗(yàn)題目:
設(shè)停車場(chǎng)是一個(gè)可停放 n 輛汽車的狹長通道,且只有一個(gè)大門可供汽車進(jìn)出。汽車在停車場(chǎng)內(nèi)按車輛到達(dá)時(shí)間的先后順序,依次由北向南排列(大門在最南端,最先到達(dá)的第一輛車停放在車場(chǎng)的最北端)。若停車場(chǎng)內(nèi)已經(jīng)停滿 n輛車,那么后來的車只能在門外的便道上等候。一旦有車開走,則排在便道上的第一輛車即可開入。當(dāng)停車場(chǎng)內(nèi)某輛車要離開時(shí),在它之后進(jìn)入的車輛必須先退出車場(chǎng)為它讓路,待該輛車開出大門外,其他車輛再按原次序進(jìn)入車場(chǎng)。每輛停放在車場(chǎng)的車在它離開停車場(chǎng)時(shí)必須按它停留的時(shí)間長短繳納費(fèi)用。試為停車場(chǎng)編制按上述要求進(jìn)行管理的模擬程序。
要求:根據(jù)各結(jié)點(diǎn)的信息,調(diào)用相應(yīng)的函數(shù)或者語句,將結(jié)點(diǎn)入棧入隊(duì),出棧或者出隊(duì)。
二.需求分析
1.程序所能達(dá)到的基本可能:
程序以棧模擬停車場(chǎng),以隊(duì)列模擬車場(chǎng)外的便道,按照從終端讀入數(shù)據(jù)的序列進(jìn)行模擬管理。棧以順序結(jié)構(gòu)實(shí)現(xiàn),隊(duì)列以鏈表結(jié)構(gòu)實(shí)現(xiàn)。同時(shí)另設(shè)一個(gè)棧,臨時(shí)停放為給要離去的汽車讓路而從停車場(chǎng)退出來的汽車。輸入數(shù)據(jù)按到達(dá)或離去的時(shí)刻有序。當(dāng)輸入數(shù)據(jù)包括數(shù)據(jù)項(xiàng)為汽車的“到達(dá)”(‘A’表示)信息,汽車標(biāo)識(shí)(牌照號(hào))以及到達(dá)時(shí)刻時(shí),應(yīng)輸出汽車在停車場(chǎng)內(nèi)或者便道上的停車位置;當(dāng)輸入數(shù)據(jù)包括數(shù)據(jù)項(xiàng)為汽車的“離去”(‘D’表示)信息,汽車標(biāo)識(shí)(牌照號(hào))以及離去時(shí)刻時(shí),應(yīng)輸出汽車在停車場(chǎng)停留的時(shí)間和應(yīng)繳納的費(fèi)用(便道上停留的時(shí)間不收費(fèi));當(dāng)輸入數(shù)據(jù)項(xiàng)為(‘P’,0,0)時(shí),應(yīng)輸出停車場(chǎng)的車數(shù);當(dāng)輸入數(shù)據(jù)項(xiàng)為(‘W’, 0, 0)時(shí),應(yīng)輸出候車場(chǎng)車數(shù);當(dāng)輸入數(shù)據(jù)項(xiàng)為(‘E’, 0, 0),退出程序;若輸入數(shù)據(jù)項(xiàng)不是以上所述,就輸出“ERROR!”。2.輸入輸出形式及輸入值范圍:
程序運(yùn)行后進(jìn)入循環(huán),顯示提示信息:“Please input the state,number and time of the car:”,提示用戶輸入車輛信息(“到達(dá)”或者“離開”,車牌編號(hào),到達(dá)或者離開的時(shí)間)。若車輛信息為“到達(dá)”,車輛信息開始進(jìn)棧(模擬停車場(chǎng)),當(dāng)棧滿,會(huì)顯示棧滿信息:“The parking place is full!”,同時(shí)車輛進(jìn)隊(duì)列(模擬停車
場(chǎng)旁便道),并顯示該進(jìn)入便道車輛的車牌編號(hào),讓用戶知道該車的具體位置;若車輛信息為“離開”,會(huì)顯示該車進(jìn)入停車場(chǎng)的時(shí)間以及相應(yīng)的停車費(fèi)用,若該車較部分車早進(jìn)停車場(chǎng),這部分車需先退出停車場(chǎng),暫時(shí)進(jìn)入一個(gè)新棧為其讓道,會(huì)顯示進(jìn)入新棧的車輛的車牌編號(hào)及其入停車場(chǎng)的時(shí)間,當(dāng)待離開車離開停車場(chǎng)后,這部分車會(huì)重新進(jìn)入停車場(chǎng),同時(shí)便道上的第一輛車進(jìn)入停車場(chǎng);若輸入(‘P’,0,0),會(huì)顯示停車場(chǎng)的車數(shù);若輸入(‘W’,0,0),會(huì)顯示便道上的車數(shù);若輸入(‘E’,0,0),程序會(huì)跳出循環(huán),同時(shí)程序結(jié)束;若輸入為其他字母,程序會(huì)顯示“ERROR!”報(bào)錯(cuò)。若便道上沒有車輛停靠,會(huì)顯示便道為空的信息:用戶每輸入一組數(shù)據(jù),程序就會(huì)根據(jù)相應(yīng)輸入給出輸出。輸入值第一個(gè)必須為字母,后兩個(gè)為數(shù)字。
三.概要設(shè)計(jì)
為了實(shí)現(xiàn)上述功能,該程序以棧模擬停車場(chǎng)以及臨時(shí)停放為給要離去的汽車讓路而從停車場(chǎng)退出來的汽車的場(chǎng)地,以隊(duì)列模擬車場(chǎng)外的便道,因此需要棧和隊(duì)列這兩個(gè)抽象數(shù)據(jù)類型。1.棧抽象數(shù)據(jù)類型定義: ADT SqStack{
數(shù)據(jù)對(duì)象:D={ai,bi,ci,di|ai?int,bi?int,ci?int,di?char,i=1,2,3....,n,n?0}
數(shù)據(jù)關(guān)系:R={(ai,bi,di)|ai,bi,di?D,ai,bi,di?struct car};
基本操作:
Judge_Output(s,q,r);//根據(jù)r中車輛信息控制車輛是入棧s還是
入隊(duì)q以及相關(guān)操作
A_cars(s,q, a);//將到達(dá)車輛a的信息入棧s或者入隊(duì)q
D_cars(s,q, d);//將待離開車輛d出棧s,并將q中相應(yīng)車輛
入棧并進(jìn)行相關(guān)的操作 }ADT SqStack 2.隊(duì)列抽象數(shù)據(jù)類型定義: ADT LinkQueue{ 2
數(shù)據(jù)對(duì)象:D={ai,bi,ci|ai?Qnode *,bi?Qnode
*,ci?int,i=1,2,3....,n,n?0};
數(shù)據(jù)關(guān)系:R=?;
基本操作:
Judge_Output(s,q,r);//根據(jù)r中車輛信息控制車輛是入棧s
還是入隊(duì)q以及相關(guān)操作
A_cars(s,q, a);//將到達(dá)車輛a的信息入棧s或者入隊(duì)q
D_cars(s,q, d);//將待離開車輛d出棧s,并將q中相應(yīng)車
輛入棧并進(jìn)行相關(guān)的操作 }ADT LinkQueue
3.主要算法流程圖:
I.Judge_Output算法流程圖:
開始F輸入為E(e)TF輸出輸入為P(p)“STOP!”TF輸入為W(w)輸出停車場(chǎng)車輛的數(shù)目TF輸入為A(a)輸出便道上車輛數(shù)目T輸入為D(d)調(diào)用A_cars函數(shù)調(diào)用D_cars函數(shù)結(jié)束II.A_cars算法流程圖:
開始停車場(chǎng)未滿TF車進(jìn)停車場(chǎng)車進(jìn)便道結(jié)束III.D_cars算法流程圖:
開始該車是最后進(jìn)T停車場(chǎng)的車F在該車后進(jìn)的車退結(jié)賬離開出停車場(chǎng)后讓其結(jié)賬離開便道上有車TF便道上第一輛車進(jìn)停車場(chǎng)結(jié)束
4.本程序保護(hù)模塊: 主函數(shù)模塊
棧單元模塊:實(shí)現(xiàn)棧的抽象數(shù)據(jù)類型 隊(duì)列單元模塊:實(shí)現(xiàn)隊(duì)列的抽象數(shù)據(jù)類型 調(diào)用關(guān)系:
棧單元模塊主函數(shù)模塊隊(duì)列單元模塊四.詳細(xì)設(shè)計(jì)
1.相關(guān)頭文件庫的調(diào)用說明: #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.棧類型和隊(duì)列類型: typedef struct stack {struct car G[n];
int top;}SqStack;typedef struct linkqueue {QNODE *front,*rear;
int geshu;}LinkQueue;//部分基本操作的偽碼實(shí)現(xiàn)
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.主函數(shù)的偽碼: 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(“*************************
停車場(chǎng)管理系統(tǒng)
*************************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.函數(shù)調(diào)用關(guān)系: 調(diào)用A_cars函數(shù)調(diào)用Judge_Output函數(shù)main函數(shù)調(diào)用D_cars函數(shù) 五.測(cè)試分析: 1.出現(xiàn)問題及解決辦法: 該程序是四個(gè)程序調(diào)試中最順利的一個(gè),只在一個(gè)地方上出了問題,就是輸入字符時(shí)由于回車鍵也是字符,回車鍵總會(huì)被讀入,導(dǎo)致經(jīng)常輸出“ERROR!”。后來找到原因后在scanf函數(shù)后緊接著加了一個(gè)getchar();語句后就恢復(fù)了正常。 2.方法優(yōu)缺點(diǎn)分析: 優(yōu)點(diǎn):用棧和隊(duì)列來模擬停車場(chǎng)讓整個(gè)問題顯得簡(jiǎn)單,易于實(shí)現(xiàn); 缺點(diǎn):棧和隊(duì)列這兩個(gè)數(shù)學(xué)模型用在停車場(chǎng)管理上還是有失妥當(dāng)?shù)模F(xiàn)實(shí)中停車場(chǎng)出口入口不可能為同一處,不可能當(dāng)一輛車要離開,在它后面進(jìn)來的車必須為它讓路,因此無法用棧的“后進(jìn)先出”原則來模擬;而且沒有考慮便道上的車在等待過程中可以中途開走等情況,而這些都無法用隊(duì)列的“先進(jìn)先出”原則來模擬。 3.主要算法的時(shí)間和空間復(fù)雜度分析: (1)由于算法Judge_Output函數(shù)根據(jù)判斷條件,每次只選擇一個(gè)程序段執(zhí)行,所以其時(shí)間復(fù)雜度是O(1); (2)由于算法A_cars函數(shù)根據(jù)判斷條件,將數(shù)據(jù)入?;蛉腙?duì)列,所以其時(shí)間復(fù)雜度也是O(1); (3)由于算法D_cars函數(shù)在出棧數(shù)據(jù)不在最頂端時(shí)需將n個(gè)數(shù)據(jù)先出該棧,再入新棧,再回舊棧的操作,故其時(shí)間復(fù)雜度是O(n);(4)所有算法的空間復(fù)雜度都是O(1)。六.使用說明 程序運(yùn)行后用戶根據(jù)提示一次輸入車輛的狀態(tài)信息,車牌編號(hào),時(shí)間,程序會(huì)根據(jù)車輛的狀態(tài)信息調(diào)用相應(yīng)的函數(shù),并輸出用戶想得到的信息。 七.調(diào)試結(jié)果 輸入數(shù)據(jù):(‘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)。 輸出數(shù)據(jù):1號(hào)車停放時(shí)間為10小時(shí),收費(fèi)100元;2號(hào)車停放時(shí)間為25小時(shí),收費(fèi)250元;4號(hào)車停放5小時(shí),收費(fèi)50元;此時(shí)停車場(chǎng)有兩輛車,便道上無車。若停車場(chǎng)已滿,則會(huì)顯示停車場(chǎng)已滿的信息;若便道上無車等待停車,會(huì)顯示便道上無車的信息;若中途有車離開,需其后的車讓道,會(huì)顯示進(jìn)入臨時(shí)停車場(chǎng)的車輛的信息;若輸入(‘F’,0,0),輸出“ERROR!”;若輸入(‘E’,0,0),程序結(jié)束。運(yùn)行結(jié)果截屏: 八.附錄 源程序文件清單: #include /*調(diào)用的頭文件庫聲明*/ #include /*用該結(jié)構(gòu)體來存放車的狀態(tài),編號(hào)和時(shí)間信息 */ { char bb; int num; int time; };typedef struct stack /*用該棧來模擬停車場(chǎng)*/ {struct car G[n]; int top;}SqStack;struct rangweicar /*用該結(jié)構(gòu)體來存放臨時(shí)讓出的車輛的編號(hào)以及時(shí)間信息*/ {int num;int time;};typedef struct stack /*用該棧來模擬臨時(shí)讓出的車輛的??繄?chǎng)地*/ {struct rangweicar H[MAXSIZE];int topp;}SqStackk;#define QNODE struct Qnode QNODE { int data; /*鏈隊(duì)結(jié)點(diǎn)的類型*/ QNODE *next; };typedef struct linkqueue /*用該鏈隊(duì)來模擬便道*/ {QNODE *front,*rear; int geshu; }LinkQueue;void Judge_Output(SqStack *s,LinkQueue *q,struct car *r)/*該算法通過傳遞來的車輛信息調(diào) { 用相關(guān)函數(shù)實(shí)現(xiàn)操作*/ if((*r).bb=='E'||(*r).bb=='e') /*若車輛狀態(tài)為‘E’,終止程序*/ printf(“STOP!n”);else if((*r).bb=='P'||(*r).bb=='p') /*若車輛狀態(tài)為‘P’,輸出停車場(chǎng)車輛數(shù)*/ printf(“The number of parking cars is %dn”,(s->top)+1);else if((*r).bb=='W'||(*r).bb=='w') /*若車輛狀態(tài)為‘W’,輸出便道車輛數(shù)*/ printf(“The number of waiting cars is %dn”,q->geshu);else if((*r).bb=='A'||(*r).bb=='a') /*若車輛狀態(tài)為‘A’,調(diào)用A_cars函數(shù)*/ A_cars(s,q,*r); else if((*r).bb=='D'||(*r).bb=='d') /*若車輛狀態(tài)為‘D’,調(diào)用D_cars函數(shù)*/ D_cars(s,q,*r);else printf(“ERROR!n”); /*若車輛狀態(tài)為其他字母,報(bào)錯(cuò)*/ } A_cars(SqStack *s,LinkQueue *q,struct car a) /*該算法實(shí)現(xiàn)對(duì)車輛狀態(tài)為到達(dá)的車輛的操 {QNODE *t; 作*/ if(s->top!=n-1) /*若停車場(chǎng)還沒有滿,則車進(jìn)停車場(chǎng),并存入車輛的狀態(tài),車牌編 {(s->top)++; 號(hào)和到達(dá)時(shí)間信息*/ (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”); /*若停車場(chǎng)已滿,車進(jìn)便道,并顯示該車的車牌編 t=(QNODE *)malloc(sizeof(QNODE)); 號(hào),同時(shí)記錄便道車輛數(shù)目*/ 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) /*該算法實(shí)現(xiàn)車輛狀態(tài)為離開的車 {int i,j,l; 輛的操作*/ float x,y;QNODE *p;SqStackk *k;if(d.num==(s->G[s->top]).num) /*若待離開車為最后進(jìn)停車場(chǎng)的車的情況*/ {x=d.time-(s->G[s->top]).time; y=fee*x; /*直接計(jì)算停車時(shí)間,費(fèi)用并離去*/ printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); if(q->geshu==0) /*若便道上無車,函數(shù)返回*/ {printf(“The queue is empty!n”); return 0; } Else /*若便道上有車,第一輛車進(jìn)停車場(chǎng)*/ {p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; /*并存入其車牌編號(hào)及進(jìn)停車場(chǎng)的時(shí)間*/ (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; /*若此時(shí)便道上無車,返回1*/ return 1; } } Else /*待離開的車不是最后進(jìn)停車場(chǎng)的那輛車的情況*/ {for(i=0;i<(s->top);i++) /*先找到待離開車在停車場(chǎng)中的位置*/ {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; /*計(jì)算待離開車的停車時(shí)間并計(jì)算費(fèi)用*/ y=fee*x; printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); k=(SqStackk *)malloc(sizeof(SqStackk)); /*設(shè)立一個(gè)新棧臨時(shí)停放為該車離開而讓 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) /*將新棧中的車重新開入停車場(chǎng)中*/ {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,無車開入停車場(chǎng)中*/ {printf(“The access road is empty!n”); return 2; } Else /*若便道上有車,則第一輛車開入停車場(chǎng)中*/ {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)); /*對(duì)停車場(chǎng)初始化*/ s->top=-1; q=(LinkQueue *)malloc(sizeof(LinkQueue)); p=(QNODE *)malloc(sizeof(QNODE)); /*對(duì)便道初始化*/ p->next=NULL; q->front=q->rear=p; q->geshu=0;printf(“******************************************************************************n”); printf(“************************* *************************n”); printf(“************************* 停車場(chǎng)管理系統(tǒng) *************************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 停車場(chǎng)收費(fèi)管理系統(tǒng) 需求報(bào)告 目錄 1 2 3 摘要 項(xiàng)目背景介紹 停車場(chǎng)收費(fèi)管理系統(tǒng)的現(xiàn)狀 功能需求 4.1 通用基本功能 4.2 圖像識(shí)別比較功能 4.3 先進(jìn)的閘機(jī)安全安裝 4.4 可增設(shè)中遠(yuǎn)距離車輛感應(yīng) 5 性能需求 5.1 系統(tǒng)基本要求 5.2 數(shù)據(jù)管理能力要求 5.3 故障處理要求 外部接口說明 6.1 入口和出口部分 6.2 數(shù)據(jù)流程 7 修正系統(tǒng)開發(fā)計(jì)劃 摘要 停車場(chǎng)電腦收費(fèi)管理系統(tǒng)是現(xiàn)代化停車場(chǎng)車輛收費(fèi)及設(shè)備自動(dòng)化管理的統(tǒng)稱,是將車場(chǎng)完全置于計(jì)算機(jī)管理下的高科技機(jī)電一體化產(chǎn)品。 根據(jù)多年設(shè)計(jì)、安裝停車場(chǎng)收費(fèi)系統(tǒng)的實(shí)際經(jīng)驗(yàn),我們?cè)谲浖拖到y(tǒng)設(shè)計(jì)上為停車場(chǎng)提供了一套最嚴(yán)格、最先進(jìn)、易用、便于維護(hù)和運(yùn)行可靠的收費(fèi)系統(tǒng);一套能有效的堵塞收費(fèi)漏洞,降低操作成本,提高經(jīng)濟(jì)效益和減輕勞動(dòng)強(qiáng)度,提高工作效率的現(xiàn)代化收費(fèi)管理系統(tǒng) 隨著時(shí)代的發(fā)展,私家車越來越多,而車位卻十分緊張。在市區(qū)內(nèi)有很多空間沒 有被充分利用,大多車輛是停在路邊或者簡(jiǎn)易停車場(chǎng),缺乏管理,這樣導(dǎo)致了資源的浪費(fèi),也造成了街道的擁堵。為了適應(yīng)社會(huì)的發(fā)展,大量的現(xiàn)代化大規(guī)模的停車場(chǎng)會(huì)被投入使用,但管理方面又容易出現(xiàn)問題。因此,停車場(chǎng)管理系統(tǒng)的開發(fā)和應(yīng)用是十分必要的。 此報(bào)告的目的重在分析此程序的總體需求,實(shí)現(xiàn)方案,并分析開發(fā)系統(tǒng)的可行性,為決策者提供是否開發(fā)該系統(tǒng)的依據(jù)和建議。項(xiàng)目背景介紹 2.1 開發(fā)軟件名稱:停車場(chǎng)管理系統(tǒng) 2.2項(xiàng)目開發(fā)者: 某軟件開發(fā)小組 2.3用戶單位: 某公司 2.4大體框架: 智能停車場(chǎng)收費(fèi)管理系統(tǒng) 門禁管理系統(tǒng) 智能通道管理系統(tǒng) 考勤管理系統(tǒng) 智能巡更管理系統(tǒng) 收費(fèi)管理系統(tǒng)等子系統(tǒng) 閉路監(jiān)視系統(tǒng)(CCTV) 消防安全系統(tǒng)(FA)和保安系統(tǒng)(SA)緊急廣播系統(tǒng) 停車場(chǎng)收費(fèi)管理系統(tǒng)的現(xiàn)狀 該系統(tǒng)具有很大的市場(chǎng)潛力,以現(xiàn)在的車輛增長速度推測(cè),在不久的將來肯定會(huì)有許多大規(guī)模停車場(chǎng)(包括住宅小區(qū))建成,此系統(tǒng)的開發(fā)很有價(jià)值。本系統(tǒng)現(xiàn)有的技術(shù)條件完全有能力順利完成開發(fā)工作,硬件、軟件上的配置也很容易滿足開發(fā)者的要求,開發(fā)系統(tǒng)的計(jì)算機(jī)硬件已經(jīng)非常普及,完全沒有問題;現(xiàn)在的計(jì)算機(jī)各方面的技術(shù)都非常成熟,相對(duì)來說開發(fā)此系統(tǒng)的技術(shù)也要求比較簡(jiǎn)單,因此在技術(shù)方面是可行的;各類技術(shù)人員的數(shù)量、水平、來源等也能很容易滿足;而且此系統(tǒng)的專業(yè)性不強(qiáng),因此不需要相關(guān)行業(yè)人士,開發(fā)人員的選擇就有很大余地。停車場(chǎng)計(jì)費(fèi)管理系統(tǒng)的主要工作是減少人工計(jì)費(fèi)帶來的不便,提高辦事效率,使車輛管理工作更加信息化,電子化。充分發(fā)揮計(jì)算機(jī)的信息傳輸速度快、準(zhǔn)確度高的優(yōu)勢(shì)。功能需求 4.1通用基本功能: 入口讀卡升閘、出口讀卡驗(yàn)卡收費(fèi)、車滿顯示、出入口與收費(fèi)亭對(duì)講、公正收費(fèi)等等。 4.2 圖像識(shí)別比較功能: 其他有圖像識(shí)別功能的系統(tǒng),其識(shí)別都是單向識(shí)別,即僅入口攝取,出口須由管理員目測(cè)比較。本系統(tǒng)入口、出口均采用攝像機(jī)比較,方便管理員直觀比較。 4.3 先進(jìn)的閘機(jī)安全安裝: 道閘欄桿配的自動(dòng)平穩(wěn)裝置,以及防抬桿、防砸車功能,檢測(cè)功能具有高靈敏度和高可靠性。能很好地識(shí)別非機(jī)動(dòng)車及人員等誤報(bào)情況。 4.4 可增設(shè)中遠(yuǎn)距離車輛感應(yīng): 采用50-80cm中距離或5-8m遠(yuǎn)距離感應(yīng)范圍的讀卡器,經(jīng)多次實(shí)際認(rèn)證為最方便的操作距離。系統(tǒng)如果沒有特殊要求一般車輛經(jīng)過讀卡器的距離約為10--15cm。性能需求 5.1 系統(tǒng)基本要求 響應(yīng)時(shí)間:系統(tǒng)的響應(yīng)時(shí)間不能超過1分鐘 警告時(shí)間及次數(shù):每隔三分鐘重復(fù)警告一次,每次警告時(shí)間持續(xù)一分鐘。主存容量:內(nèi)存:128MB RAM 磁盤容量:不小于1G 顯示器:256色,800*600以上的兼容顯示器 5.2 車輛管理能力要求 計(jì)費(fèi) 分為入口和出口,中間設(shè)立崗樓,一人操作,高峰時(shí)期可兩人操作,入口處發(fā)放計(jì)費(fèi)卡,出口處憑借計(jì)費(fèi)卡繳費(fèi),放行,操作簡(jiǎn)單快速方便。長期客戶可辦理月票。客戶也可購買車位,實(shí)現(xiàn)車位預(yù)留 監(jiān)控 全范圍監(jiān)控,無死角,監(jiān)控畫面與保安室相連接,可錄像。一旦出現(xiàn)事故或意外,保安可第一時(shí)間趕到現(xiàn)場(chǎng),必要時(shí)可以直接報(bào)警。出現(xiàn)緊急情況,如火災(zāi)時(shí),會(huì)自動(dòng)啟動(dòng)消防設(shè)備,并自動(dòng)開啟大門,放行車輛。自動(dòng)引導(dǎo)車位 停車更加快速,有效,方便。 5.3 故障處理要求 列出可能的軟件、硬件故障以及對(duì)各項(xiàng)性能而言所產(chǎn)生的后果和對(duì)故障處理的要求。輸出發(fā)生錯(cuò)誤時(shí),在系統(tǒng)的代碼部分進(jìn)行修改 外部接口說明 6.1 入口和出口部分 入口控制部分: 智能停車場(chǎng)收費(fèi)管理系統(tǒng) 門禁管理系統(tǒng) 智能通道管理系統(tǒng) 考勤管理系統(tǒng) 智能巡更管理系統(tǒng) 出口控制部分: 收費(fèi)管理系統(tǒng)等子系統(tǒng) 閉路監(jiān)視系統(tǒng)(CCTV) 消防安全系統(tǒng)(FA)和保安系統(tǒng)(SA)緊急廣播系統(tǒng) 6.2 數(shù)據(jù)流程 修正系統(tǒng)開發(fā)計(jì)劃 對(duì)于車輛的管理有待提高,如停車位置,出場(chǎng)路線等。在以后的系統(tǒng)中,會(huì)提供諸如此類的更加人性化的服務(wù)。 本系統(tǒng)會(huì)提供多國語言的電子錄音,使此系統(tǒng)對(duì)不懂中文的客戶也適用。 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 《數(shù)據(jù)結(jié)構(gòu)》實(shí)驗(yàn)設(shè)計(jì)報(bào)告 題目:停車場(chǎng)管理系統(tǒng) 姓名:** 學(xué)號(hào): 2010211998 班級(jí):0491002 學(xué)院:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 目錄 一、問題描述………………………………………………………03 二、問題分析………………………………………………………03 三、數(shù)據(jù)結(jié)構(gòu)描述…………………………………………………04 四、算法設(shè)計(jì)………………………………………………………04 五、程序優(yōu)缺點(diǎn)分析及優(yōu)化………………………………………05 六、程序源代碼……………………………………………………07 七、程序運(yùn)行結(jié)果…………………………………………………13 八、心得體會(huì)………………………………………………………15 附 一、優(yōu)化后的程序…………………………………………………16 附 二、優(yōu)化后程序的運(yùn)行結(jié)果………………………………………23 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 一、問題描述 設(shè)計(jì)一個(gè)停車場(chǎng)管理系統(tǒng)。 設(shè)停車場(chǎng)是一個(gè)可停放n輛汽車的狹長通道,且只有一個(gè)大門可供汽車進(jìn)出。汽車在停車場(chǎng)內(nèi)按車輛到達(dá)時(shí)間的先后順序,依次由北向南排列(大門在最南端,最先到達(dá)的第一輛車停放在停車場(chǎng)的最北端),若停車場(chǎng)內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場(chǎng)內(nèi)某輛車要離開時(shí),在它之后進(jìn)入的車輛必須先退出車場(chǎng)為它讓路,待該輛車開出大門外,其他車輛再按原次序進(jìn)入車場(chǎng),每輛停放在車場(chǎng)的車在它離開停車場(chǎng)時(shí)必須按它停留的時(shí)間長短交納費(fèi)用。試為停車場(chǎng)編制按上述要求進(jìn)行管理的模擬程序?!净疽蟆?/p> 以棧模擬停車場(chǎng),以隊(duì)列模擬車場(chǎng)外的便道,按照從終端讀入的輸入數(shù)據(jù)序列進(jìn)行模擬管理。每一組輸入數(shù)據(jù)包括三個(gè)數(shù)據(jù)項(xiàng):汽車?到達(dá)?或?離去?信息、汽車牌照號(hào)碼以及到達(dá)或離去的時(shí)刻。對(duì)每一組輸入數(shù)據(jù)進(jìn)行操作后的輸出信息為:若是車輛到達(dá),則輸出汽車在停車場(chǎng)內(nèi)或便道上的停車位置;若是車輛離去,則輸出汽車在停車場(chǎng)內(nèi)停留的時(shí)間和應(yīng)交納的費(fèi)用(在便道上停留的時(shí)間不收費(fèi))。棧以順序結(jié)構(gòu)實(shí)現(xiàn),隊(duì)列以鏈表結(jié)構(gòu)實(shí)現(xiàn)?!具x作內(nèi)容】 (1)兩個(gè)棧共享空間,思考應(yīng)開辟數(shù)組的空間是多少? (2)汽車可有不同種類,則他們的占地面積不同,收費(fèi)標(biāo)準(zhǔn)也不同,如1輛客車和1.5輛小汽車的占地面積相同,1輛十輪卡車占地面積相當(dāng)于3輛小汽車的占地面積。 (3)汽車可以直接從便道上開走,此時(shí)排在它前面的汽車要先開走讓路,然后再依次排到隊(duì)尾。 二、問題分析 該問題需要以棧和隊(duì)列作為基本的存儲(chǔ)結(jié)構(gòu),以順序棧模擬停車場(chǎng),以鏈隊(duì)列模擬車場(chǎng)外的便道。汽車進(jìn)入停車場(chǎng),即是在順序棧上執(zhí)行進(jìn)棧操作,退出停車場(chǎng)即是在順序棧上執(zhí)行出棧操作;汽車進(jìn)入便道,即是在鏈隊(duì)列上執(zhí)行入隊(duì)操作,退出便道即是在鏈隊(duì)列上執(zhí)行出隊(duì)操作。 當(dāng)停車場(chǎng)內(nèi)某輛車要離開時(shí),在它之后進(jìn)入的車輛必須先退出車場(chǎng)為它讓路,待該輛車開出大門外,其他車輛再按原次序進(jìn)入車場(chǎng)。設(shè)要?jiǎng)h除的元素在順序表St中位置為i,則從i到top之間的全部元素進(jìn)入到一個(gè)臨時(shí)棧St1中, 其次再刪除該元素,然后將臨棧St1的元素按照?先進(jìn)后出?的原則重新回到St中。若鏈隊(duì)不空,則使隊(duì)頭進(jìn)棧St,并以當(dāng)前時(shí)刻開始計(jì)費(fèi)。 程序需要構(gòu)造兩個(gè)順序棧St和St1,其中St用于模擬停車場(chǎng),St1用作臨時(shí)棧,臨時(shí)停放為給要離去的汽車讓路而從停車場(chǎng)退出來的汽車。此外還需要構(gòu) 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 造一個(gè)鏈隊(duì)列Qu用于模擬便道。 三、數(shù)據(jù)結(jié)構(gòu)描述 /*定義順序棧類型*/ typedefstruct { intCarNo[N]; /*車牌號(hào)*/ intCarTime[N]; /*進(jìn)場(chǎng)時(shí)間*/ int top; /*棧指針*/ } SqStack; /*定義順序棧類型*/ /*定義鏈隊(duì)類型*/ typedefstructqnode { intCarNo; /*車牌號(hào)*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*隊(duì)首和隊(duì)尾指針*/ QNode *rear;} LiQueue; 四、算法設(shè)計(jì) 1.對(duì)于子函數(shù)模塊,則調(diào)用順序棧的基本操作和鏈隊(duì)列的基本操作。如下: /*順序棧的基本運(yùn)算算法*/ voidInitStack(SqStack *&s) intStackEmpty(SqStack *s) intStackFull(SqStack *s) /*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2) 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 /*刪除S的棧頂元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2) voidDispStack(SqStack *s) /*以下為鏈隊(duì)列的基本運(yùn)算算法*/ 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(命令!=?退出?); } 五、程序優(yōu)缺點(diǎn)分析及優(yōu)化 1.程序的優(yōu)點(diǎn) 在程序中設(shè)置了kind變量,用于保存車的類別,便于計(jì)算不同類別車的停車費(fèi)用,如下程序段: printf(“n請(qǐng)輸入車的類別【車的類別:1.代表小汽車 2.代表客車 3.代表卡車】:n”);scanf(“%d”,&kind); 其中kind可取值1,2,3;若kind取2,則表示一輛客車單位時(shí)間內(nèi)的停車費(fèi)用 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 是一輛小汽車的2倍,若kind取3,則表示一輛卡車單位時(shí)間內(nèi)的停車費(fèi)用是一輛小汽車的3倍。 當(dāng)然printf(“n請(qǐng)輸入車的類別【車的類別:1.代表小汽車 2.代表客車 3.代表卡車】:n”);中的1.2.3也可以根據(jù)實(shí)際情況改變。比如,若實(shí)際中,一輛小汽車單位時(shí)間內(nèi)的停車費(fèi)用 是一輛客車的2倍,一輛卡車單位時(shí)間內(nèi)的停車費(fèi)用是一輛客車的4倍,則可以改成: printf(“n請(qǐng)輸入車的類別【車的類別:1.代表客車2.代表小汽車 4.代表卡車】:n”); 則kind可取值1,2,4; kind取1時(shí)對(duì)應(yīng)的是客車,表示計(jì)算停車費(fèi)用時(shí)以一輛客車單位時(shí)間內(nèi)的停車費(fèi)用為基數(shù),若kind取2,則表示一輛小汽車單位時(shí)間內(nèi)的停車費(fèi)用是一輛客車的2倍,若kind取4,則表示一輛卡車單位時(shí)間內(nèi)的停車費(fèi)用是一輛客車的4倍。 2.程序的缺點(diǎn) (1)輸入時(shí)間時(shí),程序沒有檢測(cè)錯(cuò)誤功能 程序的輸入形式如下: 設(shè)n=2,輸入數(shù)據(jù)為:(‘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’表示到達(dá)(arrival);‘D’表示離去(departure);‘E’表示輸出結(jié)束(end)。 設(shè)每個(gè)輸入項(xiàng)的形式為(Choose, CarNumber, Time),其中Choose表示每個(gè)括號(hào)中的第一項(xiàng)數(shù)據(jù),即A/D/E; CarNumber表示每個(gè)括號(hào)中的第二項(xiàng),即1/2/3;Time表示每個(gè)括號(hào)中的第三項(xiàng),即5/10/15。設(shè)前后兩次輸入的數(shù)據(jù)中的第三項(xiàng)分別為Time1,Time2;則必須滿足Time2≧Time1。而在實(shí)際輸入過程中用戶可能會(huì)忽略這一點(diǎn),所以應(yīng)該在輸入Time是設(shè)置一個(gè)判斷語句,若前后兩次輸入的Time不滿足Time2≧Time1,則要求用戶重新輸入,直至滿足要求為止。 (2)程序的界面不夠清晰,一次性輸入的數(shù)據(jù)項(xiàng)比較多,容易出錯(cuò)。3.改進(jìn)思想(1) 為了保證前后兩次輸入的Time必須滿足Time2≧Time1,使程序具有錯(cuò)誤檢測(cè)功能,在程序輸入部分添加了如下代碼: printf(“輸入現(xiàn)在的時(shí)刻:n”); scanf(“%d”,&time2); while(time2 { printf(“時(shí)間輸入錯(cuò)誤,請(qǐng)重新輸入:n”); scanf(“%d”,&time2); 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 } time1=time2;//time1定義為靜態(tài)變量 (2)為了使程序有更清晰的界面,可在主函數(shù)中加入菜單的顯示方式。且數(shù)據(jù)可以采用一次輸入一個(gè)數(shù)據(jù)項(xiàng),分步輸入的方式,使輸入過程少出錯(cuò)。于是可以將主函數(shù)進(jìn)行修改。(見附錄一) 六、程序源代碼 #include /*停車場(chǎng)內(nèi)最多的停車數(shù)*/ #define Price 2 /*每單位停車費(fèi)用*/ typedefstruct { intCarNo[N]; /*車牌號(hào)*/ intCarTime[N]; /*進(jìn)場(chǎng)時(shí)間*/ int top; /*棧指針*/ } SqStack; /*定義順序棧類型*/ /*定義鏈隊(duì)類型*/ typedefstructqnode { intCarNo; /*車牌號(hào)*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*隊(duì)首和隊(duì)尾指針*/ QNode *rear;} LiQueue; /*順序棧的基本運(yùn)算算法*/ voidInitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1; 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 } 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”);} /*以下為鏈隊(duì)列的基本運(yùn)算算法*/ 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 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)/*若鏈隊(duì)為空,則新結(jié)點(diǎn)是隊(duì)首結(jié)點(diǎn)又是隊(duì)尾結(jié)點(diǎn)*/ q->front=q->rear=s;else { q->rear->next=s;/*將*s結(jié)點(diǎn)鏈到隊(duì)尾,rear指向它*/ q->rear=s;} } intdeQueue(LiQueue *&q,int&e){ QNode *t;if(q->rear==NULL)/*隊(duì)列為空*/ return 0; 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 if(q->front==q->rear)/*隊(duì)列中只有一個(gè)結(jié)點(diǎn)時(shí)*/ { t=q->front; q->front=q->rear=NULL;} else /*隊(duì)列中有多個(gè)結(jié)點(diǎn)時(shí)*/ { 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;/*用于存放車牌號(hào)、當(dāng)前停車時(shí)刻*/ inti,j;SqStack *St,*St1;/*臨時(shí)棧St1,當(dāng)停車場(chǎng)中間的車要推出去時(shí),用于倒車*/ LiQueue *Qu;InitStack(St);InitStack(St1);InitQueue(Qu);printf(“ #”);printf(“n# #”);printf(“n# 歡迎使用停車場(chǎng)管理系統(tǒng) #”); 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 printf(“n# #”);printf(“n# 【輸入提示】:汽車狀態(tài)由A、D、E 表示。其中,A:表示汽車到達(dá) D:表示汽車離去, #”);printf(“n# E:表示輸出結(jié)束。每次輸入的數(shù)據(jù)由三項(xiàng)構(gòu)成,即:(汽車狀態(tài),車牌號(hào),當(dāng)前時(shí)刻)#”);printf(“n# 數(shù)據(jù)項(xiàng)之間以逗號(hào)分開。例如輸入示范:A,1,5 #”);printf(“n #n”);printf(“n正在讀取汽車信息...n”); do { printf(“n*****************************************************************”);printf(“n請(qǐng)分別輸入汽車狀態(tài)(A/D/E)、車牌號(hào)和當(dāng)前時(shí)刻(數(shù)據(jù)之間以逗號(hào)分開):n”);scanf(“ %c,%d,%d”,&choose,&no,&time); switch(choose){ /*************************** 汽車到達(dá) ******************************/ case 'A': case 'a': if(!StackFull(St)) /*停車場(chǎng)不滿*/ { Push(St,no,time); printf(“該車在停車場(chǎng)中的位置是:%dn”,St->top+1); } else /*停車場(chǎng)滿*/ { enQueue(Qu,no); printf(“n停車場(chǎng)已滿,該車進(jìn)入便道,在便道中的位置是:%dn”,QueueLength(Qu)); } break;/************************* 汽車離開 ********************************/ case 'D': case 'd': 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 printf(“n請(qǐng)輸入車的類別【車的類別:1.代表小汽車 2.代表客車 3.代表卡車】:n”);scanf(“%d”,&kind); for(i=0;i<=St->top && St->CarNo[i]!=no;i++); if(i>St->top)/*要離開的汽車在便道上*/ { /*汽車可以直接從便道上開走,此時(shí)排在它前面的汽車要先開走讓路,然后再依次排到隊(duì)尾*/ 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便道上車牌號(hào)為%d的汽車已離開!n”,no); printf(“n當(dāng)前便道中的車輛的車牌號(hào)分別是:”); DisplayQueue(Qu); printf(“n”); } else /*要離開的汽車在停車場(chǎng)中*/ { for(j=i;j<=St->top;j++) { Pop(St,e1,e2);/*e1,e2用來返回被刪元素的車牌號(hào)和停車時(shí)刻*/ Push(St1,e1,e2);/*倒車到臨時(shí)棧St1中,將e1,e2插入到臨時(shí)棧中*/ } Pop(St,e1,e2); /*該汽車離開*/ printf(“n車牌號(hào)為%d的汽車停車時(shí)間為:%d。停車費(fèi)用為:%dn”,no,time-e2,(time-e2)*Price*kind); /*對(duì)小汽車而言:當(dāng)前時(shí)刻 減去 該車當(dāng)時(shí)停車的時(shí)刻,再乘以價(jià)格就是費(fèi)用,而對(duì)于客車和卡車而言,就要乘以kind倍小汽車的價(jià)格*/ while(!StackEmpty(St1))/*將臨時(shí)棧St1重新回到St中*/ { Pop(St1,e1,e2); Push(St,e1,e2); } if(!QueueEmpty(Qu))/*隊(duì)不空時(shí),將隊(duì)頭進(jìn)棧St*/ { 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 deQueue(Qu,e1); Push(St,e1,time);/*以當(dāng)前時(shí)間開始計(jì)費(fèi)*/ } printf(“n當(dāng)前停車場(chǎng)中的車輛的車牌號(hào)分別是:”);//輸出停車場(chǎng)中的車輛 DispStack(St); } break;/************************ 結(jié)束 *********************************/ case 'E': case 'e': printf(“n正在退出系統(tǒng)...n”); if(!StackEmpty(St))//顯示停車場(chǎng)情況 { printf(“n當(dāng)前停車場(chǎng)中的車輛的車牌號(hào)分別是:”);//輸出停車場(chǎng)中的車輛 DispStack(St); printf(“n”); } else printf(“n當(dāng)前停車場(chǎng)中無車輛nn”); break;/************************ 結(jié)束 *********************************/ default: /*其他情況*/ printf(“輸入的命令錯(cuò)誤!n”); break;} } while(choose!='E'&&choose!='e');} 七、程序運(yùn)行結(jié)果 取N=2,即停車場(chǎng)內(nèi)最多的停車數(shù)為2 取 Price=2,即每單位停車費(fèi)用為2 輸入數(shù)據(jù)為:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 (‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。程序演示結(jié)果如下圖所示: 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 八、心得體會(huì) (1)該實(shí)驗(yàn)涉及到順序棧的建立、插入、刪除等操作,涉及到了鏈隊(duì)列的建立、插入、刪除等操作。做這個(gè)實(shí)驗(yàn),加深了我對(duì)以上知識(shí)點(diǎn)的認(rèn)識(shí)和理解。(2)提高了 C 語言編程的能力。在程序設(shè)計(jì)過程中,需要經(jīng)過反復(fù)地編寫,調(diào)試,運(yùn)行,發(fā)現(xiàn)問題并解決問題,在這次實(shí)驗(yàn)的設(shè)計(jì)中,我加深對(duì)程序的了解,提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力同時(shí)我也學(xué)會(huì)了綜合以前學(xué)到的基本知識(shí)來解決較大問題的方法。 (3)一方面我養(yǎng)成了注重程序細(xì)節(jié)的意識(shí)。例如: printf(“n請(qǐng)分別輸入汽車狀態(tài)(A/D/E)、車牌號(hào)和當(dāng)前時(shí)刻(數(shù)據(jù)之間以逗號(hào)分開):n”);scanf(“ %c,%d,%d”,&choose,&no,&time); 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 %c,前面必須留一個(gè)空格,否則程序在顯示的時(shí)候就會(huì)有一些問題。 (4)另一方面我也深刻地認(rèn)識(shí)到了《數(shù)據(jù)結(jié)構(gòu)》這門課程的重要性。“數(shù)據(jù)結(jié)構(gòu)”在計(jì)算機(jī)科學(xué)中是一門綜合性的專業(yè)基礎(chǔ)課。數(shù)據(jù)結(jié)構(gòu)的研究不僅涉及到計(jì)算機(jī)硬件的研究,而且和計(jì)算機(jī)軟件的研究有著更密切的關(guān)系,無論是編譯程序還是操作系統(tǒng),都涉及到數(shù)據(jù)元素在存儲(chǔ)器中的分配問題。在研究信息檢索時(shí)也必須 考慮如何組織數(shù)據(jù),以便使查找和存取數(shù)據(jù)元素更為方便??梢哉J(rèn)為數(shù)據(jù)結(jié)構(gòu)是介于數(shù)學(xué)、計(jì)算機(jī)硬件和計(jì)算機(jī)軟件三者之間的一個(gè)核心內(nèi)容,是從事計(jì)算機(jī)科學(xué)研究及其應(yīng) 用的科技工作者必須掌握的重要內(nèi)容 附 一、優(yōu)化后的程序 #include /*停車場(chǎng)內(nèi)最多的停車數(shù)*/ #define Price 2 /*每單位停車費(fèi)用*/ typedefstruct { intCarNo[N]; /*車牌號(hào)*/ intCarTime[N]; /*進(jìn)場(chǎng)時(shí)間*/ int top; /*棧指針*/ } SqStack; /*定義順序棧類型*/ /*定義鏈隊(duì)類型*/ typedefstructqnode { intCarNo;/*車牌號(hào)*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*隊(duì)首和隊(duì)尾指針*/ QNode *rear;} LiQueue; /*順序棧的基本運(yùn)算算法*/ voidInitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;} 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 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”);} /*以下為鏈隊(duì)列的基本運(yùn)算算法*/ voidInitQueue(LiQueue *&q){ q=(LiQueue *)malloc(sizeof(LiQueue)); 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 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)/*若鏈隊(duì)為空,則新結(jié)點(diǎn)是隊(duì)首結(jié)點(diǎn)又是隊(duì)尾結(jié)點(diǎn)*/ q->front=q->rear=s;else { q->rear->next=s;/*將*s結(jié)點(diǎn)鏈到隊(duì)尾,rear指向它*/ q->rear=s;} } intdeQueue(LiQueue *&q,int&e){ QNode *t;if(q->rear==NULL)/*隊(duì)列為空*/ return 0;if(q->front==q->rear)/*隊(duì)列中只有一個(gè)結(jié)點(diǎn)時(shí)*/ { t=q->front; 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 q->front=q->rear=NULL;} else /*隊(duì)列中有多個(gè)結(jié)點(diǎn)時(shí)*/ { 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:汽車離開時(shí)輸入車牌號(hào);time2:當(dāng)前停車時(shí)刻;*/ static int time1;/*靜態(tài)變量time1用于存放上次時(shí)刻*/ inti,j;int kind;/*車的類別*/ time1=time2=0;SqStack *St,*St1;/*臨時(shí)棧St1,當(dāng)停車場(chǎng)中間的車要推出去時(shí),用于倒車*/ LiQueue *Qu;InitStack(St);InitStack(St1);InitQueue(Qu);printf(“ ”);printf(“n# #”); 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 printf(“n# 歡迎使用停車場(chǎng)管理系統(tǒng) #”);printf(“n# #”);printf(“n n”);do { printf(“n******************** 主菜單 ****************************n”); printf(“** 1:車輛到達(dá) **n”); printf(“** 2:車輛離開 **n”); printf(“** 3:顯示停車場(chǎng)的車輛 **n”); printf(“** 4:顯示便道中的車輛 **n”); printf(“** 0:退出 **n”); printf(“********************************************************n”); printf(“請(qǐng)選擇:”); scanf(“%d”,&choose); switch(choose) { case 1: // #汽車到達(dá) ###### printf(“輸入輸入車牌號(hào)、當(dāng)前時(shí)刻(數(shù)據(jù)之間以逗號(hào)隔開):n”); scanf(“%d,%d”,&no,&time2);/*依次輸入車牌號(hào)、當(dāng)前停車時(shí)刻*/ while(time2 { printf(“時(shí)間輸入錯(cuò)誤,請(qǐng)重新輸入當(dāng)前時(shí)刻:n”); scanf(“%d”,&time2); } time1=time2; if(!StackFull(St)) /*停車場(chǎng)不滿*/ { Push(St,no,time1); printf(“該車在停車場(chǎng)中的位置是:%dn”,St->top+1); 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 } else /*停車場(chǎng)滿*/ { enQueue(Qu,no); printf(“n停車場(chǎng)已滿,該車進(jìn)入便道,在便道中的位置是:%dn”,QueueLength(Qu)); } break; case 2: // ##汽車離開 #### printf(“輸入車牌號(hào):n”); scanf(“%d”,&no_away); printf(“請(qǐng)輸入車的類別【車的類別:1.代表小汽車 2.代表客車 3.代表卡車】:n”);scanf(“%d”,&kind); printf(“輸入現(xiàn)在的時(shí)刻:n”);/*現(xiàn)在的時(shí)刻time1得大于之前的時(shí)刻time1*/ scanf(“%d”,&time2); while(time2 { printf(“時(shí)間輸入錯(cuò)誤,請(qǐng)重新輸入:n”); scanf(“%d”,&time2); } time1=time2; for(i=0;i<=St->top && St->CarNo[i]!=no_away;i++); if(i>St->top)/*汽車可以直接從便道上開走,此時(shí)排在它前面的汽車要先開走讓路,然后再依次排到隊(duì)尾*/ { while(Qu->front->CarNo!=no_away) { enQueue(Qu,Qu->front->CarNo); Qu->front = Qu->front->next; } deQueue(Qu,no_away);printf(“n便道上車牌號(hào)為%d的汽車已離開!n”,no_away); printf(“n當(dāng)前便道中的車輛的車牌號(hào)分別是:”); DisplayQueue(Qu); printf(“n”); } else 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 { for(j=i;j<=St->top;j++) { Pop(St,e1,e2);/*e1,e2用來返回被刪元素的車牌號(hào)和停車時(shí)刻*/ Push(St1,e1,e2);/*倒車到臨時(shí)棧St1中,將e1,e2插入到臨時(shí)棧中*/ } Pop(St,e1,e2); /*該汽車離開*/ printf(“n車牌號(hào)為%d的汽車停車費(fèi)用為:%dn”,no_away,(time2-e2)*Price*kind);/*對(duì)小汽車而言:當(dāng)前時(shí)刻 減去 該車當(dāng)時(shí)停車的時(shí)刻,再乘以價(jià)格就是費(fèi)用,而對(duì)于客車和卡車而言,就要乘以kind倍小汽車的價(jià)格*/ while(!StackEmpty(St1))/*將臨時(shí)棧St1重新回到St中*/ { Pop(St1,e1,e2); Push(St,e1,e2); } if(!QueueEmpty(Qu))/*隊(duì)不空時(shí),將隊(duì)頭進(jìn)棧St*/ { deQueue(Qu,e1); Push(St,e1,time1);/*以當(dāng)前時(shí)間開始計(jì)費(fèi)*/ } } break; case 3: // #####顯示停車場(chǎng)情況 if(!StackEmpty(St)) { printf(“當(dāng)前停車場(chǎng)中的車輛的車牌號(hào)分別是:”);/*輸出停車場(chǎng)中的車輛*/ DispStack(St); } else printf(“停車場(chǎng)中無車輛!n”); break; case 4: // ######顯示便道情況 # if(!QueueEmpty(Qu)) { 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 printf(“ 當(dāng)前便道中的車輛的車牌號(hào)分別是:”);/*輸出便道中的車輛*/ DisplayQueue(Qu); } else printf(“便道中無車輛!n”); break; case 0: // # 結(jié)束 ### printf(“n正在退出系統(tǒng)...n”); if(!StackEmpty(St)) { printf(“當(dāng)前停車場(chǎng)中的車輛的車牌號(hào)分別是:”);/*輸出停車場(chǎng)中的車輛*/ DispStack(St); } if(!QueueEmpty(Qu)) { printf(“ 當(dāng)前便道中的車輛的車牌號(hào)分別是:”);/*輸出便道中的車輛*/ DisplayQueue(Qu); } break; /**********************************************************/ default: /*其他情況*/ printf(“輸入的命令錯(cuò)誤!n”); break; } } while(choose!=0);} 附 二、優(yōu)化后程序的運(yùn)行結(jié)果 取N=2,即停車場(chǎng)內(nèi)最多的停車數(shù)為2 取 Price=2,即每單位停車費(fèi)用為2 輸入數(shù)據(jù)為:(‘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)。程序演示結(jié)果如下圖所示: 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 重慶郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 EDA 多 功 能 數(shù) 字 時(shí) 鐘 專業(yè):11級(jí)應(yīng)用電子技術(shù) 班級(jí):二班 學(xué)號(hào):110372021307 姓名:賀成林 指導(dǎo)老師:祝宏 日期:2012年6月29日 一、實(shí)驗(yàn)?zāi)康?/p> 1、課程設(shè)計(jì)是一實(shí)踐教學(xué)環(huán)節(jié),是針對(duì)《數(shù)字電子技術(shù)》課程的要求,結(jié)合實(shí)踐對(duì)學(xué)生進(jìn)行綜合設(shè)計(jì)性訓(xùn)練,在自學(xué)和實(shí)踐訓(xùn)練中培養(yǎng)學(xué)生理論聯(lián)系實(shí)踐和實(shí)踐動(dòng)手能力,獨(dú)立地解決實(shí)際問題能力。 2、通過課程設(shè)計(jì)是使學(xué)生熟悉和了解可編程專用數(shù)字邏輯電路的設(shè)計(jì)、開發(fā)流程,熟悉和了解現(xiàn)代EDA設(shè)計(jì)工具,掌握數(shù)字電子系統(tǒng)層次化的設(shè)計(jì)方法。 已知條件:MAX+Plus軟件 基本功能: 1、以數(shù)字形式顯示時(shí)、分、秒的時(shí)間; 2、小時(shí)計(jì)數(shù)器為24進(jìn)制; 3、分秒計(jì)數(shù)器為60進(jìn)制。 二、實(shí)驗(yàn)要求、綜合應(yīng)用《數(shù)字電子技術(shù)基礎(chǔ)》課程中的理論知識(shí)去獨(dú)立地完成一個(gè)設(shè)計(jì)課題; 2、熟悉和了解現(xiàn)代EDA設(shè)計(jì)、編程、編譯、仿真及下載技術(shù)的全過程。 三、EDA 技術(shù)介紹 1、EDA 技術(shù)概況 EDA 是電子設(shè)計(jì)自動(dòng)化(Electronic Design Automation)的縮寫,在 20 世 紀(jì) 90 年代初從計(jì)算機(jī)輔助設(shè)計(jì)(CAD)、計(jì)算機(jī)輔助制造(CAM)、計(jì)算機(jī)輔助測(cè)試(CAT)和計(jì)算機(jī)輔助工程(CAE)的概念發(fā)展而來的。EDA 技術(shù)就是以計(jì)算機(jī)為工 具,設(shè)計(jì)者在 EDA 軟件平臺(tái)上,用硬件描述語言 HDL 完成設(shè)計(jì)文件,然后由計(jì)算機(jī) 自動(dòng)地完成邏輯編譯、化簡(jiǎn)、分割、綜合、優(yōu)化、布局、布線和仿真,直至對(duì)于特 定目標(biāo)芯片的適配編譯、邏輯映射和編程下載等工作。EDA 技術(shù)的出現(xiàn),極大地提 高了電路設(shè)計(jì)的效率和可*性,減輕了設(shè)計(jì)者的勞動(dòng)強(qiáng)度。 2、ALTERA QUARTUS II 軟件介紹 Quartus II 是 Altera 公司的綜合性 PLD 開發(fā)軟件,支持原理圖、VHDL、VerilogHDL 以及 AHDL(Altera Hardware Description Language)等多種 設(shè)計(jì)輸入形式,內(nèi)嵌自有的綜合器以及仿真器,可以完成從設(shè)計(jì)輸入到硬件 配置的完整 PLD 設(shè)計(jì)流程。 四、關(guān)鍵詞 數(shù)字計(jì)數(shù)器、動(dòng)態(tài)顯示、快速校分、整點(diǎn)報(bào)時(shí)、時(shí)段控制。 五、實(shí)驗(yàn)步驟 1、秒計(jì)數(shù)器是60進(jìn)制的。當(dāng)下面的74161到9時(shí)等下一個(gè)脈沖來是向上面的74161計(jì)數(shù),到5時(shí)將兩個(gè)74161共同預(yù)置。從而實(shí)現(xiàn)00—59秒的計(jì)數(shù)功能。 電路圖如下: 進(jìn)行編譯及波形仿真,如下圖: 將上述文件保存并打包,如圖: 2、分計(jì)數(shù)器是60進(jìn)制的。功能如秒計(jì)數(shù)器。其電路圖如下: 波形圖仿真及打包圖如下: 3、小時(shí)計(jì)數(shù)器是24進(jìn)制的。當(dāng)下面的74161到9時(shí)等下一個(gè)脈沖來是向上面的74161計(jì)數(shù)。但是等到上面的記到2時(shí)下面的將不能超過4,所以等上面的記到2,下面的記到4時(shí)就將兩個(gè)74161共同預(yù)置。從而實(shí)現(xiàn)00—24秒的計(jì)數(shù)功能。 原理圖如下: 仿真的波形圖及打包的文件圖如下: 4、校時(shí)。校時(shí)是通過加快時(shí)分的計(jì)數(shù)速度來快速校準(zhǔn)時(shí)間的。實(shí)際上我們把秒脈沖cps加到分計(jì)數(shù)和時(shí)計(jì)數(shù)上,是他們加快計(jì)數(shù)速度。所以其中我們需要通過開關(guān)來選擇。 原理圖及打包圖如下: 5、時(shí)段控制:時(shí)段控制是通過7485集成電路的數(shù)據(jù)比較來控制的。 原理圖及打包圖如下: 6、整點(diǎn)報(bào)時(shí):整點(diǎn)報(bào)時(shí)是通過整點(diǎn)時(shí)的二進(jìn)制數(shù)據(jù)規(guī)律來報(bào)時(shí)的。 原理圖及打包圖如下: 7、將時(shí)分秒打包文件連成多功能數(shù)字電路圖如下: 8、多功能數(shù)字鐘硬件測(cè)試原理圖如下: 9、部分制作過程圖,如下: 六、實(shí)驗(yàn)工具 裝有QuartusⅡ軟件的電腦,EDA開發(fā)板,相關(guān)EDA設(shè)計(jì)方面的書籍。 七、設(shè)計(jì)中遇到問題及解決方法 1、實(shí)驗(yàn)后期的引腳分配及下載方法不當(dāng),實(shí)驗(yàn)所用電腦沒有 quartus11.0 的 驅(qū)動(dòng)。耗費(fèi)時(shí)間較多。解決方法:參閱西安電子科技大學(xué)出版社出版的《數(shù)字電路設(shè)計(jì)及 Verilog HDL 實(shí)現(xiàn)》第 394 頁關(guān)于引腳分配和下載驗(yàn)證的介紹; 2、下載驗(yàn)證過程中時(shí)段控制部分有錯(cuò)誤,原代碼在軟件上仿真沒有錯(cuò)誤,但是下載到實(shí)驗(yàn)板驗(yàn)證時(shí),出現(xiàn)錯(cuò)誤。解決方法:通過去請(qǐng)教同學(xué)及查閱相關(guān)資料得到解決。 八、特點(diǎn)和實(shí)用性 利用 QuartusII 軟件,結(jié)合所學(xué)的數(shù)字電路的知識(shí)設(shè)計(jì)一個(gè) 24 時(shí)多功能數(shù) 字鐘,具有正常分、秒計(jì)時(shí),動(dòng)態(tài)顯示、快速校分、整點(diǎn)報(bào)時(shí)、時(shí)段控制的功能。分析整個(gè)電路的工作原理,分別說明各子模塊的設(shè)計(jì)原理和調(diào)試、仿真、編 程下載的過程,并對(duì)最終結(jié)果進(jìn)行總結(jié),最后提出在實(shí)驗(yàn)過程中出現(xiàn)的問題和解 決的方案。通過實(shí)驗(yàn)掌握一些邏輯組合器件的基本功能和用法,同時(shí)體會(huì)利用軟件設(shè)計(jì) 電路的方便快捷,避免硬件布線的繁瑣,提高效率。 九、心得體會(huì) 1、設(shè)計(jì)必須要有整體概念,提前熟悉軟件。剛開始時(shí)沒頭緒,不知道該怎 樣分塊,進(jìn)度很慢,加上對(duì)軟件不是很熟悉,比如:封裝要注意哪些,哪些不能 運(yùn)行,哪些是不正確的操作等等,走了很多冤枉路。 2、設(shè)計(jì)的模塊要分塊調(diào)試,免得等所有都完工了再調(diào)試出錯(cuò),那樣的話很 難確定是什么出錯(cuò),更加沒頭緒。有必要的話做一部分后就送到平臺(tái)上調(diào)試,這 樣會(huì)大大減少出錯(cuò)率。 3、沒有硬件軟件化的概念,開始設(shè)計(jì)時(shí)沒有總體的規(guī)劃,不知道什么是可行 的,什么是封裝,怎樣使搭配組合最優(yōu)化。 4、遇到問題先自己摸索,查閱資料要有技巧,避免沒有目的和思路。明白 自己要解決什么問題。同時(shí)請(qǐng)教老師,和同學(xué)交流。良好的溝通很重要。針對(duì)本次的畢業(yè)設(shè)計(jì),用我國著名的數(shù)學(xué)家的話概括一下我的感受: “科學(xué)上沒有平坦的大道,真理長河中有無數(shù)礁石險(xiǎn)灘。只有不為畏攀登的采藥者,只有不怕 巨浪的弄潮兒,才能登上高峰采得仙草,深入水底覓得驪珠?!?/p> 十、參閱教材及文獻(xiàn) 1、蔣立平編著《數(shù)字電路》.南京理工大學(xué)翻??; 2、南京理工大學(xué)電子技術(shù)中心編著.《EDA 設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)書》 南京理工大學(xué),2008 年; 3、譚會(huì)生,張昌凡.《EDA 技術(shù)及應(yīng)用》.西安電子科技大學(xué)出版社,2001年; 4、《數(shù)字電路設(shè)計(jì)及 Verilog HDL 實(shí)現(xiàn)》 西安電子科技大學(xué)出版社出版; 5、《電子線路實(shí)驗(yàn)設(shè)計(jì)與仿真講義》。第三篇:停車場(chǎng)管理系統(tǒng)需求報(bào)告
第四篇:《停車場(chǎng)管理系統(tǒng)》實(shí)驗(yàn)設(shè)計(jì)報(bào)告
第五篇:EDA設(shè)計(jì)報(bào)告