第一篇:數(shù)據(jù)結(jié)構(gòu) 停車場管理 完整版 實習(xí)報告
實習(xí)報告
題目:停車場管理
一. 需求分析
1. 用棧來表示停車場,用隊列來表示停車道。
2. 用戶需輸入車輛的必要信息,如車輛的到達(dá)或離開,汽車牌號以及到達(dá)或離去的時刻。停車場的容量及單位時間的停車費(fèi)由編程序者自行設(shè)置,結(jié)構(gòu)需輸出車輛停車所需繳納的費(fèi)用。
3. 本程序要求對車輛的動態(tài)能夠輸出具體的信息內(nèi)容,包括停車或離開的時間,位置,及所需繳納的停車費(fèi)。4. 測試數(shù)據(jù)為:
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á),’D’表示離去,’E’表示輸入結(jié)束。5.程序執(zhí)行的命令為:
1.創(chuàng)建棧和隊列。2.對車輛的行為進(jìn)行相應(yīng)的處理。3.輸出車輛的信息。
二. 概要設(shè)計
1.設(shè)定棧的抽象數(shù)據(jù)類型定義:
ADT Stack{
數(shù)據(jù)對象:D={ai|ai屬于Elem,i=1,2……,n, n>=0}
數(shù)據(jù)關(guān)系:R1={
基本操作:
initStack(&S)
操作結(jié)果:構(gòu)造一個空棧S.pop(&S,&e)
初始條件:棧S已存在。
操作結(jié)果:刪除S的棧頂元素,并以e返回其值。
push(&S,&e)
初始條件:棧S已存在。
操作結(jié)果:在棧S的棧頂插入新的棧頂元素e。
lengthstack(S)
初始條件:棧S已存在。
操作結(jié)果:返回S中的元素個數(shù),即棧的長度。}ADT Stack;2.設(shè)定隊列的抽象數(shù)據(jù)類型定義:
ADT Queue{
數(shù)據(jù)對象:D={ai| ai屬于Elem, i=1,2,……,n, n>=0}
數(shù)據(jù)關(guān)系:R1={
基本操作:
initqueue(&Q)
操作結(jié)果:構(gòu)造一個空隊列Q.enqueue(&Q, e)
初始條件:隊列Q已存在。
操作結(jié)果:插入元素e為Q的新的隊尾元素。
dequeue(&Q, &e)
初始條件:Q為非空隊列。
操作結(jié)果:刪除Q的對頭元素,并用e返回其值。
Lengthqueue(Q)
初始條件:隊列Q已存在。
操作結(jié)果:返回Q的元素個數(shù),即隊列的長度。}ADT Queue 3.本程序主要包括三個模塊
1.主程序模塊;
int main(){
初始化;
do{
接受命令;
處理命令;
}while(命令!=退出); } 2.處理車輛到達(dá)模塊; 3.處理車輛離開模塊;
各模塊之間的調(diào)用關(guān)系如下:
處理車輛到達(dá)模塊?主程序模塊?處理車輛離開模塊
三. 詳細(xì)設(shè)計
設(shè)計程序如下:
#include
//將停車場的容量設(shè)為2; #define cost 10 //將單位時間的停車費(fèi)設(shè)為10,車道里不收費(fèi);
#define OVERFLOW-2
#define ERROR 0 //分配棧的存儲空間失??; using namespace std;
typedef struct Elem {//定義元素數(shù)據(jù)結(jié)構(gòu)類型
int carnum;int time;}Elem;
typedef struct QNode {//隊列
struct QNode *next;Elem Qelem;}QNode,*QueuePtr;
typedef struct { QueuePtr front;//隊頭指針
QueuePtr rear;//隊尾指針 }LinkQueue;
void initqueue(LinkQueue &Q){//構(gòu)造一個空隊列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(OVERFLOW);Q.front->next=Q.rear->next=NULL;}
void enqueue(LinkQueue &Q,int carnum,int time){//入隊操作
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));p->Qelem.carnum=carnum;p->Qelem.time=time;p->next=NULL;Q.rear->next=p;Q.rear=p;} int lengthqueue(LinkQueue Q){ int i=0;QueuePtr p;p=Q.front->next;while(p!=Q.rear){
i++;
p=p->next;} i++;return i;} void dequeue(LinkQueue &Q,Elem &e){//從對頭離隊操作,并返回其值 QueuePtr p=(QueuePtr)malloc(sizeof(QNode));if(Q.front==Q.rear)
cout<<“車道中沒有車輛!”< p=Q.front->next; e=p->Qelem; Q.front->next=p->next; if(Q.rear==p)Q.rear=Q.front; free(p);} } typedef struct { Elem *base;Elem *top;int stacksize;}Sqstack;void initStack(Sqstack &S){//創(chuàng)建一個空棧 S.base=(Elem*)malloc(n*sizeof(Elem));if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=n;} int push(Sqstack &S,Elem &e)//插入新的元素 { Elem *temp;if(S.top-S.base==S.stacksize) return 1;else { temp=S.top; temp->carnum=e.carnum; temp->time=e.time; S.top++; return 0;} } int lengthstack(Sqstack S){//當(dāng)前棧的長度 return S.top-S.base;} int pop(Sqstack &S,Elem &e){ //刪除棧頂元素,并返回其值 if(S.top==S.base)return ERROR;e=*--S.top;return 1;} void carin(Sqstack &S,LinkQueue &Q,Elem car){ int k=0;//輸入數(shù)據(jù)正確 QueuePtr r;Elem *temp;temp=S.base;while(temp!=S.top)/在棧中尋找是否有同一編號的車; { if(temp->carnum==car.carnum) { cout<<“該車號在停車場中已存在,請重新輸入!”< k=1;//找到了有同一編號的車 break; } temp++;} if(k==0&&Q.front!=Q.rear){//在棧中未找到,從隊列中查找 r=Q.front->next;//隊頭 while(r&&r->Qelem.carnum!=car.carnum) {r=r->next;} if(r&&r->Qelem.carnum==car.carnum){cout<<“該車號在車道中已存在,請重新輸入!”< { if(S.top-S.base!=S.stacksize)//說明棧未滿,{ S.top->carnum=car.carnum; S.top->time=car.time; S.top++; cout<<“請進(jìn)入停車場”< } else { enqueue(Q,car.carnum,car.time); cout<<“請便車道”< } } } void carleave(Sqstack &S,LinkQueue &Q,Elem car){ int ture=0;//在棧中沒有找到與要離開的車 Elem e,em,*temp; QueuePtr p,r;temp=S.base;if(ture==0){ while(temp!=S.top)//先在棧中尋找; { if(temp->carnum==car.carnum) { int temp_cost; temp_cost=(car.time-temp->time)*cost; ture=1;//在棧中找到 cout<<“您的停車時間為”< break; } temp++; } if(ture==1) //備用棧 { Sqstack spear; initStack(spear); while(S.top!=temp+1)//先在棧中尋找; { pop(S,em); push(spear,em); } pop(S,*temp); if(spear.top!=spear.base) { while(spear.top!=spear.base) { pop(spear,em); push(S,em); } } } if(ture==1&&Q.front!=Q.rear)//棧中有車離開,將隊列中的車進(jìn)入棧中 { dequeue(Q,e); //離隊,并返回數(shù)據(jù)e S.top->carnum=e.carnum;S.top->time=car.time;S.top++;cout< } } if(ture==0&&Q.front!=Q.rear)//棧中沒找到要離開的車 { p=Q.front; r=Q.front->next;//隊頭 while(r&&r->Qelem.carnum!=car.carnum) { p=r; r=r->next; } if(r&&r->Qelem.carnum==car.carnum) ture=2;//在隊列中找到要離開的車 if(r&&r->Qelem.carnum==car.carnum) { ture=2; cout<<“便道”< p->next=r->next; free(r); } }//直接從隊列離開 if(ture==0) cout<<“沒有該輛車!”< char c; int j=0,temp_time,i=1;//i==0,判斷臨時記錄時間的temp_time應(yīng)該去該次的值,還是上次的值。j==0,表示第一次輸入數(shù)據(jù),不需要檢測數(shù)據(jù)是否正確 LinkQueue Q;Sqstack S;Elem car;initqueue(Q); initStack(S); cout<<“請輸入車輛信息(到達(dá)離開或退出標(biāo)志A D E,車牌號,當(dāng)前時間)”< while(cin>>c>>car.carnum>>car.time) { if(j==1) { if(S.top==S.base) cout<<“停車場中沒有車!”< else { if(car.time { cout<<“您輸入的時間有誤,請重新輸入!”< i=0;//temp_time還是記錄上次的值 } else { temp_time=car.time; i=1; } } if(i==1)//正確的數(shù)據(jù) { if(c=='A')//到達(dá) carin(S,Q,car); else if(c=='D') { if(S.top==S.base); else carleave(S,Q,car); } } j=1; } if(j==0)//第一次輸入數(shù)據(jù)不需要檢測 { if(c=='A')//到達(dá) carin(S,Q,car); else if(c=='D') { if(S.top==S.base) cout<<“停車場中沒有車!”< else carleave(S,Q,car); } j=1; temp_time=car.time; } if(c=='E') { cout<<“輸入結(jié)束!”< break; } } return 0;} 四. 調(diào)試分析 1.本次作業(yè)是設(shè)計停車場的管理系統(tǒng),就需要判斷車牌號,及時間的輸入的正確性,輸入的數(shù)據(jù)有比較嚴(yán)格的要求,必須符合實際。因此對數(shù)據(jù)需要多次判斷。2.處理車輛到達(dá)模塊和處理車輛離開模塊其空間復(fù)雜度為O(m*n);3.本程序循環(huán)用的很多,找車,排隊,等等。4.主程序設(shè)計的有點(diǎn)亂。 五 用戶手冊 1.運(yùn)行,按屏幕提示輸入車輛信息; 2.回車顯示車輛在停車場或停車道的信息; 3.輸入E,則退出。 六. 測試結(jié)果 七 附錄 #include 實習(xí)報告 題目:停車場管理 一. 需求分析 1. 用棧來表示停車場,用隊列來表示停車道。 2. 用戶需輸入車輛的必要信息,如車輛的到達(dá)或離開,汽車牌號以及到達(dá)或離去的時刻。停車場的容量及單位時間的停車費(fèi)由編程序者自行設(shè)置,結(jié)構(gòu)需輸出車輛停車所需繳納的費(fèi)用。 3. 本程序要求對車輛的動態(tài)能夠輸出具體的信息內(nèi)容,包括停車或離開的時間,位置,及所需繳納的停車費(fèi)。4. 測試數(shù)據(jù)為: 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á),’D’表示離去,’E’表示輸入結(jié)束。5.程序執(zhí)行的命令為: 1.創(chuàng)建棧和隊列。2.對車輛的行為進(jìn)行相應(yīng)的處理。3.輸出車輛的信息。 二. 概要設(shè)計 1.設(shè)定棧的抽象數(shù)據(jù)類型定義: ADT Stack{ 數(shù)據(jù)對象:D={ai|ai屬于Elem,i=1,2……,n, n>=0} 數(shù)據(jù)關(guān)系:R1={ 基本操作: InitStack(&S) 操作結(jié)果:構(gòu)造一個空棧S.pop(&S,&e) 初始條件:棧S已存在。 操作結(jié)果:刪除S的棧頂元素,并以e返回其值。 push(&S,&e) 初始條件:棧S已存在。 操作結(jié)果:在棧S的棧頂插入新的棧頂元素e。 EmptyStack(S) 初始條件:棧S已存在。 操作結(jié)果:若棧為空,則返回TRUE,否則,返回FALSE }ADT Stack;2.設(shè)定隊列的抽象數(shù)據(jù)類型定義: ADT Queue{ 數(shù)據(jù)對象:D={ai| ai屬于Elem, i=1,2,……,n, n>=0} 數(shù)據(jù)關(guān)系:R1={ 基本操作: InitQueue(&Q) 操作結(jié)果:構(gòu)造一個空隊列Q.Append(&Q, e) 初始條件:隊列Q已存在。 操作結(jié)果:插入元素e為Q的新的隊尾元素。 Remove(&Q, &e) 初始條件:Q為非空隊列。 操作結(jié)果:刪除Q的對頭元素,并用e返回其值。 EmptyQueue(Q) 初始條件:隊列Q已存在。 操作結(jié)果:若隊列為空,則返回TRUE,否則,返回FALSE }ADT Queue 3.本程序主要包括三個模塊 1.主程序模塊; int main(){ 初始化; do{ 接受命令; 處理命令; }while(命令!=退出); } 2.處理車輛到達(dá)模塊; 3.處理車輛離開模塊; 各模塊之間的調(diào)用關(guān)系如下: 處理車輛到達(dá)模塊?主程序模塊?處理車輛離開模塊 三. 詳細(xì)設(shè)計 設(shè)計程序如下: 1.棧的頭文件 #ifndef _SQSTACK_H_ #define _SQSTACK_H_ struct Car { int plate, arrive_t;};class SqStack { public: int top;Car *base;int size;void InitStack(int m=100);bool EmptyStack()const;bool Push(Car &c);bool Pop(Car &c);};void SqStack::InitStack(int n){ base = new Car[n];top =-1;size = n;} bool SqStack::EmptyStack()const { if(top ==-1) return true;else return false;} bool SqStack::Push(Car &c){ if(top == sizec.arrive_t;if(timelong < 0){ cout << “the input is false,please do it again”< packing.Push(c); while(!temp.EmptyStack()) { temp.Pop(c); packing.Push(c); } return 0;} cout << “car ” << pla << “ was departed from packing lot” << endl;cout << “停留時間:” << timelong << endl;cout << “繳納金額:” << timelong*price << endl;while(!temp.EmptyStack()){ temp.Pop(c); packing.Push(c);} if(!sevice_road.EmptyQueue()) { sevice_road.Remove(c); map[c.plate] = 0; c.arrive_t = tim; packing.Push(c); cout << “car ” << c.plate << “ in packing lot” << endl; } } return 0;} int main(){ cout << “請輸入停車場規(guī)?!?<< endl;cout << “xxxxxxxxxx” << endl;int n;cin >> n;cout << “xxxxxxxxxx” << endl;SqStack packing, temp;LinkQueue sevice_road;packing.InitStack(n);temp.InitStack();sevice_road.InitQueue();cout << “請輸入指令:A-arrive、D-depart、E-exit cout << ”xxxxxxxxxx“ << endl;char command;cin >> command;while(command!= 'E'){ if(command == 'A') { Arrive(packing, sevice_road); cout << ”xxxxxxxxxx“ << endl; } if(command == 'D') { Depart(packing, temp, sevice_road); cout << ”xxxxxxxxxx“ << endl; } cin >> command;} } 車牌號時間” << endl; 四. 調(diào)試與驗收 1.本次作業(yè)是設(shè)計停車場的管理系統(tǒng),就需要判斷車牌號,及時間的輸入的正確性,輸入的數(shù)據(jù)有比較嚴(yán)格的要求,必須符合實際。因此對數(shù)據(jù)需要多次判斷。2.處理車輛到達(dá)模塊和處理車輛離開模塊其空間復(fù)雜度為O(m*n);3.本程序循環(huán)用的很多,找車,排隊,等等。 4.在驗收時,老師提出一些當(dāng)輸入為不正常輸入的時候的情況,而我沒有考慮到,所以又做了一定的修改。 5.驗收時,老師提到所加map破壞了程序整體結(jié)構(gòu)的完好性,是有待改進(jìn)的地方。 五 用戶手冊 1.按屏幕提示輸入停車場規(guī)模和車輛信息; 2.回車顯示車輛在停車場或停車道的信息; 3.輸入E退出。 六. 測試結(jié)果 七 附錄 源程序文件名清單: LinkQueue.cpp LinkQueue.h SqStack.cpp SqStack.h 停車場管理.cpp 課 程 設(shè) 計 報 告 課程名稱 數(shù)據(jù) 結(jié)構(gòu) 題 目 停車場管理 學(xué)生姓名 班級/學(xué)號 191103 一、需求分析 設(shè)停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供 汽車進(jìn)出。汽車在停車場內(nèi)按車輛到達(dá)時間的先后順序,依次由北向南排列(大門在最南端),若停車場內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場內(nèi)某輛車要離開時,在它之后進(jìn)入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進(jìn)入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費(fèi)用。試為停車場編制按上述要求進(jìn)行管理的模擬程序。 【測試數(shù)據(jù)】 設(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á);’D’表示離去;’E’表示輸入結(jié)束。概要設(shè)計 以棧模擬停車場,以隊列模擬車場外的便道。棧以順序結(jié)構(gòu)實現(xiàn)。隊列以鏈表結(jié)構(gòu)實現(xiàn)。每一組輸入數(shù)據(jù)包括:汽車“到達(dá)”或“離去”信息、汽車牌照號碼以及到達(dá)或離去的時刻。 輸出信息:若是車輛到達(dá),則輸出汽車在停車場內(nèi)或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內(nèi)停留的時間和應(yīng)交納的費(fèi)用(在便道上停留的時間不收費(fèi))。 二、詳細(xì)設(shè)計 三、程序設(shè)計 1.數(shù)據(jù)結(jié)構(gòu)設(shè)計 /*棧,模擬停車場*/ typedef struct Car1 { //車 int number;//汽車車號 int ar_time;//汽車到達(dá)時間 }CarNode; typedef struct { //停車場 CarNode *base;//停車場的堆棧底 CarNode *top;//停車場的堆棧頂 int stacksize;}Park; /*隊列,模擬便道*/ typedef struct Car2 { //車 int number;//汽車車號 int ar_time;//汽車到達(dá)時間 struct Car2 *next;}*CarPtr; typedef struct { //便道 CarPtr front;//便道的隊列的對頭 CarPtr rear;//便道的隊列的隊尾 int length;}Shortcut;2.程序設(shè)計 主函數(shù)中包括3個子函數(shù),A(arrive),D(depart),E(end) (1)輸入車輛數(shù)據(jù):A為到達(dá),D為離去,E為結(jié)束程序。 (2)接著輸入車輛的牌照信息 (3)若為到達(dá)的車輛,輸入進(jìn)場信息,若為離去的車輛,輸入離場信息。(4)若車輛到達(dá),可得到車輛的停放位置信息,若車輛離去,可得到車輛的停放時間(在便道上的停放時間除外),以及應(yīng)該交納的費(fèi)用。 (5)本程序不斷循環(huán)要求輸入車輛信息,直到輸入的車輛數(shù)據(jù)為E時,程序結(jié)束。 四、調(diào)試分析 a、一開始在調(diào)試程序時遇到了內(nèi)存錯誤,經(jīng)過DEBUG,找到了引起內(nèi)存錯誤的原因:即在建立隊頭指針與隊尾指針時沒有對指針進(jìn)行初始化(沒有為指針動態(tài)分配空間)。問題得到解決。 b、本程序中:車輛到達(dá),離去時的時間復(fù)雜度均為:O(n)。本程序空間復(fù)雜度為:O(n) 五、使用說明和測試結(jié)果 1.使用說明:用戶按照屏幕所顯示的提示來選擇需要進(jìn)行操作 2、測試結(jié)果: 測試結(jié)果滿足題目要求,程序無錯誤。 六、心得體會 通過此實驗,加深了我對數(shù)據(jù)結(jié)構(gòu)這門課的理解,真正運(yùn)用了知識。將理論與現(xiàn)實完美的聯(lián)系在了一起。增強(qiáng)了動手能力,對今后的工作學(xué)習(xí)都有很大的幫助。單調(diào)的看書本沒有太大的作用,只有去編程才能理解究竟學(xué)習(xí)的作用。同時,編程過程中遇到過各種各樣的問題,與同學(xué)討論,與老師交流。鍛煉了我的協(xié)做能力與克服困難的能力。編程也極大的提高了我的學(xué)習(xí)積極性。 七、附錄 #include /*棧,模擬停車場*/ typedef struct Car1 { //車 int number;//汽車車號 int ar_time;//汽車到達(dá)時間 }CarNode; typedef struct { //停車場 CarNode *base;//停車場的堆棧底 CarNode *top;//停車場的堆棧頂 int stacksize; }Park; /*隊列,模擬便道*/ typedef struct Car2 { //車 int number;//汽車車號 int ar_time;//汽車到達(dá)時間 struct Car2 *next;}*CarPtr; typedef struct { //便道 CarPtr front;//便道的隊列的對頭 CarPtr rear;//便道的隊列的隊尾 int length;}Shortcut;/*初始化停車場*/ Status InitStack(Park &P){ P.base=(CarNode*)malloc(SIZE*sizeof(Car1)); if(!P.base)exit(-2); P.top=P.base; P.stacksize=0; return 1;} Status Push(Park &P,CarNode e){//車進(jìn)入停車場 *P.top++=e; ++P.stacksize; return 1;} Status Pop(Park &P,CarNode &e){//車離開停車場 if(P.top==P.base) printf(“停車場為空”); else { e=*--P.top; --P.stacksize; } return 1;} /*初始化便道*/ Status InitQueue(Shortcut &S){ S.front=S.rear=(CarPtr)malloc(sizeof(Car2)); if(!S.front||!S.rear)exit(-2); S.front->next=NULL; S.length=0; return 1;} Status EnQueue(Shortcut &S,int number,int ar_time){//車進(jìn)入便道 CarPtr p; p=(CarPtr)malloc(sizeof(Car2)); if(!p)exit(-2); p->number=number; p->ar_time=ar_time; p->next=NULL; S.rear->next=p; S.rear=p; ++S.length; return 1;} Status DeQueue(Shortcut &S,CarPtr &w){//車離開便道 if(S.length == 0) printf(“通道為空”); else { w = S.front->next; S.front->next=S.front->next->next; --S.length; } return 1;} Status Arrival(Park &P,Shortcut &S){//對進(jìn)站車輛的處理 int number,ar_time; printf(“請輸入車牌號:”); scanf(“%d”,&number); printf(“進(jìn)場的時刻:”); scanf(“%d”,&ar_time); if(P.stacksize { CarNode c; c.number=number; c.ar_time=ar_time; Push(P,c); printf(“請將車停在第%d號車道。n”,P.stacksize); } else { EnQueue(S,number,ar_time); printf(“停車場已滿,請暫時停在便道的第%d個位置。n”,S.length); } return 1;} Status Leave(Park &P,Park &P1,Shortcut &S){//對離站車輛的處理 int number,le_time,flag=1,money,ar_time; printf(“請輸入車牌號:”); scanf(“%d”,&number); printf(“出場的時刻:”); scanf(“%d”,&le_time); CarNode e,m; CarPtr w; while(P.stacksize) { Pop(P,e); if(e.number==number) { flag=0; money=(le_time-e.ar_time)*2; ar_time=e.ar_time; break; } Push(P1,e); } while(P1.stacksize) { Pop(P1,e); Push(P,e); } // 車從停車場中出 if(flag == 0) { if(S.length!=0) { DeQueue(S,w); m.ar_time=le_time; m.number=w->number; Push(P,m); free(w); printf(“車牌號為%d的車已由便道進(jìn)入停車場n”,m.number); } printf(“停車費(fèi)為%d, 占用車位數(shù)為%dn”,money,P.stacksize); } else { printf(“停車場不存在牌號為%d的車n”, number); } return 1;} /*主函數(shù)*/ int main(){ int m=1; char flag;//選項 Park P,Q; Shortcut S;InitStack(P);InitStack(Q);InitQueue(S); while(m) { printf(“n 停車場管理程序 n”); printf(“A 汽車進(jìn)車場 D 汽車出車場 E 退出程序n”); printf(“請選擇(A,D,E): ”); scanf(“%c”,&flag); switch(flag) { case 'A': case 'a': Arrival(P,S);break;//車進(jìn)入停車場 case 'D': case 'd': Leave(P,Q,S);break;//車離開停車場 case 'E': case 'e': m=0; break; default: printf(“Input error!n”); break; } while(flag!= 'n') scanf(“%c”,&flag); } } 停車場管理系統(tǒng) ——數(shù)據(jù)結(jié)構(gòu)課程設(shè)計程序設(shè)計書 小組成員: 彭路 20131344031 崔琦 20131344028 徐佳 20131344027 范福龍 20121344024 班級 : 13軟件工程1班 時間:2014.12.22 目錄 一、程序設(shè)計目標(biāo) 二、問題描述 三、需求分析 四、概要設(shè)計 五、詳細(xì)設(shè)計 六、源程序清單 七、軟件說明書 八、測試報告 九、課程設(shè)計總結(jié) 一、程序設(shè)計目標(biāo) 本管理程序由c/c++語言完成,實現(xiàn)了對停車場收費(fèi)問題的處理。本程序保證了程序的健壯性和操作性,在閱讀過使用說明書之后可以輕松使用。本管理系統(tǒng)假設(shè)車輛在停車場時一直有人在駕駛,或者說停車場的每塊停車位均可智能移動。并假設(shè)車輛進(jìn)出場耗時不計,且時間均為整數(shù)類型。最后自動或者人工完成收費(fèi)。 二、問題描述 設(shè)停車場內(nèi)只有一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進(jìn)出。汽車在停車場內(nèi)按車輛到達(dá)時間的先后順序,依次由北向南排列(大門在最南端,最先到達(dá)的第一輛車停放在車場的最北端),若車場內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場內(nèi)某輛車要離開時,在它之后開入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其它車輛再按原次序進(jìn)入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費(fèi)用。試為停車場編制按上述要求進(jìn)行管理的模擬程序。 三、需求分析 根據(jù)問題描述,可把本停車場抽象成一個棧存儲類型s1,需要輸入最大停車容量n。每當(dāng)輸入’A’時即為有車輛申請進(jìn)入停車場操作,此時需要判斷停車場是否有空位,如果有空位,那么這輛車可以進(jìn)入停車場,即為執(zhí)行一次壓棧操作(push),并記錄進(jìn)入停車場的時間t1,并輸出位置p1;如果停車場沒有空位,那么這輛車在門外便道等候,并輸出位置p2。根據(jù)問題描述,可以把此門外便道抽象成一個隊列存儲類型q,而每有一輛車進(jìn)入門外便道,即相當(dāng)于進(jìn)行一次插入隊列操作(push)。每當(dāng)輸入’D’時即為有車輛申請離開停車場操作,此時需要判斷該車輛在停車場的位置。如果該車位于停車場最外側(cè)即相當(dāng)于棧頂,那么該車可以直接批準(zhǔn)離開并根據(jù)輸入的離開時間t2計算出停車時間t2-t1,根據(jù)該車本次停車時間完成收費(fèi)后即可成功駛出停車場,即相當(dāng)于成功彈出棧頂元素(pop);如果該車沒有位于停車場最外側(cè),事實上,這也是大多數(shù)的情況,那么需要將該車外側(cè)的車依次(即為擋路的車)移動進(jìn)一個臨時停車場,根據(jù)問題描述,可以將該臨時停車場抽象成另一個棧存儲類型s2,那么此次移動操作相當(dāng)于將棧中某元素以上的元素依次壓入另一個棧(push)。當(dāng)申請離開的車駛出停車場后,在臨時停車場的車輛依次進(jìn)入停車場,此操作相當(dāng)于將棧s2內(nèi)元素依次彈出棧(pop)并壓入棧s1(push)。此時判斷門外便道上有無等待進(jìn)入停車場的車輛,如果有的話,門外便道上第一輛車可以進(jìn)入停車場,并記錄進(jìn)入時間t1,此次操作相當(dāng)于取出隊列q的隊首元素并將其壓入棧s1中。而輸入’E’時,即退出系統(tǒng)。至此,所有分析結(jié)束。 四、概要設(shè)計 根據(jù)需求分析,解決此問題需要構(gòu)建一個Cars類型的結(jié)構(gòu)體,構(gòu)建一個CarNode類型的節(jié)點(diǎn)結(jié)構(gòu)體以構(gòu)建SQueue類型的隊列結(jié)構(gòu)體,并需要構(gòu)建一個SQstack類型的棧結(jié)構(gòu)體。接下來,分別定義隊列和棧的各項基本操作函數(shù)。最后,完成菜單函數(shù)以實現(xiàn)各項操作。 五、詳細(xì)設(shè)計 本程序定義了三個頭文件,manager_cars.h、manager_stack.h、manager_queue.h。分別實現(xiàn)了Cars類型的結(jié)構(gòu)體、SQueue類型的隊列結(jié)構(gòu)體、SQstack類型的棧結(jié)構(gòu)體以及隊列的相關(guān)操作函數(shù)和棧的相關(guān)操作函數(shù)。具體如下: 1、manager_cars.h sq->lastCar=car;sq->firstCar->nextCar=NULL;sq->length=0;} //進(jìn)入隊列操作 void enterSQueue(SQueue *sq,int num,int t){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));car->headCar.condition='D';car->headCar.number=num;car->headCar.time=t;car->headCar.position=2; car->nextCar=NULL;sq->lastCar->nextCar=car;sq->lastCar=car;sq->length++;} //出隊列操作 void exceedSQueue(SQueue *sq){ if(sq->firstCar==sq->lastCar) return;CarNode *car=(CarNode *)malloc(sizeof(CarNode));car=sq->firstCar->nextCar;sq->firstCar->nextCar=car->nextCar;sq->length--;if(sq->lastCar==car) sq->lastCar=sq->firstCar;free(car); } //檢測隊列存在 int SQueueEmpty(SQueue sq){ if(sq.firstCar==sq.lastCar) return 1;else return 0;} //獲取隊首元素 void getSQueue(SQueue sq,Cars *e){ if(sq.firstCar==sq.lastCar) return;*e=sq.firstCar->nextCar->headCar;S.base;} extern int GetTop(SQstack S,Cars *e)//若棧不為空,則用e返回S的棧頂元素,并返回OK;否則返回ERROR { if(S.top == S.base)return 0; *e = *(S.top-1); return 1; } extern int Push(SQstack*S,Cars e)//插入元素e為新的棧頂元素 { if(S->top cout<<“請正確輸入Y或N:”< scanf(“%c”,&flag); getchar();} while(flag=='Y'){ flag='C'; Cars car; SQstack park;//定義棧并初始化 InitStack(&park); SQueue street;//定義隊列并初始化 setSQueue(&street); cout<<“請輸入本停車場最多可提供的車位數(shù):”; scanf(“%d”,&maxNum); getchar(); cout<<“請輸入每小時停車費(fèi):”; cin>>Pprice; cout< cout<<“請輸入到達(dá)(A)/離開(D)信息,車牌號,時間(格式為A 1 5):”; cin>>car.condition>>car.number>>car.time; //scanf(“%c %d %d”,&car.condition,&car.number,&car.time); //getchar(); while(car.condition!='E'&&car.number!=0&&car.time!=0) { switch(car.condition) { case 'A': { enterPark(car,park,street); break; } case 'D': { int lasttime; lasttime=outOfPark(car,park,street,car.number,car.time); cout< cout<<“此車在停車場停留了”< } default :cout<<“請輸入正確的格式!”< } cin>>car.condition>>car.number>>car.time; //scanf(“%c %d %d”,&car.condition,&car.number,&car.time); Cars headCar;struct CarNode *nextCar;}CarNode; typedef struct { CarNode *firstCar;CarNode *lastCar; int length;}SQueue;//建隊列鏈表 void setSQueue(SQueue *sq){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));sq->firstCar=car;sq->lastCar=car;sq->firstCar->nextCar=NULL;sq->length=0;} //進(jìn)入隊列操作 void enterSQueue(SQueue *sq,int num,int t){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));car->headCar.condition='D';car->headCar.number=num;car->headCar.time=t;car->headCar.position=2; car->nextCar=NULL;sq->lastCar->nextCar=car;sq->lastCar=car;sq->length++;} //出隊列操作 void exceedSQueue(SQueue *sq){ if(sq->firstCar==sq->lastCar) return;CarNode *car=(CarNode *)malloc(sizeof(CarNode));car=sq->firstCar->nextCar;sq->firstCar->nextCar=car->nextCar;sq->length--;if(sq->lastCar==car) sq->lastCar=sq->firstCar;free(car); } //檢測隊列存在 int SQueueEmpty(SQueue sq){ if(sq.firstCar==sq.lastCar) return 1;else return 0;} //隊首元素 void getSQueue(SQueue sq,Cars *e){ if(sq.firstCar==sq.lastCar) return;*e=sq.firstCar->nextCar->headCar;} //隊列長度 int SQueueLength(SQueue sq){ int len=0;if(sq.firstCar!=sq.lastCar)len=sq.length;return len;} #endif manager_stack.h #include #ifndef manager_stack_h #define manager_stack_h #define STACK_INIT_SIZE 100 //棧的存儲空間初始分配量 #define STACKINCREMENT 10 //棧的存儲空間分配增量 typedef struct SQstack //棧的結(jié)構(gòu)體 { Cars * base;Cars * top;int stacksize;S.base;} extern int GetTop(SQstack S,Cars *e)//若棧不為空,則用e返回S的棧頂元素,并返回OK;否則返回ERROR { if(S.top == S.base)return 0; *e = *(S.top-1); return 1; } extern int Push(SQstack*S,Cars e)//插入元素e為新的棧頂元素 { if(S->top-S->base >= S->stacksize) { S->base =(Cars *)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(Cars)); if(!S->base)return 0; S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = e; return 1; } extern int Pop(SQstack *S,Cars *e)//若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK,否則返回ERROR { if(S->top == S->base)return 0; *e = *--S->top; return 1; } #endif 七、軟件說明書 1、打開系統(tǒng),輸入Y進(jìn)入管理系統(tǒng)。 2、接下來按提示輸入停車場的可供使用的車位數(shù)。 3、按提示輸入該停車場每小時收費(fèi)標(biāo)準(zhǔn)。 4、按提示輸入到達(dá)后者離開信息,例如A 1 5,D 1 10。 5、輸入E 0 0并輸入N,退出系統(tǒng)。 八、測試報告 1、如圖,當(dāng)打開系統(tǒng)時出現(xiàn)此界面,輸入Y為進(jìn)入系統(tǒng),輸入N為退出系統(tǒng)。 2、如圖,如果輸入錯誤會提示出錯,并重新輸入。 3、如圖,輸入Y后,按提示依次輸入停車場可提供的最大車位數(shù)和每小時的停車費(fèi)。 4、如圖,輸入A 1 5后,提示進(jìn)入停車場的信息。 5、如圖,輸入A 2 10,A 3 15后,依次顯示提示信息。 6、如圖,輸入D 1 20后,分別顯示便道進(jìn)入停車場的3號車和1號車的收費(fèi)情況。 7、如圖,輸入E 0 0,再按提示輸入N,即可退出系統(tǒng)。 九、課程設(shè)計總結(jié) 通過團(tuán)隊對該問題分析,互相補(bǔ)充了觀點(diǎn),增強(qiáng)了對該題目正確認(rèn)識。隊員們進(jìn)行了縝密的需求分析,并分工完成各文件和函數(shù)的編寫。隊員們紛紛表示,這絕對是一個以前不能想象到的任務(wù)。通過對該系統(tǒng)的編寫、實現(xiàn),著實增強(qiáng)了隊員們的團(tuán)隊意識以及對數(shù)據(jù)結(jié)構(gòu)的進(jìn)一步的理解。當(dāng)程序成功運(yùn)行后,隊員們都非常興奮,雖然本系統(tǒng)仍有瑕疵,但是可以說這是隊員們的心血。 0 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計的實習(xí)報告怎么寫呀,請求做過課設(shè)的同學(xué)發(fā)一篇范文過來謝謝-_-規(guī)范實習(xí)報告的開頭應(yīng)給出題目、班級、姓名、學(xué)號和完成日期,并包括以下七個內(nèi)容: 1、需求分析以無歧義的陳述說明程序設(shè)計的任務(wù),強(qiáng)調(diào)的是程序要做什么?明確規(guī)定:(1)輸入的形式和輸入值的范圍;(2)輸出的形式;(3)程序所能達(dá)到的功能;(4)測試數(shù)據(jù):包括正確地輸入及其輸出結(jié)果和含有錯誤的輸入及其輸出結(jié)果,數(shù)據(jù)結(jié)構(gòu)實習(xí)報告。 2、概要設(shè)計說明本程序中用到的所有抽象數(shù)據(jù)類型的定義、主程序的流程以及各程序模塊之間的層次(調(diào)用)關(guān)系。 3、詳細(xì)設(shè)計實現(xiàn)概要設(shè)計中定義的所有數(shù)據(jù)類型,對每個操作只需要寫出偽碼算法;對主程序和其他模塊也都需要寫出偽碼算法(偽碼算法達(dá)到的詳細(xì)程度建議為:按照偽碼算法可以在計算機(jī)鍵盤直接輸入高級程序設(shè)計語言程序);畫出函數(shù)的調(diào)用關(guān)系圖。 4、調(diào)試分析內(nèi)容包括:(1)調(diào)試過程中遇到的問題是如何解決的以及對設(shè)計與實現(xiàn)的回顧討論和分析;(2)算法的時空分析(包括基本操作和其他算法的時間復(fù)雜度和空間復(fù)雜度的分析)和改進(jìn)思想;(3)經(jīng)驗和體會等,實習(xí)報告《數(shù)據(jù)結(jié)構(gòu)實習(xí)報告》。 5、用戶使用說明說明如何使用你編寫的程序,詳細(xì)列出每一步操作步驟。 6、測試結(jié)果列出你的測試結(jié)果,包括輸入和輸出。這里的測試數(shù)據(jù)應(yīng)該完整和嚴(yán)格,最好多于需求分析中所列。 7、附錄題目:約瑟夫-實習(xí)報告尺寸:約瑟夫-實習(xí)報告.doc目錄: 一、需求分析 二、概要設(shè)計 三、程序具體設(shè)計及函數(shù)調(diào)用關(guān)系 四、調(diào)試分析 五、測試結(jié)果原文:實習(xí)報告題目:約瑟夫(Joseph)問題的一種描述是:編號為1,2,.,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數(shù))。一開始任選一個整數(shù)作為報數(shù)上限值m,從第一個人開始按順時針方向自1開始順序報數(shù),報到m時停止報數(shù)。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個開始重新從1報數(shù),如此下去,直至年有人全部出列為止。試設(shè)計一個程序求出出列順序。班級:姓名:學(xué)號:完成日期: 一、需求分析1.本演示程序中,利用單向循環(huán)鏈表存儲結(jié)構(gòu)存儲約瑟夫環(huán)數(shù)據(jù)(即n個人的編號和密碼)。2.演示程序以用戶和計算機(jī)的對話方式執(zhí)行,即在計算機(jī)終端上顯示“提示信息”之后,由用戶在鍵盤上輸入演示程序中需要輸入的數(shù)據(jù),運(yùn)算結(jié)果顯示在其后。3.程序執(zhí)行的命令包括:1)構(gòu)造單向循環(huán)鏈表;2)4.測試數(shù)據(jù)m的初值為20;n=7,7個人的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序為6,1,4,7,2,1,3,5)。 二、概要設(shè)計1.單向循環(huán)鏈表的抽象數(shù)據(jù)類型定義為:ADT List{數(shù)據(jù)對象:D={ai|ai∈正整數(shù),I=1,2,.,n,n≥0}數(shù)據(jù)關(guān)系:R1={ai-1,ai|,ai-1,ai∈D,I=1,2,.,n}基本操作:Init List(&L)操作結(jié)果:構(gòu)造一個空的線性表L。List Insert(&L,i,e)初始條件:線性表L已存在,1≤i≤List Length(L)+1.操作結(jié)果:在L中第i個位置之前插入新的數(shù)據(jù)無素e,L長度加1。List Delete(&L,i,&e)初始條件:線性表L存在非空,1≤i≤List Length(L).操作結(jié)果:刪除L的第i個元素,并用e返回其值,L長度減1。2.程序包含四個模塊:1)主程序模塊:void main(){.第二篇:數(shù)據(jù)結(jié)構(gòu)-停車場管理-實習(xí)報告
第三篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-停車場管理
第四篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告_15_停車場管理
第五篇:數(shù)據(jù)結(jié)構(gòu)實習(xí)報告