數(shù)據(jù)結(jié)構(gòu)一元多項(xiàng)式計(jì)算器_第1頁
數(shù)據(jù)結(jié)構(gòu)一元多項(xiàng)式計(jì)算器_第2頁
數(shù)據(jù)結(jié)構(gòu)一元多項(xiàng)式計(jì)算器_第3頁
數(shù)據(jù)結(jié)構(gòu)一元多項(xiàng)式計(jì)算器_第4頁
數(shù)據(jù)結(jié)構(gòu)一元多項(xiàng)式計(jì)算器_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、課程設(shè)計(jì)說明書題目一元多項(xiàng)式計(jì)算問題系(部)計(jì)算機(jī)科學(xué)與技術(shù)系專業(yè)(班級(jí))姓名學(xué)號(hào)指導(dǎo)教師起止日期課程設(shè)計(jì)任務(wù)書課程名稱:數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)題目:一元多項(xiàng)式計(jì)算問題已知技術(shù)參數(shù)和設(shè)計(jì)要求:問題描述:設(shè)計(jì)一個(gè)稀疏多項(xiàng)式簡單計(jì)算器基本要求:(1)輸入并分別建立多項(xiàng)式A和B(2)輸入輸出多項(xiàng)式,輸出形式為整數(shù)序列:n,c1,e1,c2,e2,其中n是多項(xiàng)式的項(xiàng)數(shù),ci和ei是第i項(xiàng)的系數(shù)和指數(shù),序列按指數(shù)降序排列(3)完成兩個(gè)多項(xiàng)式的相加、相減,并將結(jié)果輸出;測試數(shù)據(jù):(1) A+B A= 3x14-8x8+6x2+2 B=2x10+4x8+-6x2 (2) A-B A=11x14+3x10+2x8

2、+10 x6+5 B=2x14+3x8+5x6+7(3) A+B A=x3+x1 B=-x3-x1(4) A+B A=0 B=x7+x5+x3+x1(5) A-B A=100 x100+50 x50+20 x20+x B=10 x100+10 x50+10 x20+x選作內(nèi)容:(1).多項(xiàng)式在x=1時(shí)的運(yùn)算結(jié)果(2)求多項(xiàng)式A和B的乘積設(shè)計(jì)工作量:40課時(shí)工作計(jì)劃:見課表指導(dǎo)教師簽名:日期:教研室主任簽名: 日期:系主任簽名: 日期:課程設(shè)計(jì)鑒定表姓名學(xué)號(hào)專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)系班級(jí)設(shè)計(jì)題目一元多項(xiàng)式計(jì)算問題指導(dǎo)教師指導(dǎo)教師意見:評(píng)定等級(jí): 教師簽名: 日期: 答辯小組意見:評(píng)定等級(jí):答辯小組長

3、簽名:日期:教研室意見:教研室主任簽名: 日期: 系(部)意見:系主任簽名:日期:說明課程設(shè)計(jì)成績分“優(yōu)秀”、“良好”、“及格”、“不及格”四類;摘要本報(bào)告參照長沙學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系2010-2011學(xué)年數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)要求編寫,設(shè)計(jì)一個(gè)一元多項(xiàng)式計(jì)算器程序。程序的總體數(shù)據(jù)結(jié)構(gòu)為線性表,用帶頭結(jié)點(diǎn)的單循環(huán)鏈表存儲(chǔ)表示多項(xiàng)式,對(duì)線性表元素進(jìn)行插入、刪除與排序等操作完成兩個(gè)多項(xiàng)式的加、減、乘、除以及輸出、定值運(yùn)算等操作。程序經(jīng)過反復(fù)調(diào)試,極具健壯性與友好性。本課程設(shè)計(jì)說明書適合高等院校計(jì)算機(jī)專業(yè)師生閱讀,也可供廣大自學(xué)數(shù)據(jù)結(jié)構(gòu)的人員參考。關(guān)鍵詞:數(shù)據(jù)結(jié)構(gòu);一元多項(xiàng)式計(jì)算器;線性表 目錄 TOC

