




已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一元稀疏多項(xiàng)式簡(jiǎn)單計(jì)數(shù)器題目:編制一個(gè)演示一元稀疏多項(xiàng)式簡(jiǎn)單計(jì)數(shù)器的程序班級(jí):計(jì)算機(jī)科學(xué)與技術(shù)1301班 姓名:劉濛 學(xué)號(hào):201321091026 完成日期:2015.4.9一、需求分析1.1本演示程序中,多項(xiàng)式是以帶頭結(jié)點(diǎn)的單鏈表存儲(chǔ)的,在單鏈表中有兩個(gè)數(shù)據(jù)域,分別存儲(chǔ)多項(xiàng)式的一個(gè)節(jié)點(diǎn)的系數(shù),指數(shù);還有一個(gè)指針域,存儲(chǔ)指向下一個(gè)節(jié)點(diǎn)的指針。1.2演示程序以用戶(hù)和計(jì)算機(jī)的對(duì)話(huà)方式執(zhí)行,即在計(jì)算機(jī)終端上顯示“提示信息”之后,由用戶(hù)在鍵盤(pán)上輸入演示程序中規(guī)定的運(yùn)算命令;相應(yīng)的輸入數(shù)據(jù)和運(yùn)算結(jié)果顯示在其后。1.3程序執(zhí)行的命令包括:1)構(gòu)造多項(xiàng)式a;2)構(gòu)造多項(xiàng)式b;3)輸出多項(xiàng)式,并且多項(xiàng)式的序列按指數(shù)的降序排列;4)求a+b;5)求a-b;6)求a*b;7) 求多項(xiàng)式a的導(dǎo)函數(shù)a;8)求多項(xiàng)式在x處的值。1.4測(cè)試數(shù)據(jù)(1)(2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7)(2)(6x(-3)-x+4.4x2-1.2x9)-(-6x(-3)+5.4x2-x2-x2+7.8x15)=(-7.8x15-1.2x9+12x(-3)-x)(3)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)(4)(x+x3)+(-x-x3)=0(5)(x+x100)+(x100+x200)=(x+2x100+x200)(6)(x+x2+x3)+0=x+x2+x3(7)互換上述測(cè)試數(shù)據(jù)中的前后兩個(gè)多項(xiàng)式二、概要設(shè)計(jì)為實(shí)現(xiàn)上述程序的功能,應(yīng)以帶頭結(jié)點(diǎn)的單鏈表表示多項(xiàng)式。為此,需要一個(gè)抽象數(shù)據(jù)類(lèi)型:?jiǎn)捂湵怼?.1單鏈表的抽象數(shù)據(jù)類(lèi)型定義ADT LinkList數(shù)據(jù)對(duì)象:D=ai|aiTermSet,i=1,2,m,m0 TermSet中的每個(gè)元素包含一個(gè)表示系數(shù)的實(shí)數(shù)和表示指數(shù)的整數(shù)數(shù)據(jù)關(guān)系:R1=ai-1,aiD且ai-1中的指數(shù)值next=null;return ture;void FreeNode(LinkList &p) /釋放p所指結(jié)點(diǎn)free(q1); q1=q2; q2=q2-next;3.2單鏈表的基本操作設(shè)置如下:void Insert(LinkList p,LinkList h); /將節(jié)點(diǎn)p插入到多項(xiàng)式鏈表hLinkList CreateLinkList(LinkList head,int m);/建立一個(gè)頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式,并返回該多項(xiàng)式的頭結(jié)點(diǎn);/若分配空間失敗,則返回FALSEvoid DestroyLinkList(LinkList p);/銷(xiāo)毀多項(xiàng)式pvoid PrintLinkList(LinkList P);/輸出構(gòu)造的一元多項(xiàng)式PStatus compare(LinkList a,LinkList b) /節(jié)點(diǎn)進(jìn)行比較: a的指數(shù) b的指數(shù) return 1; a的指數(shù)=b的指數(shù) return 0;a的指數(shù)next=NULL; for(i=0;icoef,&p-expn); Insert(p,head); /調(diào)用Insert函數(shù)插入結(jié)點(diǎn) return head;/ CreateLinkListStatus compare(LinkList a,LinkList b) if(a&b) if(!b|a-expnb-expn) return 1; else if(!a|a-expnexpn) 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)式非空/ comparefloat ValueLinkList(LinkList head,int x) /輸入x值,計(jì)算并返回多項(xiàng)式的值 for(p=head-next;p;p=p-next) t=1; for(i=p-expn;i!=0;) / i 為指數(shù)的系數(shù) pow(x,i) if(icoef*t; return sum;/ ValueLinkListLinkList MultiplyLinkList(LinkList pa,LinkList pb)/求解并建立多項(xiàng)式a*b,返回其頭指針 LinkList qa=pa-next; LinkList qb=pb-next; hf=(LinkList)malloc(sizeof(struct LNode);/建立頭結(jié)點(diǎn) hf-next=NULL; for(;qa;qa=qa-next) for(qb=pb-next;qb;qb=qb-next) pf=(LinkList)malloc(sizeof(struct LNode); pf-coef=qa-coef*qb-coef; pf-expn=qa-expn+qb-expn; Insert(pf,hf); /調(diào)用Insert函數(shù)以合并指數(shù)相同的項(xiàng)return hf;/ MultiplyLinkList3.3主函數(shù)和其他函數(shù)的偽碼算法void main()/主函數(shù)Initiation(); /多項(xiàng)式初始化 PrintCommand();/輸出菜單 while(1) /循環(huán)一直為真 知道選擇j|J即退出命令時(shí),程序退出 printf(n請(qǐng)選擇操作:); scanf(%c,&flag); Interpter(flag); /具體的操作命令/mainvoid Initiation() printf(請(qǐng)輸入a的項(xiàng)數(shù):); scanf(%d,&m); pa=CreateLinkList(pa,m);/建立多項(xiàng)式a printf(請(qǐng)輸入b的項(xiàng)數(shù):); scanf(%d,&n); pb=CreateLinkList(pb,n);/建立多項(xiàng)式bprintf(-多項(xiàng)式已創(chuàng)建-n);/ Initiationvoid PrintCommand() /輸出菜單顯示鍵入命令的提示信息;Printf(A,B,C,D,E,F,G,H,I,J);/ PrintCommandvoid Interpter(char flag) /具體的操作命令 switch(flag) case A: case a: PrintLinkList(pa); break;case B:case b: PrintLinkList(pb); break;caseC: casec: pc=Derivative(pa); PrintLinkList(pc);break;caseD: cased: Derivative(pb); PrintLinkList(pc); break;caseE: casee: ValueLinkList(pa,x);break;caseF: casef: ValueLinkList(pb,x);break;caseG: caseg: AddLinkList(pa,pb); PrintLinkList(pc); break; caseH: caseh: SubtractLinkList(pa,pb);PrintLinkList(pc); break;caseI:casei:pc=MultiplyLinkList(pa,pb);); PrintLinkList(pc);break;caseJ:casej: DestroyLinkList(pa); DestroyLinkList(pb);exit(0) ; default:printf(n 您的選擇錯(cuò)誤,請(qǐng)重新選擇!n); / Interpter3.4函數(shù)的調(diào)用關(guān)系圖反映了演示程序的層次結(jié)構(gòu):Main Initiation PrintCommand Interpter CreateLinkList PrintLK Derivative ValueLK AddLK SubtractLK MultiplyLK DestroyLK PrintLK PrintLK PrintLK PrintLK exit(0)說(shuō)明LK :LinkList 即多項(xiàng)式節(jié)點(diǎn)函數(shù)說(shuō)明:Initiation(); /多項(xiàng)式初始化PrintCommand(); /輸出菜單Interpter() ; /具體的操作命令PrintLinkList() ; /打印多項(xiàng)式(降序輸出)Derivative(); /多項(xiàng)式求導(dǎo)ValueLinkList(); /多項(xiàng)式求值A(chǔ)ddLinkList() ; /兩個(gè)多項(xiàng)式相加SubtractLinkList(); /兩個(gè)多項(xiàng)式相減MultiplyLinkList(); /兩個(gè)多項(xiàng)式相乘DestroyLinkList(); /銷(xiāo)毀多項(xiàng)式compare() ; /兩個(gè)節(jié)點(diǎn)比較CreateLinkList(); /創(chuàng)建多項(xiàng)式Insert() ; /將節(jié)點(diǎn)插入已知多項(xiàng)式中四、調(diào)試分析4.1剛開(kāi)始的時(shí)候由于對(duì)多項(xiàng)式的減法考慮不周全,代碼很復(fù)雜,后來(lái)經(jīng)過(guò)仔細(xì)思考,減法時(shí)把每項(xiàng)的系數(shù)變成它的相反數(shù),然后調(diào)用加法的函數(shù)即可,但是實(shí)現(xiàn)了減法之后要把系數(shù)恢復(fù),不然會(huì)影響后面的運(yùn)算。4.2求多項(xiàng)式在x處的值的函數(shù)在剛開(kāi)始的時(shí)候出現(xiàn)過(guò)警告,雖然警告不會(huì)影響程序的運(yùn)行,但是運(yùn)算的結(jié)果不精確。之前函數(shù)的類(lèi)型是int,但是里面的多項(xiàng)式的系數(shù)是浮點(diǎn)型的,而sum又是整型的,但是這樣得不到小數(shù)點(diǎn)后面的數(shù)值,導(dǎo)致結(jié)果不精確。后來(lái)經(jīng)改進(jìn),把函數(shù)的類(lèi)型及sum的類(lèi)型均改為float型。五、用戶(hù)使用手冊(cè)5.1此程序的整體架構(gòu):主函數(shù)里有三個(gè)函數(shù),Initialization(初始化)、PrintCommand(打印命令)、Interpret(解釋并執(zhí)行命令)。在Interpret函數(shù)中調(diào)用了其他的函數(shù),以達(dá)到執(zhí)行命令的目的。5.2在輸入命令時(shí)要注意在輸入多項(xiàng)式的每一項(xiàng)的系數(shù)和指數(shù)必須有空格,否則可能會(huì)解釋命令出錯(cuò)。在完成每一條的命令輸入時(shí)要鍵入Enter.六、測(cè)試結(jié)果(程序輸入的相關(guān)命令)七、附錄(源代碼):#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status; typedef int ElemType;typedef struct LNode float coef; /定義項(xiàng)的系數(shù) ElemType expn; /定義項(xiàng)的指數(shù) struct LNode *next; /指向下一個(gè)節(jié)點(diǎn)LNode,*LinkList;/*全局節(jié)點(diǎn) 初始化多項(xiàng)式節(jié)點(diǎn)為空*/static LinkList pa=NULL;static LinkList pb=NULL;static LinkList pc=NULL;/*將節(jié)點(diǎn)p插入到多項(xiàng)式鏈表h*/void Insert(LinkList p,LinkList h) if(p-coef=0) free(p); /系數(shù)為0的話(huà)釋放結(jié)點(diǎn) else LinkList q1,q2; q1=h; q2=h-next; while(q2&p-expnexpn)/查找插入位置 q1=q2; q2=q2-next; if(q2&p-expn=q2-expn)/將指數(shù)相同相合并 q2-coef+=p-coef; free(p); if(!q2-coef)/系數(shù)為0的話(huà)釋放結(jié)點(diǎn) q1-next=q2-next; free(q2); else/指數(shù)為新時(shí)將結(jié)點(diǎn)插入 p-next=q2; q1-next=p; /創(chuàng)建一元多項(xiàng)式 LinkList CreateLinkList(LinkList head,int m) /建立一個(gè)頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式 int i; LinkList p; p=head=(LinkList)malloc(sizeof(struct LNode); head-next=NULL; for(i=0;icoef,&p-expn); Insert(p,head);/調(diào)用Insert函數(shù)插入結(jié)點(diǎn) return head;void DestroyLinkList(LinkList p)/銷(xiāo)毀多項(xiàng)式p LinkList q1,q2; q1=p-next; q2=q1-next; while(q1-next)free(q1); q1=q2; q2=q2-next;/輸出構(gòu)造的一元多項(xiàng)式Pvoid PrintLinkList(LinkList P)LinkList 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) putchar(+); /系數(shù)大于0且不是第一項(xiàng) 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);/ 節(jié)點(diǎn)進(jìn)行比較/ a的指數(shù) b的指數(shù) return 1/ a的指數(shù)=b的指數(shù) return 0/ a的指數(shù)expnb-expn) return 1; else if(!a|a-expnexpn) 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)式非空LinkList AddLinkList(LinkList pa,LinkList pb)/求解并建立多項(xiàng)式a+b,返回其頭指針 LinkList qa=pa-next; LinkList qb=pb-next; LinkList headc,hc,qc; hc=(LinkList)malloc(sizeof(struct LNode);/建立頭結(jié)點(diǎn) hc-next=NULL; headc=hc; while(qa|qb) qc=(LinkList)malloc(sizeof(struct LNode); 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; if(qc-coef!=0) qc-next=hc-next; hc-next=qc; hc=qc; else free(qc);/當(dāng)相加系數(shù)為0時(shí),釋放該結(jié)點(diǎn) return headc;LinkList SubtractLinkList(LinkList pa,LinkList pb)/求解并建立多項(xiàng)式a-b,返回其頭指針 LinkList h=pb; LinkList p=pb-next; LinkList pd; while(p) /將pb的系數(shù)取反 p-coef*=-1; p=p-next; pd=AddLinkList(pa,h); for(p=h-next;p;p=p-next) /恢復(fù)pb的系數(shù) p-coef*=-1; return pd;float ValueLinkList(LinkList head,int x)/輸入x值,計(jì)算并返回多項(xiàng)式的值 LinkList p; int i; int t;float sum=0; for(p=head-next;p;p=p-next) t=1; for(i=p-expn;i!=0;) / i 為指數(shù)的系數(shù) pow(x,i) if(icoef*t; return sum;/求解并建立導(dǎo)函數(shù)多項(xiàng)式,并返回其頭指針 對(duì)多項(xiàng)式進(jìn)行求導(dǎo) y=.LinkList Derivative(LinkList head)/求解并建立導(dǎo)函數(shù)多項(xiàng)式,并返回其頭指針 LinkList q=head-next,p1,p2,hd; hd=p1=(LinkList)malloc(sizeof(struct LNode);/建立頭結(jié)點(diǎn) hd-next=NULL; while(q) if(q-expn!=0) /該項(xiàng)不是常數(shù)項(xiàng)時(shí) p2=(LinkList)malloc(sizeof(struct LNode); p2-coef=q-coef*q-expn; p2-expn=q-expn-1; p2-next=p1-next;/連接結(jié)點(diǎn) p1-next=p2; p1=p2; q=q-next; return hd;LinkList MultiplyLinkList(LinkList pa,LinkList pb)/求解并建立多項(xiàng)式a*b,返回其頭指針 LinkList hf,pf; LinkList qa=pa-next; LinkList qb=pb-next; hf=(LinkList)malloc(sizeof(struct LNode);/建立頭結(jié)點(diǎn) hf-next=NULL; for(;qa;qa=qa-next) for(qb=pb-next;qb;qb=qb-next) pf=(LinkList)malloc(sizeof(struct LNode); pf-coef=qa-coef*qb-coef; pf-expn=qa-expn+qb-expn; Insert(pf,hf);/調(diào)用Insert函數(shù)以合并指數(shù)相同的項(xiàng) return hf;/多項(xiàng)式初始化void Initiation() int m, n ; printf(請(qǐng)輸入a的項(xiàng)數(shù):); scanf(%d,&m); pa=CreateLinkList(pa,m);/建立多項(xiàng)式a printf(請(qǐng)輸入b的項(xiàng)數(shù):); scanf(%d,&n); pb=CreateLinkList(pb,n);/建立多項(xiàng)式bprintf(-多項(xiàng)式已創(chuàng)建-n);/輸出菜單void PrintCommand()printf(*n);printf(*n);printf( *多項(xiàng)式操作程序 *n);printf( * *n);printf( * A:輸出多項(xiàng)式aB:輸出多項(xiàng)式b *n);printf( * *n);printf( * C:輸出a的導(dǎo)數(shù) D:輸出b的導(dǎo)數(shù) *n);printf( * *n);printf( * E:代入x的值計(jì)算a :代入x的值計(jì)算b *n);printf( * *n);printf( * G:輸出a+bH:輸出a-b *n);printf( * *n);printf( * I:輸出a*b J:退出程序 *n);printf( * *n);printf( *n);printf( *n);void Interpter(char flag) /具體的操作命令int x ;scanf(%c,&flag);switch(flag)case A: case a: printf(n多項(xiàng)式a=); PrintLinkList(pa); break; case B: case b:printf(n 多項(xiàng)式b=); PrintLinkList(pb); break; caseC: casec:pc=Derivative(pa); printf(n 多項(xiàng)式a的導(dǎo)函數(shù)為:a=); PrintLinkList(pc); br
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 牛津譯林版七年級(jí)英語(yǔ)上冊(cè)教學(xué)計(jì)劃(含進(jìn)度表)
- 2025年黨章黨史國(guó)史國(guó)情知識(shí)競(jìng)賽題庫(kù)及答案(共220題)
- 新型家庭醫(yī)生簽約服務(wù)對(duì)促進(jìn)轄區(qū)孕產(chǎn)婦管理的效果分析
- 《單片機(jī)技術(shù)應(yīng)用》 課件
- 節(jié)能環(huán)保居間服務(wù)合同范例
- 道路交通規(guī)劃方案介紹
- 低空經(jīng)濟(jì)行業(yè)報(bào)告
- 醫(yī)院裝修大包合同參考范本
- 投資可行性分析報(bào)告包括哪些內(nèi)容
- 低空經(jīng)濟(jì)涉及的行業(yè)
- qc工作崗位職責(zé)
- 【體能大循環(huán)】聚焦體能循環(huán)-探索運(yùn)動(dòng)奧秘-幼兒園探究體能大循環(huán)有效開(kāi)展策略課件
- 采購(gòu)人員廉潔從業(yè)課件培訓(xùn)
- 2024年單招計(jì)算機(jī)試題題庫(kù)及答案
- XX藥業(yè)公司受試者日記卡
- 多組學(xué)數(shù)據(jù)的整合與分析
- 小學(xué)安全教育《平安校園 拒絕欺凌》劉偉【省級(jí)】?jī)?yōu)質(zhì)課
- 靜脈輸液的不良反應(yīng)及處理原則考核試題及答案
- 水利設(shè)施維護(hù)投標(biāo)方案(技術(shù)標(biāo))
- 《建筑概論》期末考試試卷附答案
- 中國(guó)銀行供應(yīng)鏈融資
評(píng)論
0/150
提交評(píng)論