程序設計停車場管理系統匯總_第1頁
程序設計停車場管理系統匯總_第2頁
程序設計停車場管理系統匯總_第3頁
程序設計停車場管理系統匯總_第4頁
程序設計停車場管理系統匯總_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、( 2014 / 2015 學年 第 1學期)題 目:停車場管理系統專 業 組長 學號姓名 組員 學號姓名 指 導 教 師 指 導 單 位 日 期 成員分工組長()代碼部分:取車、查詢信息、修改停車費費率模塊實驗報告:測試數據和結果分析、調試過程中的問 題組員()代碼部分:管理員登陸模塊實驗報告:概要設計和課程小結組員()代碼部分:停車模塊的實現實驗報告:課程內容和要求、需求分析評分細則評分項優秀良好中等差遵守機房規章制度上機時的表現學習態度程序準備情況程序設計能力團隊合作精神課題功能實現情況算法設計合理性用戶界面設計報告書寫認真程度內容詳實程度文字表達熟練程度回答問題準確度簡短評語 教師簽名

2、:年月日評分等級備注評分等級共五種:優秀、良好、中等、及格、不及格停車場管理系統一、 課題內容和要求 停車場管理是一個計時收費系統,同時也是一個能對車位進行管理的系統,最基本的功能是實現停車、取車、查詢以及修改停車費費率等功能。同時,為了使用的方便和安全的考慮設計了管理員能對密碼進行修改的功能。在停車的功能中采用了文件流的形式,對車位、車牌號、車型都進行了保存,以便于查詢功能的實現,除此之外,也是為了能夠實現在取車模塊中利用輸入的車牌號自動計算出停車的費用。停車位第一個為空的位置,由程序查詢自動給出車位號,如果車位已滿要給出提示。 取車時,需要根據車輛停泊時間自動計算費用(半小時內以半價計算,

3、超出半小時不足一小時按一小時計算)并顯示在屏幕上,可以隨時根據車牌查詢是否入庫。可以隨時根據車位查詢該位置上的相關信息。本系統對不同車型的費率給出了默認值,管理員可以根據實際需要對費率進行修改。功能要求:用C/C+設計一個程序實現停車場管理系統,要求如下:(1) 管理人員根據口令進入系統;(2) 管理人員有權限對登陸賬號和密碼進行修改;(3) 管理車位信息(車位編號,狀態)和每小時的收費費率;(4) 停車時錄入汽車停泊信息(車牌號,車型,停泊位置,停泊開始時間);如果車位已滿要給出提示;(5) 取車時,根據車牌取,如果沒有給出提示;需要根據車輛停泊時間自動計算費用并顯示在屏幕上。(6) 管理人

4、員可以根據需要隨時更改每小時的收費費率。二、 需求分析停車場管理系統的功能框架圖如圖1所示。圖1 功能框架圖(1)系統主要包括了管理員登陸、停車操作、取車操作、信息查詢、費率修改這五大模塊,每個模塊都用用相應的函數來實現這些功能。(2)在管理員登陸模塊中,設置了三次輸入機會,用戶名和密碼事先用文檔存儲,供使用者進入系統;若管理員連續輸入密碼錯誤超過提示,則系統給出修改密碼或者退出系統的提示,這些功能在函數名為loadin()的函數中實現。(3)管理員登陸模塊結束之后便到了系統的主要界面,選擇操作1是停車模塊。在選擇停車操作之后,系統能夠實現“將第一個為空的位置,由程序查詢自動給出車位號,如果車

5、位已滿要給出提示”這一功能用函數compare()和jugement()共同實現的。進入停車模塊后,還應選擇不同的車型進行停車,這一過程會調用putcar()和gettime()函數,用來給出不同車型的費率和調用停車時的系統時間。(4)通常選擇了停車操作之后取車和查詢功能才會有意義,所以取車和查詢公共主要是使用了campare()函數,調用strcmp()字符串比較函數對輸入的車牌號和停車時的車牌號進行比較,若相同,則返回該車位,達到取車和查詢的作用。(5)不同的停車場可以根據需要修改每種車型的車輛對應的費率。這個功能在修改費率的模塊中實現。(6)根據不同的車型以及其停泊時間收費,間差乘以單價