4、 o 1-3 h z u HYPERLINK l _Toc5114 1 設(shè)計(jì)內(nèi)容與要求 PAGEREF _Toc5114 - 6 - HYPERLINK l _Toc11407 2 設(shè)計(jì)說明 PAGEREF _Toc11407 7 HYPERLINK l _Toc5667 2.1 問題描述與功能設(shè)計(jì) PAGEREF _Toc5667 7 HYPERLINK l _Toc20638 2.2.算法與數(shù)據(jù)結(jié)構(gòu) PAGEREF _Toc20638 8 HYPERLINK l _Toc18420 2.3.函數(shù)定義 PAGEREF _Toc18420 11 HYPERLINK l _Toc2128 2.4

5、.界面設(shè)計(jì) PAGEREF _Toc2128 12 HYPERLINK l _Toc17433 2.5 編碼 PAGEREF _Toc17433 13 HYPERLINK l _Toc2641 2.6 測試 PAGEREF _Toc2641 16 HYPERLINK l _Toc14939 3 總結(jié) PAGEREF _Toc14939 19 HYPERLINK l _Toc5084 參考文獻(xiàn) PAGEREF _Toc5084 20 HYPERLINK l _Toc13678 附錄A源代碼: PAGEREF _Toc13678 211 設(shè)計(jì)內(nèi)容與要求設(shè)計(jì)內(nèi)容:設(shè)計(jì)一個(gè)稀疏多項(xiàng)式簡單計(jì)算器設(shè)計(jì)要求

6、:基本要求:(1)輸入并分別建立多項(xiàng)式A和B。(2)輸入輸出多項(xiàng)式,輸出形式為整數(shù)序列: n,c1,e1,c2,e2, 其中n是多項(xiàng)式的項(xiàng)數(shù),ci和ei是第i項(xiàng)的系數(shù)和指數(shù),序列按指數(shù)降序排列。(3)完成兩個(gè)多項(xiàng)式的相加、相減,并將結(jié)果輸出。創(chuàng)新要求:(1)多項(xiàng)式在x=1時(shí)的運(yùn)算結(jié)果;(2)求多項(xiàng)式A和B的乘積。2 設(shè)計(jì)說明2.1 問題描述與功能設(shè)計(jì)1.問題描述:設(shè)計(jì)一個(gè)稀疏多項(xiàng)式簡單計(jì)算器。用戶輸入兩個(gè)多項(xiàng)式的項(xiàng)數(shù)、系數(shù)與指數(shù),計(jì)算加減乘除等的結(jié)果。:提示用戶輸入兩個(gè)多項(xiàng)式A和B,輸入形式為:先輸入多項(xiàng)式A的項(xiàng)數(shù),回車,輸入多項(xiàng)式A第一項(xiàng)的系數(shù),每一項(xiàng)按照先輸入系數(shù),空格或回車;輸入多項(xiàng)式A

7、第一項(xiàng)的指數(shù),繼續(xù)輸入多項(xiàng)式A的其他項(xiàng),輸入方式與上同;再建立多項(xiàng)式B,數(shù)據(jù)輸入方式與建立多項(xiàng)式A相同。兩個(gè)多項(xiàng)式建立完畢后,再選擇以下功能進(jìn)行相應(yīng)的運(yùn)算。1. 輸出多項(xiàng)式A和B 2. 計(jì)算多項(xiàng)式A+B 3. 計(jì)算多項(xiàng)式A-B 4. 計(jì)算多項(xiàng)式A*B 5. 計(jì)算多項(xiàng)式A/B 6. 計(jì)算A在x處的值7. 重新創(chuàng)建多項(xiàng)式8. 退出每輸入一個(gè)數(shù)字,則計(jì)算出相應(yīng)的值并輸出,然后繼續(xù)輸入功能選擇項(xiàng)。多項(xiàng)式的鏈接表示多項(xiàng)式的項(xiàng)采用單鏈表存儲(chǔ),每一個(gè)非零項(xiàng)對(duì)應(yīng)單鏈表的一個(gè)結(jié)點(diǎn),且單鏈表按照指數(shù)遞減有序排列。結(jié)點(diǎn)結(jié)構(gòu)如下圖所示。coef:系數(shù)域,存放非零項(xiàng)的系數(shù); exp:指數(shù)域,存放非零項(xiàng)的指數(shù); next

