C語言課程設(shè)計任務(wù)書.doc_第1頁
C語言課程設(shè)計任務(wù)書.doc_第2頁
C語言課程設(shè)計任務(wù)書.doc_第3頁
C語言課程設(shè)計任務(wù)書.doc_第4頁
C語言課程設(shè)計任務(wù)書.doc_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

信息科學(xué)與工程學(xué)院綜合設(shè)計報告書課程名稱: C語言課程設(shè)計 班 級: 學(xué) 號: 姓 名: 指導(dǎo)教師: 目 錄(一) 需求分析.2-31 設(shè)計題目; 2 用戶操作流程;3 數(shù)據(jù)處理流程;(二)概要設(shè)計.4-51 系統(tǒng)總體設(shè)計框架;2 系統(tǒng)功能模塊圖;(三)詳細(xì)設(shè)計.5-111 主要功能模塊的算法設(shè)計思路;2 工作流程圖;(四)主要源程序代碼.12-211 完整源程序清單及關(guān)鍵注釋;(五)調(diào)試分析過程描述.21-241 測試數(shù)據(jù)、測試輸出結(jié)果;2 對程序調(diào)試過程中存在問題的思考;(六)課程設(shè)計小結(jié).24-251 包括課程設(shè)計過程中的學(xué)習(xí)體會與收獲;2 對C語言和本課程設(shè)計的認(rèn)識以及自己的建議等內(nèi)容。一、 需求分析1、 設(shè)計題目:編程實現(xiàn)以下功能:(1) 分別輸入一元多項式pn (x)和Q n (x)。從鍵盤輸入一元多項式中各項的系數(shù)和指數(shù),并用單鏈表加以表示。(2) 分別對一元多項式pn (x)和Q n (x)進(jìn)行升冪排序。將一元多項式中各子項按照指數(shù)從小到大的順序排序。(3) 分別輸出一元多項式pn (x)和Q n (x)。 將用單鏈表表示的一元多項式輸出,即打印多項式的系數(shù)和指數(shù)。(4) 任意輸入一個實數(shù)x0,分別求出一元多項式pn (x0)和Q n (x0)的值。(5) 已知有兩個一元多項式分別為Pn (x)和Qn (x),求出兩個多項式的和R n (x)和差T n (x),分別用單鏈表表示R n (x)和T n (x),并將二者輸出,(R n (x)=P n (x)+Q n (x),T n (x)=P n (x)-Q n (x))2、 用戶操作流程:(1) 進(jìn)入歡迎及界面。(2) 根據(jù)提示選擇需要的功能。(3) 根據(jù)提示輸入數(shù)據(jù).(4) 選擇函數(shù)輸出運行結(jié)果。(5) 退出本系統(tǒng)。3、 數(shù)據(jù)處理流程(1) 輸入數(shù)據(jù),通過鏈表存儲P(x)和Q(x)的指數(shù)和系數(shù)。(2) 通過冒泡排序法對P(x)和Q(x)進(jìn)行升冪排序。(3) 輸入x0,通過指針將其帶入P(x)和Q(x)的表達(dá)式求出具體的數(shù)值。(4) 通過鏈表對兩個多項式求和求差。(5) 通過鏈表輸出運行結(jié)果。;二、 概要設(shè)計1、 系統(tǒng)總體設(shè)計框架:主程序功能選擇函數(shù)函數(shù)求差求和函數(shù)輸入數(shù)據(jù)函數(shù)升冪函數(shù)賦值函數(shù)輸出結(jié)果函數(shù)2、 系統(tǒng)功能模塊(1) 功能選擇函數(shù):通過輸入對應(yīng)功能的數(shù)字,進(jìn)行多項式的運算。該函數(shù)在主函數(shù)中調(diào)用。(2) 輸入數(shù)據(jù)函數(shù):通過建立單鏈表,輸入兩個多項式的各項指數(shù)和系數(shù)。(3) 升冪函數(shù):通過冒泡排序法對兩個多項式進(jìn)行升冪排序。(4) 求和求差函數(shù):定義空鏈用來存儲結(jié)果,將兩個多項式相加減。(5) 輸出函數(shù):輸出上一步的運行結(jié)果。三、 詳細(xì)設(shè)計 一元多項式的表示在計算機(jī)內(nèi)可以用鏈表來表示,為了節(jié)省存儲空間,只存儲多項式中系數(shù)非零的項。鏈表中的每一個結(jié)點存放多項式的一個系數(shù)非零項,它包含三個域,分別存放該項的系數(shù)、指數(shù)以及指向下一個多項式項結(jié)點的指針。創(chuàng)建一元多項式鏈表,對一元多項式的運算中會出現(xiàn)的各種可能情況進(jìn)行分析,實現(xiàn)一元多項式的相加、相減操作。多項式相加的運算規(guī)則是:兩個多項式中所有指數(shù)相同的項的對應(yīng)系數(shù)相加,若和部位零,則構(gòu)成“和多項式”中的一項;所有指數(shù)不相同的的項均“復(fù)抄”到“和多項式”中。以單鏈表作為存儲結(jié)構(gòu),并且“和多項式”中的節(jié)點無需另外生成,則可看做是將多項式Q加到多項式P中,由此得到下列運算規(guī)則: 若p-expexp,則結(jié)點p所指的結(jié)點應(yīng)是“和多項式”中的一項,令指針p后移。若p-expexp,則結(jié)點q所指的結(jié)點應(yīng)是“和多項式”中的一項,將結(jié)點q插入在結(jié)點p之前,且令指針q在原來的鏈表上后移。若p-exp=q-exp,則將兩個結(jié)點的系數(shù)相加,當(dāng)和不為零是修改結(jié)點p的系數(shù),釋放q結(jié)點;若和為零,則“和多項式”中無 o此項,從P中p結(jié)點,同時釋放p和q結(jié)點。多項式相減運算規(guī)則同加法。設(shè)計思路:實現(xiàn)的方法是先定義多項式結(jié)點的結(jié)構(gòu),該多項式每個結(jié)點由三個元素:輸入的系數(shù)、輸入的指數(shù)、以及指向下一個結(jié)點的指針構(gòu)成。該鏈表采用鏈?zhǔn)酱鎯Y(jié)構(gòu)。然后通過多次的輸入,依次得到兩個一元多項式的各個項的系數(shù)與指數(shù)。該輸入以零結(jié)尾。然后通過對結(jié)點的判斷是否為零后,進(jìn)行運算或者終止的操作。再初始化一個鏈表LC,將LC的各項系數(shù)和指數(shù)的指針指向LA+LB所得的結(jié)果的值,完成了最后的輸出。(1)定義結(jié)構(gòu)體struct結(jié)構(gòu)體為表示一個對象的不同屬性提供了連貫一致的方法,結(jié)構(gòu)體類型的說明從關(guān)鍵詞struct開始,成員可以由各種數(shù)據(jù)類型混合構(gòu)成,成員甚至還可以是數(shù)組或者其他類型的結(jié)構(gòu),但是,結(jié)構(gòu)體中不能包含自身定義類型的成員。使用typedef和struct定義的新類型名稱,其用途與內(nèi)建類型的名稱相同,可以用來:聲明和初始化結(jié)構(gòu)體變量;創(chuàng)建并根據(jù)自己的意愿初始化結(jié)構(gòu)數(shù)組; (2) 單鏈表的建立單鏈表有兩個域,data域和next域,一個是存放數(shù)據(jù),一個是存放指針而且指向它的后繼。并且還有個head,稱表結(jié)點,它一般不存放數(shù)據(jù),只是做個特殊標(biāo)記。表的結(jié)束是NULL,也就是最后的那個鏈域next為空單鏈表的插入運算有兩種,一種是頭插法,另一種是尾插法,這里運用的是尾插法(3)一元多項式的建立輸入多項式采用插頭的方式,輸入多項式中一個項的系數(shù)和指數(shù),就產(chǎn)生一個新的節(jié)點,建立起它的右指針,并用頭節(jié)點指向它;為了判斷一個多項式是否結(jié)束,定義一個結(jié)束標(biāo)志,并輸入非0時就繼續(xù),當(dāng)輸入0時,就結(jié)束一個多項式的輸入(4)顯示一元多項式如果系數(shù)是大于0的話就輸出+系數(shù)x指數(shù)形式;如果系數(shù)小于0的話輸出系數(shù)x指數(shù)形式;如果指數(shù)為0的話,直接輸出系數(shù);如果系數(shù)是的話就直接輸出+x;如果系數(shù)是-1的話直接輸出-x輸出多項式 (5)一元多項式的加法計算它從兩個多項式的頭部開始,兩個多項式的某一項都不為空時,如果數(shù)相等的話,系數(shù)就應(yīng)該相加;相加的和不為0的話,用頭插法建立一個新的節(jié)點。p的指數(shù)小于q的指數(shù)的話,就應(yīng)該復(fù)制q節(jié)點到多項式中。p的指數(shù)大于q的指數(shù)的話,就應(yīng)該復(fù)制p節(jié)點到多形式中。當(dāng)?shù)诙€多項式為空時,第一個多項式不為空時,將第一個多項式用心節(jié)點產(chǎn)生。當(dāng)?shù)谝粋€多項式為空,第二個多項式不為空時,將第二個多項式用新節(jié)點產(chǎn)生(6)一元多項式的減法計算它從兩個多項式的頭部開始,兩個多項式的某一項都不為空時,如果數(shù)相等的話,系數(shù)就應(yīng)該相減;相加的和不為0的話,用頭插法建立一個新的節(jié)點。p的指數(shù)小于q的指數(shù)的話,就應(yīng)該復(fù)制q節(jié)點到多項式中。p的指數(shù)大于q的指數(shù)的話,就應(yīng)該復(fù)制p節(jié)點到多形式中。并且建立的節(jié)點的系數(shù)為原來的相反數(shù);當(dāng)?shù)诙€多項式為空時,第一個多項式不為空時,將第一個多項式用心節(jié)點產(chǎn)生。當(dāng)?shù)谝粋€多項式為空,第二個多項式不為空時,將第二個多項式用新節(jié)點產(chǎn)生,并且建立的節(jié)點系數(shù)為原來的相反數(shù)。數(shù)學(xué)模型:在數(shù)學(xué)上,一個一元多項式Pn(x)可按升冪寫成 :Pn(x)=p0+p1x+p2x2+pnxn它由n+1個系數(shù)唯一確定,因此,在計算機(jī)中它可用一個線性表P來表示:P=(p0 ,p1,p2,pn)每一項的指數(shù)i隱含在其系數(shù)Pi的序號里,每一項的值順序為各個多項式的系數(shù)值。加法模型:假設(shè) Qm(X)是一元m次多項式,同樣可用線性表Q來表示:Q=(q0,q1,q2,qm)不失一般性,設(shè)mm ,相加的結(jié)果也可以用單鏈表來表示,規(guī)則是相同指數(shù)的項的系數(shù)相加,所以P(x)+Q(x)=(p0+q0,p1+q1pm+qm,pm+1pn),例如:P(x)=2x4+5x2+3x+1,Q(x)=3x2+1,相加后R(x)= 2x4+8x2+3x+2,用一維向量表表示分別為(1,3,5,0,2)+(1,0,3,)=(2,3,8,0,2),寫成數(shù)學(xué)形式即為2x4+8x2+3x+2,結(jié)論正確。減法模型同加法模型。具體函數(shù)模塊的流程圖: 功能選擇模塊: 輸入數(shù)據(jù)函數(shù): 顯示運行結(jié)果調(diào)用輸出函數(shù)結(jié)束輸入各項的指指數(shù)系數(shù)開始開始判斷輸入是否合法通過switch判斷返回哪一個功能函數(shù)調(diào)用該功能函數(shù)結(jié)束輸入功能函數(shù)對應(yīng)的數(shù)字 求和函數(shù)模塊:開始定義存儲結(jié)果的空鏈 r是 否輸出存儲多項式的和的鏈r結(jié)束是否同指數(shù)項系數(shù)相加后存入r中直接把p中各項存入r中直接把q中各項存入r存儲多項式2的空鏈Q(jìng)是否為空存儲多項式1的空鏈P是否為空合并同類項開始定義存儲結(jié)果的空鏈 r是 否輸出存儲多項式的和的鏈r結(jié)束是否同指數(shù)項系數(shù)相加后存入r中直接把p中各項存入r中直接把q中各項存入r存儲多項式2的空鏈Q(jìng)是否為空存儲多項式1的空鏈P是否為空合并同類項求差函數(shù)模塊:開始定義存儲結(jié)果的空鏈 r是 否輸出存儲多項式的和的鏈r結(jié)束是否同指數(shù)項系數(shù)相加后存入r中把p中各項系數(shù)改變符號后存入r中直接把q中各項存入r存儲多項式2的空鏈Q(jìng)是否為空存儲多項式1的空鏈P是否為空合并同類項四、 主要源程序代碼#include #include #include typedef struct duoxiangshi int coef; int exp; struct duoxiangshi *next;DXS;int getNum() int num; printf(輸入選擇功能對應(yīng)的數(shù)字: ); scanf(%d, &num); return num;void fun1( DXS *PHEAD, DXS *QHEAD ) int zs, xs;/定義指數(shù)系數(shù) printf(請輸入P(x)中各項的系數(shù)和指數(shù)n); scanf(%d %d, &xs, &zs); while( zs != 0 | xs != 0 ) DXS *p = (DXS*) malloc(sizeof(DXS); p-coef = xs; p-exp = zs; PHEAD-next = p; p-next = NULL; PHEAD = PHEAD-next; scanf(%d %d, &xs, &zs); printf(請輸入Q(x)中各項的系數(shù)和指數(shù)n); scanf(%d %d, &xs, &zs); while( zs != 0 |xs != 0 ) DXS *p = (DXS*) malloc(sizeof(DXS); p-coef = xs; p-exp = zs; QHEAD-next = p; p-next = NULL; QHEAD = p; scanf(%d %d, &xs, &zs); printf(輸入5顯示結(jié)果n);void fun2( DXS *PHEAD, DXS *QHEAD )/升冪排序 DXS *p, *q;/鏈表的冒泡排序 p = PHEAD-next; for( p; p != NULL; p = p-next ) for( q = p-next; q != NULL; q = q-next ) if( p-exp q-exp ) int temp; temp = p-coef; p-coef = q-coef; q-coef = temp; temp = p-exp; p-exp = q-exp; q-exp = temp; p = QHEAD-next; for( p; p != NULL; p = p-next ) for( q = p-next; q != NULL; q = q-next ) if( p-exp q-exp ) int temp; temp = p-coef; p-coef = q-coef; q-coef = temp; temp = p-exp; p-exp = q-exp; q-exp = temp; printf(輸入5顯示結(jié)果。n);void fun5( DXS *PHEAD, DXS *QHEAD ) printf(當(dāng)前保存的P(x),Q(x)序列如下:n); printf(P(x)=); while( PHEAD-next != NULL ) PHEAD = PHEAD-next; printf(%d*x%d, PHEAD-coef, PHEAD-exp); if( PHEAD-next != NULL ) printf( + ); printf(n); printf(Q(x)=); while( QHEAD-next != NULL ) QHEAD = QHEAD-next; printf(%d*x%d, QHEAD-coef, QHEAD-exp); if( QHEAD-next != NULL ) printf( + ); printf(nn);void fun4( DXS *PHEAD, DXS *QHEAD ) int x0; double sum; printf(輸入x的值: ); scanf(%d, &x0); sum = 0; while( PHEAD-next != NULL ) PHEAD = PHEAD-next; sum += PHEAD-coef * pow( x0, PHEAD-exp ); printf(P(x) = %.0lfn, sum); sum = 0; while( QHEAD-next != NULL ) QHEAD = QHEAD-next; sum += QHEAD-coef * pow( x0, QHEAD-exp ); printf(Q(x0) = %.0lfnn, sum);void fun3( DXS *PHEAD, DXS *QHEAD )/求兩個多項式的和差 fun2( PHEAD, QHEAD );/先進(jìn)行升冪排序 DXS *RHEAD, *THEAD; RHEAD = (DXS*) malloc(sizeof(DXS); THEAD = (DXS*) malloc(sizeof(DXS); RHEAD-next = NULL; THEAD-next = NULL; DXS *p = PHEAD, *q = QHEAD; /多項式相加 DXS *r = RHEAD; p = p-next; q = q-next; while( p != NULL & q != NULL )/當(dāng)兩個序列都有數(shù)值時 DXS *t = (DXS*) malloc(sizeof(DXS); if ( p-exp = q-exp )/指數(shù)相同的情況 t-coef = p-coef + q-coef; t-exp = p-exp; p = p-next; q = q-next; else if( p-exp exp )/P的指數(shù)小于Q的指數(shù) t-coef = p-coef; t-exp = p-exp; p = p-next; else if( p-exp q-exp )/P的指數(shù)大于Q的指數(shù) t-coef = q-coef; t-exp = q-exp; q = q-next; r-next = t; r = r-next; r-next = NULL; while ( p != NULL )/當(dāng)只有一個序列有數(shù)值時 DXS *t = (DXS*) malloc(sizeof(DXS); t-coef = p-coef; t-exp = p-exp; r-next = t; r = r-next; r-next = NULL; p = p-next; while ( q != NULL ) DXS *t = (DXS*) malloc(sizeof(DXS); t-coef = q-coef; t-exp = q-exp; r-next = t; r = r-next; r-next = NULL; q = q-next; r = RHEAD; printf(R(x) = ); while( r-next != NULL ) r = r-next; if (r-coef=0)if(r!=RHEAD-next)printf( + );printf(%d*x%d,r-coef,r-exp);elseprintf( - %d*x%d,-1*r-coef,r-exp); printf(nn); /多項式相減 p = PHEAD; q = QHEAD; DXS *T = THEAD; p = p-next; q = q-next; while( p != NULL & q != NULL ) DXS *t = (DXS*) malloc(sizeof(DXS); if ( p-exp = q-exp ) t-coef = p-coef - q-coef; t-exp = p-exp; p = p-next; q = q-next; else if( p-exp exp ) t-coef = p-coef; t-exp = p-exp; p = p-next; else if( p-exp q-exp ) t-coef = -1 * q-coef; t-exp = q-exp; q = q-next; T-next = t; T = T-next; T-next = NULL; while ( p != NULL ) DXS *t = (DXS*) malloc(sizeof(DXS); t-coef = p-coef; t-exp = p-exp; T-next = t; T = T-next; T-next = NULL; p = p-next; while ( q != NULL ) DXS *t = (DXS*) malloc(sizeof(DXS); t-coef = -1 * q-coef; t-exp = q-exp; T-next = t; T = T-next; T-next = NULL; q = q-next; T = THEAD;/消除系數(shù)為0項 while ( T-next != NULL ) if( T-next-coef = 0 ) T-next = T-next-next; T = T-next; if( T = NULL ) break; T = THEAD; printf(T(x) = ); while( T-next != NULL ) T = T-next; if( T-coef =0 )if(T!=THEAD-next)printf( + );printf(%d*x%d,T-coef,T-exp); else printf( - %d*x%d, -1 * T-coef, T-exp); if (THEAD-next=NULL)printf(0n);printf(n);void menu() printf(-n); printf(1.分別輸入Pn(x)和Qn(x)。n); printf(2.分別對Pn(x)和Qn(x)進(jìn)行升冪排序。n); printf(3.分別求出Pn(x)和Qn(x)的和差。n); printf(4.任意輸入一個實數(shù)x,分別求出一元多項式Pn(x)和Qn(x)的值。n); printf(5.分別輸出上一步運行結(jié)果的Pn(x)和Qn(x)。n); printf(-n); printf(If you want to exit the system,please input 0.n);int main() printf(Welcome to the menun); menu(); int num; num = getNum(); if ( num = 0 ) printf(nExit the system,goodbyen); DXS *PHEAD, *QHEAD; PHEAD = (DXS *)malloc(sizeof(DXS); QHEAD = (DXS *)malloc(sizeof(DXS); PHEAD-next = NULL; QHEAD-next = NULL; while ( num ) switch ( num ) case 1: fun1( PHEAD, QHEAD ); break; case 2: fun2( PHEAD, QHEAD ); break; case 3: fun3( PHEAD, QHEAD ); break; case 4: fun4( PHEAD, QHEAD ); break; case 5: fun5( PHEAD, QHEAD ); break; default: printf(輸入錯誤,請重新輸入nn); num = getNum(); if ( num = 0 ) printf(nExit the system,goodbye!n); return 0;五、 調(diào)試分析過程描述測試數(shù)據(jù)及實驗過程:1、歡迎界面以及選擇功能1和功能5得到的結(jié)果:2、調(diào)用功能2對應(yīng)的函數(shù)并輸出結(jié)果2、調(diào)用功能2對應(yīng)的函數(shù):3、 調(diào)用功能3對應(yīng)的函數(shù):4、 調(diào)用功能4對應(yīng)的函數(shù):5、退出本系統(tǒng): 調(diào)試:當(dāng)輸入的兩個多項式相同時,相減結(jié)果應(yīng)為0,但T(X)顯示的是0*x4。此時應(yīng)當(dāng)修改功能函數(shù),當(dāng)指數(shù)相同系數(shù)也相同的項相減時,釋放p,q指針?biāo)赶虻慕Y(jié)點,輸出0。修正常改程序后,正常輸出。在此之前也遇到了一些問題,同樣是減法函數(shù),如果P,Q中相同指數(shù)對應(yīng)的項相減時負(fù)數(shù),剛開始輸出的是“+ -x”,即加上負(fù)的差值,通過修改代碼,在原先函數(shù)功能的基礎(chǔ)上增加判斷條件:If(T-coef=o) if(T!=THEAD-next) printf(“

溫馨提示

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

評論

0/150

提交評論