6、就是最后收費,其中取車時,需要根據車輛停泊時間自動計算費用(半小時內以半價計算,超出半小時不足一小時按一小時計算)并顯示在屏幕上。這個功能需要調用系統時間,因此在整個程序中包含了頭文件后(#include<time.h>)利用結構這種數據類型來實現。三、概要設計1. 主要結構體為了實現停車場管理系統的停車、取車、查詢、修改功能,主要用一個while循環,通過輸入的數字選擇相應的操作。同時為了實現每個模塊的功能,引用一些相應的子函數。下面是主要結構體的流程圖: 圖2 主要結構體流程圖2. 主要函數流程圖(1) 管理員登陸模塊管理員登陸模塊是用函數loadin()來實現的,在loadi

7、n()函數中對賬號和密碼都有三次的輸入機會,用變量ai來記錄輸入的次數,當ai>=3時,進入修改密碼的界面。在修改密碼模塊了,用strcpy()函數將輸入的字符串adpassword1賦值給密碼adpassword(adpassword為全局變量,所以才能起到修改的作用)。修改完成密碼后,在loadin()函數中再次調用loadin()函數,這樣在修改密碼后就能重新回到登陸界面進行登陸,大體程序流程圖如下:圖3 管理員登陸模塊流程圖(2) 比較函數compare()在停車場管理系統的取車、查詢模塊中都需要用到輸入“車牌號判斷停車場中是否有該車”這個功能,而compare()函數就是用來實

8、現這個功能的。其大概思路是,通過輸入的字符串與系統儲存有的字符串進行比較,如果字符串相等就返回一個0,如果不相等就返回非0,而通過0和非0的控制,便能實現判斷的功能,其流程圖如下所示:圖4 字符串比較函數流程圖(3) 搜索空車位函數jugement() 對于停車操作來說,需要在所有停車位中找到第一個空車位,并返回這個車位。在該系統中,這個功能由函數jugement()來實現。設int型變量j為車位編號,利用數字positionj的值是否為1,來判斷是車位是否為空(這里是將1視為有車,0為無車)。圖5 搜索空車位函數流程圖在這個函數中還要注意:在用while循環對每個車位進行逐個判斷的時候,j一

9、定要小于停車場的總車位。除此之外,返回第一個空車位表示將要在這個車位進行停車,因此要重新將positionj的值置為1。四、源程序代碼#include <iostream>#include <string>#include <time.h> #include<fstream>using namespace std; class car public: char no10; int pos; double fee; void putcar(); void takecar(); void changefee(); ; class Time publi

10、c: int hour; int min; void getime(); ; char adpassword10="123456"char adname10="wcx"int i,poi; int position50=0;/全局變量 car carin50; Time catime50; double Fee1=6.0, Fee2=5.0, Fee3=4.0 , Fee4=3.0 ;int jugement(); int compare(); void search_no(); void search_position(); void loadin()

11、;void main()/-管理員登陸模塊-loadin();/-登陸模塊結束-int k=0;cout<<""<<endl; cout<<"請選擇:" <<"nnt-" <<"nnt1.停車操作 " <<"nnt2.取車操作 " <<"nnt3.查詢信息 " <<"nnt4.修改車費" <<"nnt5.退 出" <<

12、"nnt-nn" ofstream outfile("車輛信息.txt",ios:app);if(! outfile)cerr<<"open error!"<<endl;exit(1);while(cin>>k) if(k=1) i=jugement();/-通過jugement()函數返回第一個空的車位icout<<"-" <<endl; cout<<"t請輸入車牌號:" cin>>carini.no; /用戶

13、輸入停在第i個車位的車牌號carini.putcar(); cout<<"請選擇:" <<"nnt-" <<"nnt 1.停車操作 " <<"nnt 2.取車操作 " <<"nnt 3.查詢信息 " <<"nnt 4.修改車費 " <<"nnt 5.退 出" <<"nnt -nn"string time1;time_t t; time(&am

14、p;t); time1=ctime(&t); cout<<time1;/-導入系統時間outfile<<carini.no<<" "<<time1<<endl;continue; if(k=2) poi=compare(); carinpoi.takecar();cout<<"請選擇:" <<"nnt-" <<"nnt 1.停車操作 " <<"nnt 2.取車操作 " <&l

15、t;"nnt 3.查詢信息 " <<"nnt 4.修改車費 " <<"nnt 5.退 出" <<"nnt -nn"continue; if(k=3) int x; while(1) cout<<"請輸入數字選擇需要的操作:"<<endl; cout<<""<<endl; cout<<"nnt-" <<"nnt1.查詢車牌號" &l

16、t;<"nnt2.查詢車位" <<"nnt3.退出查詢" <<"nnt-nn" cin>>x; if(x=1) search_no(); break; else if(x=2) search_position(); break; else if(x=3) break; else cout<<"t選擇錯誤,請重新選擇:" cout<<"請選擇:" <<"nnt-" <<"nnt

17、1.停車操作 " <<"nnt 2.取車操作 " <<"nnt 3.查詢信息 " <<"nnt 4.修改車費 "<<"nnt 5.退 出" <<"nnt -nn" /outfile.close();if(k=4) carini.changefee();continue;if(k=5)exit(0);/-loadin()-void loadin()char an10,ap10; int ai=0; cout<<&qu

18、ot; -歡迎使用XX停車場管理系統-"<<endl; while(1) cout<<""<<endl;cout<<"請輸入管理員用戶名:" cin>>an; if(strcmp(adname,an) cout<<"此用戶名不存在!n" ai+;if(ai=3)exit(0);continue; else cout<<"請輸入密碼:" cin>>ap; if(!strcmp(adpassword,ap) bre

19、ak;else cout<<"密碼錯誤!n" ai+; if(ai=3)cout<<""<<endl;cout<<"密碼連續輸入錯誤3次,請重新選擇操作:"<<endl;cout<<"-"<<endl;cout<<"1.修改密碼"<<endl;cout<<"2.退出系統"<<endl;cout<<"-"<&l

20、t;endl;int k;while(cin>>k)if(k=1)cout<<"請輸入新的密碼,密碼不超過10位數:"<<endl;char adpassword110; cin>>adpassword1;strcpy(adpassword,adpassword1);cout<<"你的新密碼是:"<<endl;cout<<adpassword<<endl;loadin();break;if(k=2)exit(0);if(k!=1&&k!=2)c

21、out<<"輸入錯誤,請重新輸入:"return;continue; cout<<"登陸成功!" <<endl;/- jugement() -int jugement() /-判斷出第一個空的車位 int j=0; while(positionj=1&&j<50) j+; cout<<" 共有50個停車位,當前可使用停車位 :"<<50-j<<endl;cout<<""<<endl;cout<

22、<" 本停車場收費標準如下:"<<endl;cout<<""<<endl;cout<<" 貨車每小時"<<Fee1<<"元,客車每小時"<<Fee2<<"元,轎車每小時"<<Fee3<<"元,其它車輛每小時"<<Fee4<<"元。"<<endl;cout<<" 注:停車時間小

23、于30分鐘的按0.5個小時計算,超過30分鐘但不足1小時的按1個小時收費"<<endl;if(j<50) positionj=1; /當找到第一個空車位時(即position=0時,并且滿足車位號j<100的情況下) ,然后選擇該車位停車, /停車后將position重新置為1,表示該車位現在已經停車了。(在這種情況下表示找到空車位后就必須停在這個車位上)return j; /-compare()- int compare() char ch10; cout<<"t請輸入車牌號:" cin>>ch; for(int

24、k=0;k<50;k+) if(!strcmp(ch,carink.no) / -將輸入的車牌號與停車場上的每個位子的車輛進行比較(包括那些沒停車的車位) if(positioncarink.pos-1=1) / 在car:putcar()函數中因為要輸出車位號,所以將對象數組carink.pos變為了carink.pos+1, / 于是用數組position找已經停車的車位時要將其處理為carink.pos-1 return (carink.pos-1); break; if(k=50) return k; /- car:putcar()-void car:putcar() int t

25、; /車輛類型的變量 while(1) cout<<"請選擇車型:"<<endl;cout<<""<<endl;cout<<"nnt-" <<"nnt貨車請輸入1"<<"nnt客車請輸入2"<<"nnt轎車請輸入3"<<"nnt其他車輛請輸入4" <<"nnt-nn"cin>>t; if(t=1) cari

26、ni.fee=Fee1;break; else if(t=2) carini.fee=Fee2;break; else if(t=3)carini.fee=Fee3;break; else if(t=4)carini.fee=Fee4;break;cout<<"輸入錯誤!請重新輸入:n" if(i=50) cout<<"對不起,車位已滿!n"carini.pos=i+1; /-自動輸出車位號,數組里0表示第一位,而車位的第一位是1,所以carini.pos=i+1;cout<<"nnt-"cout&

27、lt;<"nnt已成功選擇車位!車位號是:"<<carini.pos<<endl; catimei.getime(); cout<<"nnt現在時間是:"<<catimei.hour<<":"<<catimei.min<<endl; cout<<"nnt-"<<endl; /- car:takecar()-void car:takecar() int hour1,min1; double charge;

28、 if(poi<50) positionpoi=0; /-通過取車操作后,重新將該車位設定為空車位hour1=catimepoi.hour; min1=catimepoi.min; catimepoi.getime(); hour1=catimepoi.hour-hour1; min1=catimepoi.min-min1; if(min1<30)/計算出停車時間,不足30分鐘的按30分鐘計算 charge=carinpoi.fee*hour1+carinpoi.fee*0.5; else charge=carinpoi.fee*hour1+carinpoi.fee; cout&l

29、t;<"t車費為:"<<charge<<"元.n" /計算出車費輸出 else cout<<"t無此車!n" /- Time:getime()-void Time:getime() struct tm *newtime; time_t long_time; /time_t用來定義長整型數 long_timetime( &long_time ); newtime = localtime( &long_time ); hour=newtime->tm_hour; min=ne

30、wtime->tm_min; /- search_no()- void search_no() int poi=compare(); if(poi<50) cout<<"t此車已入庫,車位為:"<<poi+1<<endl; else cout<<"t此車沒有入庫。n" /根據車牌號查詢是否入庫 /- search_positon()-void search_position() int loc;cout<<" " <<endl; cout<<

31、;"t車位號是:" /-根據車位查詢車位狀態cin>>loc; if(positionloc-1=1) cout<<"t車牌號:"<<carinloc-1.no<<endl; cout<<"t停車時間:"<<catimeloc-1.hour<<":"<<catimeloc-1.min<<endl;/停車直到現在的時間 else cout<<"t此車位無車!" /-void ca

32、r:changefee()cout<<"請選擇修改的車型:"cout<<"nnt-" <<"nnt 修改 貨車費用 請輸入1 "<<"nnt 修改 客車費用 請輸入2 "<<"nnt 修改 轎車費用 請輸入3 "<<"nnt 修改 其他費用 請輸入4 " <<"nnt 退 出 修 改 請輸入5 " <<"nnt -nn"int type;ci

33、n>>type;while(1)if(type=1)double fee1;cout<<"每小時貨車費用:"cin>>fee1;Fee1=fee1;cout<<"車費修改成功!"<<endl;break;else if(type=2)double fee2; cout<<"每小時客車費用:"cin>>fee2; Fee2=fee2;cout<<"車費修改成功!"<<endl;break; else if(ty

34、pe=3)double fee3; cout<<"每小時轎車費用:"cin>>fee3; Fee3=fee3; cout<<"車費修改成功!"<<endl; break; else if(type=4)double fee4; cout<<"每小時轎車費用:"cin>>fee4;Fee4=fee4; cout<<"車費修改成功!"<<endl;break;else if(type=5)break;cout<<

35、"請選擇:" <<"nnt-" <<"nnt 1.停車操作 " <<"nnt 2.取車操作 " <<"nnt 3.查詢信息 " <<"nnt 4.修改車費 " <<"nnt 5.退 出" <<"nnt -nn" /-程序結束-。5、 測試數據及其結果分析(1)修改密碼時密碼長度超過限制引起的錯誤圖6 修改密碼時密碼長度超過限制的錯誤登陸界面因為修改密碼的

36、時候字符串長度設置為10個字符,當密碼長度超過10位就會引起內部錯誤(字符wcx為正確的登陸賬號)。如果設置一個密碼的字符長度判斷功能的函數,能讓輸入超過十位后重新輸入,就可以解決這個問題。(2)賬號輸入錯誤引起的不能正常退出圖7 賬號輸入錯誤引起的不能正常退出的界面圖賬號連續輸入錯誤后卻進入了系統,之所以出現這個原因是因為在判斷賬號的錯誤次數的循環中沒有正常退出,代碼如下:if(strcmp(adname,an) cout<<"此用戶名不存在!n" ai+;if(ai=3)return; / 在這里只要把return改為exit(0)后就能得到正確結果cont

37、inue; 修改得到的正確結果如下圖所示:圖8 賬號輸入錯誤正常退出系統的界面圖(3) 選擇停車操作后顯示的停車費率圖9 修改停車費率前信息顯示圖剛進入系統是若沒有選擇修改車費的操作,此時顯示的費率則是系統默認的,這是由于程序里將代表四種車型的費率的變量Fee1、Fee2、Fee3、Fee4的設為了全局并且賦了初值。修改了車費費率的圖如下: 圖10 修改停車費率后信息顯示圖不足的是必須是選擇了停車操作之后車位的信息和費率才能顯示出來,實用性差了一些。六、調試過程中的問題(1).字符串比較函數strcmp()的使用在C/C+語言中,常用strcmp()函數來比較兩個字符串,一般形式為strcmp

38、(字 符串S1,字符串S2)。當S1=S2時,返回值為0,否則為非零。在管理員用戶登錄 模塊處理輸入的賬號和密碼時就使用了該功能: if(strcmp(adname,an) / an為用戶輸入的賬號 cout<<"此用戶名不存在!n" 這里在設計的時候比較容易出錯,因為若兩個字符串不相等,則strcmp()返回 的值是非零,在if條件下為真,所以才會輸出用戶名不存在,在看程序的時候很 容易會看成是兩個字符串相等后輸出用戶名不存在。在運用string類提供的strcmp(s1,s2)的函數時還需要參數s1和s2的類型, 若s1和s2的類型都char的時候,則編譯器

39、不會報錯,若s1和s2的類型都為 string的時候編譯器便會提示類型錯誤,這時候應修改為 strcmp(s1.c_strc ,s2.c_strc); 這樣才能對strcmp()函數的正確使用。 (2)continue和break的使用 在while和for的循環中,continue和break是非常常見的用來控制循環的語 句,continue和break的使用不相同而且還很容易出錯。有一種最常見的錯誤 便是非法使用,比如在一些非while、for、if 這些循環或者判斷的語句下使用, 編譯器在編譯的時候就會給出“illegal break”或者“illegal continue”這 樣的報錯

40、,這是比較容易修改的錯誤的;還有一種是比較難發現的錯誤,就是 在很多循環嵌套的時候經常會發現不知道程序跳到哪一步了。比如在“管理員 登陸”模塊的時候就出現過修改密碼后一直停在輸入賬號和密碼這個這里,在 loadin()的后面加入break語句后就能解決問題了。而這就需要用visual C+ 自帶的調試器進行調試,去發現錯誤。 調試的一般思路是在你覺得最有可能出錯的地方,或者你不確定循環是不是跳 到的地方按F9設置斷言,然后按F5進行局部調試,等到程序運行到斷言的位 置后再一步一步按F10進行判斷,就能發現哪里出錯了,這是比較可靠地判斷 出錯誤的方法。(3) Car類設計的作用在停車場管理系統中,多次調用了同一輛車的車牌號、停車費用、車位,因此 為了編程的方便,將車牌號、費用和車位這些變量設為類car的公有成員。同時還申明了car類的對象數組carin為全局變量,數組的大小表示停車位的多少,每個停車位用全局變量i來表示。這樣做的好處是使函數書寫方

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論