8、:指針域,存放只想下一結(jié)點(diǎn)的指針。 多項(xiàng)式的邏輯結(jié)構(gòu):視為線性表 p(x)=3x14-8x8+6x2+2 多項(xiàng)式的存儲(chǔ)表示 p(x)=3x14-8x8+6x2+2 ( (3,14),(-8,8),(6,2),(2,0) )為運(yùn)算方便,采用帶頭結(jié)點(diǎn)的單鏈表,下面舉例分析兩個(gè)多項(xiàng)式求和的執(zhí)行過程。設(shè)兩個(gè)工作指針pa和pb,分別指向兩個(gè)單鏈表的開始結(jié)點(diǎn),兩個(gè)多項(xiàng)式求和實(shí)際上是對(duì)結(jié)點(diǎn)pa的指數(shù)域和結(jié)點(diǎn)pb的指數(shù)域進(jìn)行比較,這會(huì)出現(xiàn)下列三種情況:若pa-expexp,則結(jié)點(diǎn)pa應(yīng)為結(jié)點(diǎn)中的一個(gè)結(jié)點(diǎn),將指針pa后移;若pa-exppb-exp,則結(jié)點(diǎn)pb應(yīng)為結(jié)點(diǎn)中的一個(gè)結(jié)點(diǎn),將pb插入到第一個(gè)單鏈表中結(jié)點(diǎn)

9、pa之前,再將指針pb后移;若pa-exp=pb-exp,則pa與pb所指為同類項(xiàng),將pb的系數(shù)加到pa的系數(shù)上,若相加結(jié)果不為0,則將指針pa后移,刪除結(jié)點(diǎn)pb,若相加結(jié)果為0,則表明結(jié)果中無此項(xiàng),刪除結(jié)點(diǎn)pa和結(jié)點(diǎn)pb,并將指針pa和指針pb分別后移。算法用偽代碼描述如下: 工作指針pa、pb初始化;相加偽代碼 While(pa存在且pb存在)執(zhí)行下列三種情形之一 2.1 如果pa-expexp,則指針pa后移; 2.2 如果pa-exppb-exp,則 2.2.1 將結(jié)點(diǎn)pb插入到結(jié)點(diǎn)pa之前; 2.2.2 指針pb指向原指針結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn); 2.3 如果pa-exp=pb-exp,則

10、 2.3.1 pa-coef=pa-coef+pb-coef; 2.3.2 如果pa-coef=0,則執(zhí)行下列操作,否則,指針pa后移; 2.3.2.1 刪除結(jié)點(diǎn)pa; 2.3.2.2 使指針pa指向它原指針結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn); 2.3.3 刪除結(jié)點(diǎn)pb; 2.3.4 使指針pb指向它原指針結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn);3. 如果pb不為空,將結(jié)點(diǎn)pb鏈接在第一個(gè)單鏈表的后面;多項(xiàng)式相加兩個(gè)多項(xiàng)式相乘時(shí)(假設(shè)第一個(gè)為m項(xiàng),第二個(gè)為n項(xiàng))只要第一個(gè)多項(xiàng)式的每一項(xiàng)的系數(shù)乘以第二個(gè)多項(xiàng)式每一項(xiàng)的系數(shù),指數(shù)加上第二個(gè)多項(xiàng)式的指數(shù)??梢缘玫絤個(gè)新的多項(xiàng)式。然后把這m個(gè)多項(xiàng)式按照指數(shù)相同的進(jìn)行相加。合并成一個(gè)多項(xiàng)式即可

11、。假設(shè)有兩個(gè)一元多項(xiàng)式:P1(X) = X2 + 2X + 3P2(X) = 3X3 + 10X + 6計(jì)算它們的和:P1(X) + P2(X) = (X2 + 2X + 3) + (3X3 + 10X + 6) = 3X3 + 1X2 + 12X1 + 9部分代碼描敘如下:for(;qa;qa=qa-next)for(qb=pb-next;qb;qb=qb-next) qc=new Polynomial;qc-coef=qa-coef*qb-coef;qc-exp=qa-exp+qb-exp;InsertNode(qc,headf); 減法與除法的算法和加法與乘法雷同,詳細(xì)代碼請(qǐng)見附錄A。定

