第一篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-停車場管理
課 程 設(shè) 計 報 告
課程名稱
數(shù)據(jù) 結(jié)構(gòu)
題
目
停車場管理
學(xué)生姓名 班級/學(xué)號 191103
一、需求分析
設(shè)停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供
汽車進出。汽車在停車場內(nèi)按車輛到達時間的先后順序,依次由北向南排列(大門在最南端),若停車場內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場內(nèi)某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。
【測試數(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’表示離去;’E’表示輸入結(jié)束。概要設(shè)計
以棧模擬停車場,以隊列模擬車場外的便道。棧以順序結(jié)構(gòu)實現(xiàn)。隊列以鏈表結(jié)構(gòu)實現(xiàn)。每一組輸入數(shù)據(jù)包括:汽車“到達”或“離去”信息、汽車牌照號碼以及到達或離去的時刻。
輸出信息:若是車輛到達,則輸出汽車在停車場內(nèi)或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內(nèi)停留的時間和應(yīng)交納的費用(在便道上停留的時間不收費)。
二、詳細設(shè)計
三、程序設(shè)計
1.數(shù)據(jù)結(jié)構(gòu)設(shè)計 /*棧,模擬停車場*/ 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.程序設(shè)計
主函數(shù)中包括3個子函數(shù),A(arrive),D(depart),E(end)
(1)輸入車輛數(shù)據(jù):A為到達,D為離去,E為結(jié)束程序。
(2)接著輸入車輛的牌照信息
(3)若為到達的車輛,輸入進場信息,若為離去的車輛,輸入離場信息。(4)若車輛到達,可得到車輛的停放位置信息,若車輛離去,可得到車輛的停放時間(在便道上的停放時間除外),以及應(yīng)該交納的費用。
(5)本程序不斷循環(huán)要求輸入車輛信息,直到輸入的車輛數(shù)據(jù)為E時,程序結(jié)束。
四、調(diào)試分析
a、一開始在調(diào)試程序時遇到了內(nèi)存錯誤,經(jīng)過DEBUG,找到了引起內(nèi)存錯誤的原因:即在建立隊頭指針與隊尾指針時沒有對指針進行初始化(沒有為指針動態(tài)分配空間)。問題得到解決。
b、本程序中:車輛到達,離去時的時間復(fù)雜度均為:O(n)。本程序空間復(fù)雜度為:O(n)
五、使用說明和測試結(jié)果
1.使用說明:用戶按照屏幕所顯示的提示來選擇需要進行操作
2、測試結(jié)果:
測試結(jié)果滿足題目要求,程序無錯誤。
六、心得體會
通過此實驗,加深了我對數(shù)據(jù)結(jié)構(gòu)這門課的理解,真正運用了知識。將理論與現(xiàn)實完美的聯(lián)系在了一起。增強了動手能力,對今后的工作學(xué)習(xí)都有很大的幫助。單調(diào)的看書本沒有太大的作用,只有去編程才能理解究竟學(xué)習(xí)的作用。同時,編程過程中遇到過各種各樣的問題,與同學(xué)討論,與老師交流。鍛煉了我的協(xié)做能力與克服困難的能力。編程也極大的提高了我的學(xué)習(xí)積極性。
七、附錄
#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, 占用車位數(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 汽車進車場 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); } } 停車場管理系統(tǒng) ——數(shù)據(jù)結(jié)構(gòu)課程設(shè)計程序設(shè)計書 小組成員: 彭路 20131344031 崔琦 20131344028 徐佳 20131344027 范福龍 20121344024 班級 : 13軟件工程1班 時間:2014.12.22 目錄 一、程序設(shè)計目標(biāo) 二、問題描述 三、需求分析 四、概要設(shè)計 五、詳細設(shè)計 六、源程序清單 七、軟件說明書 八、測試報告 九、課程設(shè)計總結(jié) 一、程序設(shè)計目標(biāo) 本管理程序由c/c++語言完成,實現(xiàn)了對停車場收費問題的處理。本程序保證了程序的健壯性和操作性,在閱讀過使用說明書之后可以輕松使用。本管理系統(tǒng)假設(shè)車輛在停車場時一直有人在駕駛,或者說停車場的每塊停車位均可智能移動。并假設(shè)車輛進出場耗時不計,且時間均為整數(shù)類型。最后自動或者人工完成收費。 二、問題描述 設(shè)停車場內(nèi)只有一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內(nèi)按車輛到達時間的先后順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在車場的最北端),若車場內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場內(nèi)某輛車要離開時,在它之后開入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其它車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。 三、需求分析 根據(jù)問題描述,可把本停車場抽象成一個棧存儲類型s1,需要輸入最大停車容量n。每當(dāng)輸入’A’時即為有車輛申請進入停車場操作,此時需要判斷停車場是否有空位,如果有空位,那么這輛車可以進入停車場,即為執(zhí)行一次壓棧操作(push),并記錄進入停車場的時間t1,并輸出位置p1;如果停車場沒有空位,那么這輛車在門外便道等候,并輸出位置p2。根據(jù)問題描述,可以把此門外便道抽象成一個隊列存儲類型q,而每有一輛車進入門外便道,即相當(dāng)于進行一次插入隊列操作(push)。每當(dāng)輸入’D’時即為有車輛申請離開停車場操作,此時需要判斷該車輛在停車場的位置。如果該車位于停車場最外側(cè)即相當(dāng)于棧頂,那么該車可以直接批準離開并根據(jù)輸入的離開時間t2計算出停車時間t2-t1,根據(jù)該車本次停車時間完成收費后即可成功駛出停車場,即相當(dāng)于成功彈出棧頂元素(pop);如果該車沒有位于停車場最外側(cè),事實上,這也是大多數(shù)的情況,那么需要將該車外側(cè)的車依次(即為擋路的車)移動進一個臨時停車場,根據(jù)問題描述,可以將該臨時停車場抽象成另一個棧存儲類型s2,那么此次移動操作相當(dāng)于將棧中某元素以上的元素依次壓入另一個棧(push)。當(dāng)申請離開的車駛出停車場后,在臨時停車場的車輛依次進入停車場,此操作相當(dāng)于將棧s2內(nèi)元素依次彈出棧(pop)并壓入棧s1(push)。此時判斷門外便道上有無等待進入停車場的車輛,如果有的話,門外便道上第一輛車可以進入停車場,并記錄進入時間t1,此次操作相當(dāng)于取出隊列q的隊首元素并將其壓入棧s1中。而輸入’E’時,即退出系統(tǒng)。至此,所有分析結(jié)束。 四、概要設(shè)計 根據(jù)需求分析,解決此問題需要構(gòu)建一個Cars類型的結(jié)構(gòu)體,構(gòu)建一個CarNode類型的節(jié)點結(jié)構(gòu)體以構(gòu)建SQueue類型的隊列結(jié)構(gòu)體,并需要構(gòu)建一個SQstack類型的棧結(jié)構(gòu)體。接下來,分別定義隊列和棧的各項基本操作函數(shù)。最后,完成菜單函數(shù)以實現(xiàn)各項操作。 五、詳細設(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;} //進入隊列操作 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<<“請輸入每小時停車費:”; 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 //棧的結(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進入管理系統(tǒng)。 2、接下來按提示輸入停車場的可供使用的車位數(shù)。 3、按提示輸入該停車場每小時收費標(biāo)準。 4、按提示輸入到達后者離開信息,例如A 1 5,D 1 10。 5、輸入E 0 0并輸入N,退出系統(tǒng)。 八、測試報告 1、如圖,當(dāng)打開系統(tǒng)時出現(xiàn)此界面,輸入Y為進入系統(tǒng),輸入N為退出系統(tǒng)。 2、如圖,如果輸入錯誤會提示出錯,并重新輸入。 3、如圖,輸入Y后,按提示依次輸入停車場可提供的最大車位數(shù)和每小時的停車費。 4、如圖,輸入A 1 5后,提示進入停車場的信息。 5、如圖,輸入A 2 10,A 3 15后,依次顯示提示信息。 6、如圖,輸入D 1 20后,分別顯示便道進入停車場的3號車和1號車的收費情況。 7、如圖,輸入E 0 0,再按提示輸入N,即可退出系統(tǒng)。 九、課程設(shè)計總結(jié) 通過團隊對該問題分析,互相補充了觀點,增強了對該題目正確認識。隊員們進行了縝密的需求分析,并分工完成各文件和函數(shù)的編寫。隊員們紛紛表示,這絕對是一個以前不能想象到的任務(wù)。通過對該系統(tǒng)的編寫、實現(xiàn),著實增強了隊員們的團隊意識以及對數(shù)據(jù)結(jié)構(gòu)的進一步的理解。當(dāng)程序成功運行后,隊員們都非常興奮,雖然本系統(tǒng)仍有瑕疵,但是可以說這是隊員們的心血。 0 數(shù) 據(jù) 結(jié) 構(gòu) 課程設(shè)計報告 題 目: 一元多項式計算 專 業(yè): 信息管理與信息系統(tǒng) 班 級: 2012級普本班 學(xué) 號: 201201011367 姓 名: 左帥帥 指導(dǎo)老師: 郝慎學(xué) 時 間: 一、課程設(shè)計題目分析 本課程設(shè)計要求利用C語言或C++編寫,本程序?qū)崿F(xiàn)了一元多項式的加法、減法、乘法、除法運算等功能。 二、設(shè)計思路 本程序采用C語言來完成課程設(shè)計。 1、首先,利用順序存儲結(jié)構(gòu)來構(gòu)造兩個存儲多項式A(x)和 B(x)的結(jié)構(gòu)。 2、然后把輸入,加,減,乘,除運算分成五個主要的模塊:實現(xiàn)多項式輸入模塊、實現(xiàn)加法的模塊、實現(xiàn)減法的模塊、實現(xiàn)乘法的模塊、實現(xiàn)除法的模塊。 3、然后各個模塊里面還要分成若干種情況來考慮并通過函數(shù)的嵌套調(diào)用來實現(xiàn)其功能,盡量減少程序運行時錯誤的出現(xiàn)。 4、最后編寫main()主函數(shù)以實現(xiàn)對多項式輸入輸出以及加、減、乘、除,調(diào)試程序并將不足的地方加以修改。 三、設(shè)計算法分析 1、相關(guān)函數(shù)說明: (1)定義數(shù)據(jù)結(jié)構(gòu)類型為線性表的鏈式存儲結(jié)構(gòu)類型變量 typedef struct Polynomial{} (2)其他功能函數(shù) 插入函數(shù)void Insert(Polyn p,Polyn h) 比較函數(shù)int compare(Polyn a,Polyn b) 建立一元多項式函數(shù)Polyn Create(Polyn head,int m) 求解并建立多項式a+b,Polyn Add(Polyn pa,Polyn pb) 求解并建立多項式a-b,Polyn Subtract(Polyn pa,Polyn pb)2 求解并建立多項式a*b,Polyn Multiply(Polyn pa,Polyn pb) 求解并建立多項式a/b,void Device(Polyn pa,Polyn pb) 輸出函數(shù)輸出多項式,void Print(Polyn P) 銷毀多項式函數(shù)釋放內(nèi)存,void Destroy(Polyn p) 主函數(shù),void main() 2、主程序的流程基函數(shù)調(diào)用說明(1)typedef struct Polynomial { float coef; int expn; struct Polynomial *next;} *Polyn,Polynomial; 在這個結(jié)構(gòu)體變量中coef表示每一項前的系數(shù),expn表示每一項的指數(shù),polyn為結(jié)點指針類型,屬于抽象數(shù)據(jù)類型通常由用戶自行定義,Polynomial表示的是結(jié)構(gòu)體中的數(shù)據(jù)對象名。 (2)當(dāng)用戶輸入兩個一元多項式的系數(shù)和指數(shù)后,建立鏈表,存儲這兩個多項式,主要說明如下: Polyn CreatePolyn(Polyn head,int m)建立一個頭指針為head、項數(shù)為m的一元多項式 p=head=(Polyn)malloc(sizeof(struct Polynomial));為輸入的多項式申請足夠的存儲空間 p=(Polyn)malloc(sizeof(struct Polynomial));建立新結(jié)點以接收數(shù)據(jù) Insert(p,head);調(diào)用Insert函數(shù)插入結(jié)點 這就建立一元多項式的關(guān)鍵步驟 (3)由于多項式的系數(shù)和指數(shù)都是隨即輸入的,所以根據(jù)要求需要對多項式按指數(shù)進行降冪排序。在這個程序模塊中,使用鏈表,根據(jù)對指數(shù)大小的比較,對各種情況進行處理,此處由于反復(fù)使用指針對各個結(jié)點進行定位,找到合適的位置再利用void Insert(Polyn p,Polyn h)進行插入操作。(4)加、減、乘、除、的算法實現(xiàn): 在該程序中,最關(guān)鍵的一步是實現(xiàn)四則運算和輸出,由于加減算法原則是一樣,減法可通過系數(shù)為負的加法實現(xiàn);對于乘除算法的大致流程都是:首先建立多項式a*b,a/b,然后使用鏈表存儲所求出的乘積,商和余數(shù)。這就實現(xiàn)了多項式計算模塊的主要功能。 (5)另一個子函數(shù)是輸出函數(shù) PrintPolyn(); 輸出最終的結(jié)果,算法是將最后計算合并的鏈表逐個結(jié)點依次輸出,便得到整鏈表,也就是最后的計算式計算結(jié)果。由于考慮各個結(jié)點的指數(shù)情況不同,分別進行了判斷處理。 四、程序新點 通過多次寫程序,發(fā)現(xiàn)在程序在控制臺運行時總是黑色的,本次寫程序就想著改變一下,于是經(jīng)過查資料利用system(“Color E0”);可以函數(shù)解決,這里“E0,”E是控制臺背景顏色,0是控制臺輸出字體顏色。 五、設(shè)計中遇到的問題及解決辦法 首先是,由于此次課程設(shè)計里使用指針使用比較多,自己在指針多的時候易腦子混亂出錯,對于此問題我是采取比較笨的辦法在稿紙上寫明白后開始進行 4 代碼編寫。 其次是,在寫除法模塊時比較復(fù)雜,自己通過查資料最后成功寫出除法模塊功能。 最后是,前期分析不足開始急于寫代碼,中途出現(xiàn)各種問題,算是給自己以后設(shè)計時的一個經(jīng)驗吧。 六、測試(程序截圖) 1.數(shù)據(jù)輸入及主菜單 2.加法和減法模塊 3.乘法和除法模塊 七、總結(jié) 通過本次應(yīng)用C語言設(shè)計一元多項式基本計算程序,使我更加鞏固了C語言程序設(shè)計的知識,以前對指針這一點使用是比較模糊,現(xiàn)在通過此次課程設(shè)計對指針理解的比較深刻了。而且對于數(shù)據(jù)結(jié)構(gòu)的相關(guān)算法和函數(shù)的調(diào)用方面知識的加深。本次的課程設(shè)計,一方面提高了自己獨立思考處理問題的能力;另一方面使自己再設(shè)計開發(fā)程序方面有了一定的小經(jīng)驗和想法,對自己以后學(xué)習(xí)其他語言程序設(shè)計奠定了一定的基礎(chǔ)。 八、指導(dǎo)老師評語及成績 附錄:(課程設(shè)計代碼) #include float coef;6 int expn; struct Polynomial *next;} *Polyn,Polynomial; //Polyn為結(jié)點指針類型 void Insert(Polyn p,Polyn h){ if(p->coef==0)free(p); //系數(shù)為0的話釋放結(jié)點 else { Polyn q1,q2; q1=h;q2=h->next; while(q2&&p->expn { q1=q2;q2=q2->next;} if(q2&&p->expn==q2->expn)//將指數(shù)相同相合并 { q2->coef+=p->coef; free(p); if(!q2->coef)//系數(shù)為0的話釋放結(jié)點 { q1->next=q2->next;free(q2);} } else { p->next=q2;q1->next=p; }//指數(shù)為新時將結(jié)點插入 } 7 } //建立一個頭指針為head、項數(shù)為m的一元多項式 Polyn Create(Polyn head,int m){ int i; Polyn p; p=head=(Polyn)malloc(sizeof(struct Polynomial)); head->next=NULL; for(i=0;i { p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結(jié)點以接收數(shù)據(jù) printf(“請輸入第%d項的系數(shù)與指數(shù):”,i+1); scanf(“%f %d”,&p->coef,&p->expn); Insert(p,head); //調(diào)用Insert函數(shù)插入結(jié)點 } return head;} //銷毀多項式p void Destroy(Polyn p){ Polyn q1,q2; q1=p->next;8 q2=q1->next; while(q1->next) { free(q1); q1=q2;//指針后移 q2=q2->next; } } //輸出多項式p int Print(Polyn P){ Polyn q=P->next; int flag=1;//項數(shù)計數(shù)器 if(!q)//若多項式為空,輸出0 { putchar('0'); printf(“n”); return; } while(q) { if(q->coef>0&&flag!=1)putchar('+');//系數(shù)大于0且不是第一項 9 if(q->coef!=1&&q->coef!=-1)//系數(shù)非1或-1的普通情況 { printf(“%g”,q->coef); if(q->expn==1)putchar('X'); else if(q->expn)printf(“X^%d”,q->expn); } else { if(q->coef==1){ if(!q->expn)putchar('1'); else if(q->expn==1)putchar('X'); else printf(“X^%d”,q->expn);} if(q->coef==-1){ if(!q->expn)printf(“-1”); else if(q->expn==1)printf(“-X”); else printf(“-X^%d”,q->expn);} } q=q->next; flag++; } printf(“n”);} int compare(Polyn a,Polyn b){ if(a&&b) { if(!b||a->expn>b->expn)return 1; else if(!a||a->expn else return 0; } else if(!a&&b)return-1;//a多項式已空,但b多項式非空 else return 1;//b多項式已空,但a多項式非空 } //求解并建立多項式a+b,返回其頭指針 Polyn Add(Polyn pa,Polyn pb){ Polyn qa=pa->next; Polyn qb=pb->next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點 11 hc->next=NULL; headc=hc; while(qa||qb){ qc=(Polyn)malloc(sizeof(struct Polynomial)); switch(compare(qa,qb)) { case 1: qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; case 0: qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; case-1: qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break;12 } if(qc->coef!=0) { qc->next=hc->next; hc->next=qc; hc=qc; } else free(qc);//當(dāng)相加系數(shù)為0時,釋放該結(jié)點 } return headc;} //求解并建立多項式a-b,返回其頭指針 Polyn Subtract(Polyn pa,Polyn pb){ Polyn h=pb; Polyn p=pb->next; Polyn pd; while(p)//將pb的系數(shù)取反 { p->coef*=-1;p=p->next;} pd=Add(pa,h); for(p=h->next;p;p=p->next) //恢復(fù)pb的系數(shù) p->coef*=-1;13 return pd;} //求解并建立多項式a*b,返回其頭指針 Polyn Multiply(Polyn pa,Polyn pb){ Polyn hf,pf; Polyn qa=pa->next; Polyn qb=pb->next; hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點 hf->next=NULL; for(;qa;qa=qa->next) { for(qb=pb->next;qb;qb=qb->next) { pf=(Polyn)malloc(sizeof(struct Polynomial)); pf->coef=qa->coef*qb->coef; pf->expn=qa->expn+qb->expn; Insert(pf,hf);//調(diào)用Insert函數(shù)以合并指數(shù)相同的項 } } return hf;} //求解并建立多項式a/b,返回其頭指針 void Device(Polyn pa,Polyn pb){ Polyn hf,pf,temp1,temp2; Polyn qa=pa->next; Polyn qb=pb->next; hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點,存儲商 hf->next=NULL; pf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點,存儲余數(shù) pf->next=NULL; temp1=(Polyn)malloc(sizeof(struct Polynomial)); temp1->next=NULL; temp2=(Polyn)malloc(sizeof(struct Polynomial)); temp2->next=NULL; temp1=Add(temp1,pa); while(qa!=NULL&&qa->expn>=qb->expn) { temp2->next=(Polyn)malloc(sizeof(struct Polynomial)); temp2->next->coef=(qa->coef)/(qb->coef); temp2->next->expn=(qa->expn)-(qb->expn); Insert(temp2->next,hf); pa=Subtract(pa,Multiply(pb,temp2));15 qa=pa->next; temp2->next=NULL; } pf=Subtract(temp1,Multiply(hf,pb)); pb=temp1; printf(“商是:”); Print(hf); printf(“余數(shù)是:”); Print(pf);} void main(){ int choose=1;int m,n,flag=0;system(“Color E0”);Polyn pa=0,pb=0,pc,pd,pf;//定義各式的頭指針,pa與pb在使用前付初值NULL printf(“請輸入A(x)的項數(shù):”);scanf(“%d”,&m);printf(“n”);pa=Create(pa,m);//建立多項式A printf(“n”);printf(“請輸入B(x)的項數(shù):”);16 scanf(“%d”,&n);printf(“n”);pb=Create(pb,n);//建立多項式B printf(“n”);printf(“**********************************************n”);printf(“* 多項式操作菜單 printf(”**********************************************n“);printf(”tt 1.輸出操作n“);printf(”tt 2.加法操作n“);printf(”tt 3.減法操作n“);printf(”tt 4.乘法操作n“);printf(”tt 5.除法操作n“);printf(”tt 6.退出操作n“);printf(”**********************************************n“);while(choose){ printf(”執(zhí)行操作:“); scanf(”%d“,&flag); switch(flag) { case 1: printf(”多項式A(x):“);Print(pa);*n”); printf(“多項式B(x):”);Print(pb); break; case 2: pc=Add(pa,pb); printf(“多項式A(x)+B(x):”);Print(pc); Destroy(pc);break; case 3: pd=Subtract(pa,pb); printf(“多項式A(x)-B(x):”);Print(pd); Destroy(pd);break; case 4: pf=Multiply(pa,pb); printf(“多項式A(x)*B(x):”); Print(pf); Destroy(pf); break; case 5: Device(pa,pb);18 break; case 6: exit(0); break; } } Destroy(pa); Destroy(pb);} 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 1.赫夫曼編碼器 設(shè)計一個利用赫夫曼算法的編碼和譯碼系統(tǒng),重復(fù)地顯示并處理以下項目,直到選擇退出為止。要求: 1)將權(quán)值數(shù)據(jù)存放在數(shù)據(jù)文件(文件名為data.txt,位于執(zhí)行程序的當(dāng)前目錄中) 2)初始化:鍵盤輸入字符集大小26、26個字符和26個權(quán)值(統(tǒng)計一篇英文文章中26個字母),建立哈夫曼樹; 3)編碼:利用建好的哈夫曼樹生成哈夫曼編碼; 4)輸出編碼(首先實現(xiàn)屏幕輸出,然后實現(xiàn)文件輸出); 5)界面優(yōu)化設(shè)計。 代碼如下: #include typedef struct HTNode //結(jié)構(gòu)體 { int Weight; char ch;int Parent,Lchild,Rchild;}HTNode;typedef char * * HCode; void Save(int n,HTNode *HT) //把權(quán)值保存到文件 { FILE * fp; int i; if((fp=fopen(“data.txt”,“wb”))==NULL) { printf(“cannot open filen”); return; } for(i=0;i if(fwrite(&HT[i].Weight,sizeof(struct HTNode),1,fp)!=1) printf(“file write errorn”); fclose(fp); system(“cls”); printf(“保存成功!”); } void Create_H(int n,int m,HTNode *HT) //建立赫夫曼樹,進行編碼 { int w,k,j;char c;for(k=1;k<=m;k++){ if(k<=n) { printf(“n請輸入權(quán)值和字符(用空格隔開): ”); scanf(“%d”,&w); scanf(“ %c”,&c);HT[k].ch=c; HT[k].Weight=w; } else HT[k].Weight=0; HT[k].Parent=HT[k].Lchild=HT[k].Rchild=0;} int p1,p2,w1,w2; for(k=n+1;k<=m;k++){ p1=0;p2=0; w1=32767;w2=32767; for(j=1;j<=k-1;j++) { if(HT[j].Parent==0) { if(HT[j].Weight { w2=w1;p2=p1; w1=HT[j].Weight; p1=j; } else if(HT[j].Weight { w2=HT[j].Weight; p2=j; } } } HT[k].Lchild=p1;HT[k].Rchild=p2;HT[k].Weight=HT[p1].Weight+HT[p2].Weight; HT[p1].Parent=k;HT[p2].Parent=k; } printf(“輸入成功!”);} void Coding_H(int n,HTNode *HT) //對結(jié)點進行譯碼 { int k,sp,fp,p;char *cd;HCode HC; HC=(HCode)malloc((n+1)*sizeof(char *)); cd=(char *)malloc(n*sizeof(char));cd[n-1]='
主站蜘蛛池模板:
国产黄大片在线观看画质优化|
人妻少妇精品视频无码专区|
亚洲人成网址在线播放|
一二三四在线观看免费视频|
中文字幕亚洲无线码|
中文字幕乱码中文乱码51精品|
午夜成人爽爽爽视频在线观看|
亚洲大尺度专区无码浪潮av|
朝鲜美女黑毛bbw|
亚洲依依成人亚洲社区|
成人毛片100免费观看|
国产真人无码作爱视频免费|
国产特级毛片aaaaaa视频|
久久五十路丰满熟女中出|
青青青青久久精品国产|
国产精品一在线观看|
男女做爰高清无遮挡免费视频|
国产福利姬喷水福利在线观看|
国产精品久久久久久久久久红粉|
日日碰狠狠躁久久躁蜜桃|
香蕉大美女天天爱天天做|
人人妻人人狠人人爽天天综合网|
亚洲国产精久久久久久久|
亚洲精品夜夜夜|
337p日本欧洲亚洲大胆裸体艺术|
国产精品视频免费播放|
精品欧洲av无码一区二区14|
国产a v无码专区亚洲av|
日本乱偷人妻中文字幕在线|
亚洲中文无码av永久伊人|
国产欧美综合一区二区三区|
在厨房被c到高潮a毛片奶水|
亚洲伊人成综合网2222|
亚洲国语自产一区第二页|
欧美亚洲国产手机在线有码|
久碰久摸久看视频在线观看|
爽死你欧美大白屁股在线|
欧美午夜理伦三级在线观看|
婷婷亚洲久悠悠色悠在线播放|
国产精品午夜性视频|
久久久久久久久久久久|
第二篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告_15_停車場管理
第三篇:2012數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
第四篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計