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