12、義多項(xiàng)式的結(jié)構(gòu):typedef struct Polynomial /結(jié)點(diǎn)類型 float coef; /系數(shù)int exp; /指數(shù)Polynomial *next;*Polyn; /Polyn為結(jié)點(diǎn)指針類型設(shè)計(jì)函數(shù):void PrintPolyn(Polyn P); /輸出多項(xiàng)式void Insert(Polyn p,Polyn head); /插入結(jié)點(diǎn)Polyn CreatePolyn(Polyn head,int m) ; /創(chuàng)建多項(xiàng)式void DestroyPolyn(Polyn p); /銷毀多項(xiàng)式int compare(Polyn a,Polyn b); /多項(xiàng)式指數(shù)比較Poly

13、n AddPolyn(Polyn pa,Polyn pb); /加法Polyn SubPolyn(Polyn pa,Polyn pb); /減法Polyn MultiplyPolyn(Polyn pa,Polyn pb); /乘法void DevicePolyn(Polyn pa,Polyn pb); /除法float ValuePolyn(Polyn head,float x); /多項(xiàng)式的值程序運(yùn)行之后,首先顯示本程序的功能提示,以及提示用戶輸入:當(dāng)用戶根據(jù)提示輸入完成后,兩個(gè)多項(xiàng)式建立完畢,然后根據(jù)輸入對(duì)應(yīng)的數(shù)字,選擇相應(yīng)的功能,完成計(jì)算并輸出。2.5 編碼 輸出多項(xiàng)式的函數(shù),必須考慮到

14、多項(xiàng)式所有輸出形勢的情況:如果項(xiàng)數(shù)為零,則直接輸出“0”;若某一項(xiàng)的系數(shù)為0,則不輸出該項(xiàng),若系數(shù)為1,則“1”不用輸出,直接輸出字符“X”;若項(xiàng)的系數(shù)(或指數(shù))大于0,則直接輸出該系數(shù)(或指數(shù)),否則需在系數(shù)(或指數(shù))前輸出一個(gè)“”;若某一項(xiàng)的指數(shù)為1,則該項(xiàng)指數(shù)不用輸出,直接輸出系數(shù),在后面加一個(gè)字符“X”;若某一項(xiàng)指數(shù)為0,則只要輸出該項(xiàng)的系數(shù)即可;當(dāng)項(xiàng)數(shù)不為第一項(xiàng)而且該項(xiàng)系數(shù)大于0時(shí),需在系數(shù)前輸出一個(gè)“+”;具體實(shí)現(xiàn)代碼如下:void PrintPolyn(Polyn P) Polyn q=P-next; int flag=1; /項(xiàng)數(shù)計(jì)數(shù)器if(!q) /若多項(xiàng)式為空,輸出0 pu

