




已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
一元稀疏多項(xiàng)式簡單計數(shù)器題目:編制一個演示一元稀疏多項(xiàng)式簡單計數(shù)器的程序班級:計算機(jī)科學(xué)與技術(shù)1301班 姓名:劉濛 學(xué)號:201321091026 完成日期:2015.4.9一、需求分析1.1本演示程序中,多項(xiàng)式是以帶頭結(jié)點(diǎn)的單鏈表存儲的,在單鏈表中有兩個數(shù)據(jù)域,分別存儲多項(xiàng)式的一個節(jié)點(diǎn)的系數(shù),指數(shù);還有一個指針域,存儲指向下一個節(jié)點(diǎn)的指針。1.2演示程序以用戶和計算機(jī)的對話方式執(zhí)行,即在計算機(jī)終端上顯示“提示信息”之后,由用戶在鍵盤上輸入演示程序中規(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測試數(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)互換上述測試數(shù)據(jù)中的前后兩個多項(xiàng)式二、概要設(shè)計為實(shí)現(xiàn)上述程序的功能,應(yīng)以帶頭結(jié)點(diǎn)的單鏈表表示多項(xiàng)式。為此,需要一個抽象數(shù)據(jù)類型:單鏈表。2.1單鏈表的抽象數(shù)據(jù)類型定義ADT LinkList數(shù)據(jù)對象:D=ai|aiTermSet,i=1,2,m,m0 TermSet中的每個元素包含一個表示系數(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);/建立一個頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式,并返回該多項(xiàng)式的頭結(jié)點(diǎn);/若分配空間失敗,則返回FALSEvoid DestroyLinkList(LinkList p);/銷毀多項(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值,計算并返回多項(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即退出命令時,程序退出 printf(n請選擇操作:); scanf(%c,&flag); Interpter(flag); /具體的操作命令/mainvoid Initiation() printf(請輸入a的項(xiàng)數(shù):); scanf(%d,&m); pa=CreateLinkList(pa,m);/建立多項(xiàng)式a printf(請輸入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 您的選擇錯誤,請重新選擇!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)說明LK :LinkList 即多項(xiàng)式節(jié)點(diǎn)函數(shù)說明:Initiation(); /多項(xiàng)式初始化PrintCommand(); /輸出菜單Interpter() ; /具體的操作命令PrintLinkList() ; /打印多項(xiàng)式(降序輸出)Derivative(); /多項(xiàng)式求導(dǎo)ValueLinkList(); /多項(xiàng)式求值A(chǔ)ddLinkList() ; /兩個多項(xiàng)式相加SubtractLinkList(); /兩個多項(xiàng)式相減MultiplyLinkList(); /兩個多項(xiàng)式相乘DestroyLinkList(); /銷毀多項(xiàng)式compare() ; /兩個節(jié)點(diǎn)比較CreateLinkList(); /創(chuàng)建多項(xiàng)式Insert() ; /將節(jié)點(diǎn)插入已知多項(xiàng)式中四、調(diào)試分析4.1剛開始的時候由于對多項(xiàng)式的減法考慮不周全,代碼很復(fù)雜,后來經(jīng)過仔細(xì)思考,減法時把每項(xiàng)的系數(shù)變成它的相反數(shù),然后調(diào)用加法的函數(shù)即可,但是實(shí)現(xiàn)了減法之后要把系數(shù)恢復(fù),不然會影響后面的運(yùn)算。4.2求多項(xiàng)式在x處的值的函數(shù)在剛開始的時候出現(xiàn)過警告,雖然警告不會影響程序的運(yùn)行,但是運(yùn)算的結(jié)果不精確。之前函數(shù)的類型是int,但是里面的多項(xiàng)式的系數(shù)是浮點(diǎn)型的,而sum又是整型的,但是這樣得不到小數(shù)點(diǎn)后面的數(shù)值,導(dǎo)致結(jié)果不精確。后來經(jīng)改進(jìn),把函數(shù)的類型及sum的類型均改為float型。五、用戶使用手冊5.1此程序的整體架構(gòu):主函數(shù)里有三個函數(shù),Initialization(初始化)、PrintCommand(打印命令)、Interpret(解釋并執(zhí)行命令)。在Interpret函數(shù)中調(diào)用了其他的函數(shù),以達(dá)到執(zhí)行命令的目的。5.2在輸入命令時要注意在輸入多項(xiàng)式的每一項(xiàng)的系數(shù)和指數(shù)必須有空格,否則可能會解釋命令出錯。在完成每一條的命令輸入時要鍵入Enter.六、測試結(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; /指向下一個節(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的話釋放結(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的話釋放結(jié)點(diǎn) q1-next=q2-next; free(q2); else/指數(shù)為新時將結(jié)點(diǎn)插入 p-next=q2; q1-next=p; /創(chuàng)建一元多項(xiàng)式 LinkList CreateLinkList(LinkList head,int m) /建立一個頭指針為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à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ù)計數(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時,釋放該結(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值,計算并返回多項(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)式,并返回其頭指針 對多項(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)時 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(請輸入a的項(xiàng)數(shù):); scanf(%d,&m); pa=CreateLinkList(pa,m);/建立多項(xiàng)式a printf(請輸入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的值計算a :代入x的值計算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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 七夕節(jié)活動方案 (15篇)
- 《綠野仙蹤》讀后感集合15篇
- 綠色制造工藝改造項(xiàng)目可行性研究報告
- 空調(diào)與照明系統(tǒng)優(yōu)化在標(biāo)準(zhǔn)廠房節(jié)能中的作用
- 海洋科技創(chuàng)新的路徑與行動計劃
- 光伏電站光伏區(qū)技改項(xiàng)目可行性研究報告
- 工業(yè)遺產(chǎn)活化利用項(xiàng)目可行性研究報告
- 高效能電機(jī)研發(fā)項(xiàng)目可行性研究報告
- 家庭對學(xué)生心理健康教育
- 新疆維吾爾自治區(qū)塔城地區(qū)烏蘇市第一中學(xué)2022-2023學(xué)年高一下學(xué)期3月月考政治 含解析
- 《傳染病學(xué):新冠病毒》課件
- 虛擬地理環(huán)境智慧樹知到答案2024年黑龍江工程學(xué)院
- 公園設(shè)施維修投標(biāo)方案
- 放射性的應(yīng)用與防護(hù)教案
- 醫(yī)院崗位設(shè)置與人員編制標(biāo)準(zhǔn)[詳]
- 土地估價報告市場比較法(工業(yè))模板2016.09.26
- 每日安全巡查記錄表
- 中醫(yī)醫(yī)院科主任科室管理通用考核表
- 《2021國標(biāo)暖通圖集資料》96K150-3 圓錐形風(fēng)帽
- 康復(fù)治療技術(shù)物理療法
- 第三節(jié)X線攝影體表定位標(biāo)志
評論
0/150
提交評論