15、tchar(0); printf(n);return; while(q)if(q-coef0&flag!=1) /系數(shù)大于0且不是第一項(xiàng)putchar(+); if(q-coef!=1&q-coef!=-1) /系數(shù)非1或-1 printf(%g,q-coef); if(q-exp=1) putchar(X);else if(q-exp) printf(X%d,q-exp);elseif(q-coef=1)if(!q-exp) putchar(1); else if(q-exp=1) putchar(X); else printf(X%d,q-exp);if(q-coef=-1)if(!q-e

16、xp) printf(-1); else if(q-exp=1) printf(-X); else printf(-X%d,q-exp); q=q-next; flag+;printf(n); 結(jié)點(diǎn)插入并排序的函數(shù)InsertNode(Polyn p,Polyn head) :計(jì)算完成后調(diào)用該函數(shù),將結(jié)果按照指數(shù)降序排列,合并指數(shù)相同的項(xiàng),并釋放計(jì)算后系數(shù)為0的結(jié)點(diǎn),若后一個(gè)多項(xiàng)式中的項(xiàng)在前一個(gè)多項(xiàng)式中找不到與之指數(shù)相同的項(xiàng),則將該項(xiàng)作為一個(gè)新的結(jié)點(diǎn)按照指數(shù)降序插入,合并代碼如下:if(q2!=NULL&p-exp=q2- /將指數(shù)相同的合并 q2-coef+=p-coef; /系數(shù)相加del

17、ete p; /釋放pif(!q2-coef) /釋放系數(shù)為0的結(jié)點(diǎn)q1-next=q2-next;delete q2; 多項(xiàng)式創(chuàng)建函數(shù)Polyn CreatePolyn(Polyn head,int m):建立頭指針為head,項(xiàng)數(shù)為m的多項(xiàng)式,調(diào)用InsertNode函數(shù)插入結(jié)點(diǎn),返回頭結(jié)點(diǎn)。Polyn CreatePolyn(Polyn head,int m) /頭指針為head、項(xiàng)數(shù)為m Polyn p;p=head=new Polynomial; /生成頭結(jié)點(diǎn)head-next=NULL;for(int i=0;icoef,&p-exp);InsertNode(p,head); /調(diào)

18、用InsertNode函數(shù)插入結(jié)點(diǎn)return head; 兩個(gè)多項(xiàng)式在指數(shù)比較函數(shù)int Compare(Polyn a,Polyn b):根據(jù)多項(xiàng)式A的指數(shù)值多項(xiàng)式B的指數(shù)值,分別返回-1、0或1。在此,還要考慮到多項(xiàng)式A或B項(xiàng)數(shù)為0的情況。int Compare(Polyn a,Polyn b)/依a的指數(shù)值b的指數(shù)值,分別返回-1、0或1if(a&b)if(!b|a-expb-exp) return 1;else if(!a|a-expexp) return -1;else return 0;else if(!a&b) return -1; /a多項(xiàng)式為空,但b多項(xiàng)式非空else re

19、turn 1; /b多項(xiàng)式為空,但a多項(xiàng)式非空 多項(xiàng)式的銷毀函數(shù)void DestroyPolyn(Polyn p):運(yùn)算完成后,需銷毀建立的多項(xiàng)式。void DestroyPolyn(Polyn p) /銷毀多項(xiàng)式p Polyn q1,q2;q1=p-next;if(q1=NULL) /結(jié)果系數(shù)為0的情況return ;q2=q1-next;while(q1-next)delete q1;q1=q2; /指針后移q2=q2-next; 接下來是四個(gè)多項(xiàng)式的加、減、乘、除及定值運(yùn)算運(yùn)算函數(shù):Polyn AddPolyn(Polyn pa,Polyn pb); /加法Polyn SubPolyn

20、(Polyn pa,Polyn pb); /減法Polyn MultiplyPolyn(Polyn pa,Polyn pb); /乘法void DevicePolyn(Polyn pa,Polyn pb); /除法float ValuePolyn(Polyn head,float x); /多項(xiàng)式的值詳細(xì)代碼見附錄A源代碼。2.6 測試測試數(shù)據(jù):(1)A+B A=3X14-8X8+6X2+2 B=2X10+4X8-6X2輸入:請(qǐng)輸入多項(xiàng)式A項(xiàng)數(shù):4請(qǐng)輸入第1項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):3 14請(qǐng)輸入第2項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):-8 8請(qǐng)輸入第3項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):

21、6 2請(qǐng)輸入第4項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):2 0請(qǐng)輸入多項(xiàng)式B項(xiàng)數(shù):3請(qǐng)輸入第1項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):2 10請(qǐng)輸入第2項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):4 8請(qǐng)輸入第3項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):-6 2預(yù)期結(jié)果:A+B=3X14+2X10-4X8+2測試結(jié)果:預(yù)期結(jié)果與測試結(jié)果相同,相加算法正確?。?)A-B A=11X14+3X10+2X8+10X6+5 B=2X14+3X8+5X6+7輸入:請(qǐng)輸入多項(xiàng)式A項(xiàng)數(shù):5請(qǐng)輸入第1項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):11 14請(qǐng)輸入第2項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):3 10請(qǐng)輸入第3項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):

22、2 8請(qǐng)輸入第4項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):10 6請(qǐng)輸入第4項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):5 0請(qǐng)輸入多項(xiàng)式B項(xiàng)數(shù):4請(qǐng)輸入第1項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):2 14請(qǐng)輸入第4項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):3 8請(qǐng)輸入第4項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):5 6請(qǐng)輸入第4項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):7 0預(yù)期結(jié)果: A-B=9X14+3X10-X8+5X6-2測試結(jié)果:預(yù)期結(jié)果與測試結(jié)果相同,相減算法正確!(3)A*B A=2X12+1 B=-6X20+X7+5輸入:請(qǐng)輸入多項(xiàng)式A項(xiàng)數(shù):2請(qǐng)輸入第1項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):2 12請(qǐng)輸入第2項(xiàng)的系數(shù)與指數(shù)(空

23、格或回車隔開):7 0請(qǐng)輸入多項(xiàng)式B項(xiàng)數(shù):3請(qǐng)輸入第1項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):6 20請(qǐng)輸入第2項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):1 7請(qǐng)輸入第3項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):5 0預(yù)期結(jié)果: A*B=:12X32+42X20+2X19+10X12+7X7+35測試結(jié)果:預(yù)期結(jié)果與測試結(jié)果相同,相乘算法正確!A/B A=X2+X+1 B=X+1輸入:請(qǐng)輸入多項(xiàng)式A項(xiàng)數(shù):3請(qǐng)輸入第1項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):1 2請(qǐng)輸入第2項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):1 1請(qǐng)輸入第3項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):1 0請(qǐng)輸入多項(xiàng)式B項(xiàng)數(shù):2請(qǐng)輸入第1項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開

24、):1 1請(qǐng)輸入第2項(xiàng)的系數(shù)與指數(shù)(空格或回車隔開):1 0預(yù)期結(jié)果: A/B=X1測試結(jié)果:預(yù)期結(jié)果與測試結(jié)果相同,相除算法正確!特別地:當(dāng)除數(shù)為0時(shí),(5)多項(xiàng)式A在X處的值,就拿上面相除的多項(xiàng)式,給X賦值為2,則預(yù)期結(jié)果應(yīng)該為: A=X2+X+1=22+2+1=7測試結(jié)果:預(yù)期結(jié)果與測試結(jié)果相同,定值計(jì)算算法正確!3 總結(jié)1、設(shè)計(jì)過程的感受與體會(huì)一學(xué)期的時(shí)間,學(xué)完了數(shù)據(jù)結(jié)構(gòu),接下來就是要學(xué)以致用,做課程設(shè)計(jì)。雖然數(shù)據(jù)結(jié)構(gòu)是一門公認(rèn)的比較難的課程,自己學(xué)起來也覺得有些吃力,但在本次課程設(shè)計(jì)之前,我系統(tǒng)地把教科書復(fù)習(xí)了一遍,大大加深了對(duì)各種數(shù)據(jù)結(jié)構(gòu)的理解,運(yùn)用起來更加自如。不斷地翻閱各種參考

25、書,以及在老師和同學(xué)的幫助下,基本上考慮到了所有的邊界情況,反復(fù)測試各種類型的數(shù)據(jù),強(qiáng)化程序的健壯性,最終順利完成了本次課程設(shè)計(jì)。 完成設(shè)計(jì)后,我覺得收獲不少,首先是自己首次應(yīng)用所學(xué)知識(shí)做出了這個(gè)一元稀疏多項(xiàng)式計(jì)算器程序,以前從未做過這樣大(這是對(duì)我而言,在專業(yè)人仕看來是小菜一碟)的程序,多少心里有點(diǎn)甜美的感覺;再次是自己本次所寫的程序基本上考慮到了所有的特殊情況,程序運(yùn)行不管輸入什么數(shù)據(jù)都不會(huì)有差錯(cuò),這對(duì)個(gè)人來講是一個(gè)很大的進(jìn)步。完成設(shè)計(jì)是在一定時(shí)間內(nèi)完成的,在完成這個(gè)設(shè)計(jì)時(shí),我做得顯然有一些緊迫,我想是沒合理安排好時(shí)間和開始態(tài)度不正確所致,做完后我覺得合理安排時(shí)間是非常重要的,否則可能時(shí)間

26、已到而還無法完成或完成得倉促,應(yīng)合理安排時(shí)間給各個(gè)環(huán)結(jié)。2、遇到的問題與解決方法在本次課程設(shè)計(jì)中,遇到的最大問題就是線性表的操作,特別是很多臨界條件的判斷問題,花了很多大功夫調(diào)試。后來經(jīng)過老師和同學(xué)的指點(diǎn),發(fā)現(xiàn)其實(shí)很簡單,只是自己把它想得太復(fù)雜了。還有一些比較細(xì)微的問題,大部分是由于粗心所致,粗心的毛病還是很難改變,這是程序設(shè)計(jì)的大忌。參考文獻(xiàn)1 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版).北京:清華大學(xué)出版社,2007.2 李根強(qiáng). 數(shù)據(jù)結(jié)構(gòu)(C+版)習(xí)題解答及實(shí)訓(xùn)指導(dǎo). 北京:中國水利水電出版社,2005.3 高飛,聶青,李蕙芳,薛艷明. C+與數(shù)據(jù)結(jié)構(gòu). 北京:北京理工大學(xué)出版社,2006.9

27、.附錄A源代碼:#if !defined _STRUCT_H#define _STRUCT_H#include#include#includetypedef struct Polynomial /結(jié)點(diǎn)類型 float coef; /系數(shù)int exp; /指數(shù)Polynomial *next;*Polyn; /Polyn為結(jié)點(diǎn)指針類型void PrintPolyn(Polyn P); /輸出多項(xiàng)式void Insert(Polyn p,Polyn head); /插入結(jié)點(diǎn)Polyn CreatePolyn(Polyn head,int m) ; /創(chuàng)建多項(xiàng)式void DestroyPolyn(

28、Polyn p); /銷毀多項(xiàng)式int compare(Polyn a,Polyn b); /多項(xiàng)式指數(shù)比較Polyn AddPolyn(Polyn pa,Polyn pb); /加法Polyn SubPolyn(Polyn pa,Polyn pb); /減法Polyn MultiplyPolyn(Polyn pa,Polyn pb); /乘法void DevicePolyn(Polyn pa,Polyn pb); /除法float ValuePolyn(Polyn head,float x); /多項(xiàng)式的值#endif#includestruct.h/* 輸出多項(xiàng)式 */void Print

29、Polyn(Polyn P) Polyn q=P-next; int flag=1; /項(xiàng)數(shù)計(jì)數(shù)器if(!q) /若多項(xiàng)式為空,輸出0 putchar(0); printf(n);return; while(q)if(q-coef0&flag!=1) /系數(shù)大于0且不是第一項(xiàng)putchar(+); if(q-coef!=1&q-coef!=-1) /系數(shù)非1或-1 printf(%g,q-coef); if(q-exp=1) putchar(X);else if(q-exp) printf(X%d,q-exp);elseif(q-coef=1)if(!q-exp) putchar(1); el

30、se if(q-exp=1) putchar(X); else printf(X%d,q-exp);if(q-coef=-1)if(!q-exp) printf(-1); else if(q-exp=1) printf(-X); else printf(-X%d,q-exp);q=q-next; flag+;printf(n);/* 插入結(jié)點(diǎn),按指數(shù)降序排列 */void InsertNode(Polyn p,Polyn head) if(p-coef=0) delete p; /釋放系數(shù)為0的結(jié)點(diǎn)elsePolyn q1,q2;q1=head;q2=head-next;while(q2!=N

31、ULL&p-expexp) /查找插入位置, q1=q2;q2=q2-next;if(q2!=NULL&p-exp=q2-exp) /將指數(shù)相同的合并 q2-coef+=p-coef; /系數(shù)相加delete p; /釋放pif(!q2-coef) /釋放系數(shù)為0的結(jié)點(diǎn) q1-next=q2-next;delete q2;else /無相同指數(shù)時(shí)將該結(jié)點(diǎn)插入 p-next=q2;q1-next=p;/* 創(chuàng)建多項(xiàng)式 */Polyn CreatePolyn(Polyn head,int m) /頭指針為head、項(xiàng)數(shù)為m Polyn p;p=head=new Polynomial; /生成頭結(jié)點(diǎn)

32、head-next=NULL;for(int i=0;icoef,&p-exp);InsertNode(p,head); /調(diào)用InsertNode函數(shù)插入結(jié)點(diǎn)return head;int Compare(Polyn a,Polyn b)/依a的指數(shù)值b的指數(shù)值,分別返回-1、0或1if(a&b)if(!b|a-expb-exp) return 1;else if(!a|a-expexp) return -1;else return 0;else if(!a&b) return -1; /a多項(xiàng)式為空,但b多項(xiàng)式非空else return 1; /b多項(xiàng)式為空,但a多項(xiàng)式非空/* 銷毀多項(xiàng)式

33、 */void DestroyPolyn(Polyn p) /銷毀多項(xiàng)式p Polyn q1,q2;q1=p-next;if(q1=NULL) /結(jié)果系數(shù)為0的情況return ;q2=q1-next;while(q1-next)delete q1;q1=q2; /指針后移q2=q2-next;/* 求解并建立多項(xiàng)式A+B */Polyn AddPolyn(Polyn pa,Polyn pb) Polyn qa=pa-next;Polyn qb=pb-next;Polyn heada,hc,qc;hc=new Polynomial; /建立頭結(jié)點(diǎn)hc-next=NULL;heada=hc;wh

34、ile(qa|qb)qc=new Polynomial;switch(Compare(qa,qb)case 1: /a項(xiàng)的指數(shù)大于b項(xiàng)的指數(shù)qc-coef=qa-coef;qc-exp=qa-exp;qa=qa-next;break;case 0: /a項(xiàng)的指數(shù)等于b項(xiàng)的指數(shù) qc-coef=qa-coef+qb-coef;qc-exp=qa-exp;qa=qa-next;qb=qb-next;break;case -1: /a項(xiàng)的指數(shù)小于b項(xiàng)的指數(shù)qc-coef=qb-coef;qc-exp=qb-exp;qb=qb-next;break; if(qc-coef!=0)qc-next=hc-

35、next;hc-next=qc;hc=qc;else delete qc; /當(dāng)相加系數(shù)為0時(shí),釋放該結(jié)點(diǎn)return heada; /返回其頭指針/* 求解并建立多項(xiàng)式A-B */Polyn SubPolyn(Polyn pa,Polyn pb) Polyn p1,p2,heads;p1=pb;p2=pb-next;while(p2) p2-coef*=-1; /將pb的系數(shù)取反p2=p2-next;heads=AddPolyn(pa,p1);for(p2=p1-next;p2;p2=p2-next) /恢復(fù)pb的系數(shù)p2-coef*=-1;return heads; /返回其頭指針/* 求

36、解并建立多項(xiàng)式A*B */Polyn MultiplyPolyn(Polyn pa,Polyn pb) Polyn headf,qc;Polyn qa=pa-next;Polyn qb=pb-next;headf=new Polynomial; /建立頭結(jié)點(diǎn)headf-next=NULL;for(;qa;qa=qa-next)for(qb=pb-next;qb;qb=qb-next) qc=new Polynomial;qc-coef=qa-coef*qb-coef;qc-exp=qa-exp+qb-exp;InsertNode(qc,headf); /調(diào)用InsertNode函數(shù)合并指數(shù)相同

37、的項(xiàng)return headf; /返回其頭指針/* 求解并建立多項(xiàng)式A/B */void DevicePolyn(Polyn pa,Polyn pb) Polyn quotient,remainder,temp1,temp2;Polyn qa=pa-next;Polyn qb=pb-next;quotient=new Polynomial; /建立頭結(jié)點(diǎn),存儲(chǔ)商quotient-next=NULL;remainder=new Polynomial; /建立頭結(jié)點(diǎn),存儲(chǔ)余數(shù)remainder-next=NULL;temp1=new Polynomial;temp1-next=NULL;temp2

38、=new Polynomial;temp2-next=NULL;temp1=AddPolyn(temp1,pa);while(qa!=NULL&qa-exp=qb-exp)temp2-next=new Polynomial;temp2-next-coef=(qa-coef)/(qb-coef);temp2-next-exp=(qa-exp)-(qb-exp);InsertNode(temp2-next,quotient);pa=SubPolyn(pa,MultiplyPolyn(pb,temp2);qa=pa-next;temp2-next=NULL;remainder=SubPolyn(temp1,MultiplyPolyn(quotient,pb);pb=temp1;printf(t商:);PrintPolyn(quotient);printf(t余數(shù):);PrintPolyn(remainder);/* 輸入x值,計(jì)算并返回多項(xiàng)式的值 */float ValuePolyn(Polyn head,float x)Polyn p;int i;float sum=0,t;for(p=head-next;p;p=p-next)t=1;for(i=p-exp;i!=0;)if(icoef*t;retu

溫馨提示

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

評(píng)論

0/150

提交評(píng)論