一元稀疏多項式簡單計數器實驗報告.docx_第1頁
一元稀疏多項式簡單計數器實驗報告.docx_第2頁
一元稀疏多項式簡單計數器實驗報告.docx_第3頁
一元稀疏多項式簡單計數器實驗報告.docx_第4頁
一元稀疏多項式簡單計數器實驗報告.docx_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

VIP免費下載

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

一元稀疏多項式簡單計數器題目:編制一個演示一元稀疏多項式簡單計數器的程序班級:計算機科學與技術1301班 姓名:劉濛 學號:201321091026 完成日期:2015.4.9一、需求分析1.1本演示程序中,多項式是以帶頭結點的單鏈表存儲的,在單鏈表中有兩個數據域,分別存儲多項式的一個節(jié)點的系數,指數;還有一個指針域,存儲指向下一個節(jié)點的指針。1.2演示程序以用戶和計算機的對話方式執(zhí)行,即在計算機終端上顯示“提示信息”之后,由用戶在鍵盤上輸入演示程序中規(guī)定的運算命令;相應的輸入數據和運算結果顯示在其后。1.3程序執(zhí)行的命令包括:1)構造多項式a;2)構造多項式b;3)輸出多項式,并且多項式的序列按指數的降序排列;4)求a+b;5)求a-b;6)求a*b;7) 求多項式a的導函數a;8)求多項式在x處的值。1.4測試數據(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)互換上述測試數據中的前后兩個多項式二、概要設計為實現上述程序的功能,應以帶頭結點的單鏈表表示多項式。為此,需要一個抽象數據類型:單鏈表。2.1單鏈表的抽象數據類型定義ADT LinkList數據對象:D=ai|aiTermSet,i=1,2,m,m0 TermSet中的每個元素包含一個表示系數的實數和表示指數的整數數據關系:R1=ai-1,aiD且ai-1中的指數值next=null;return ture;void FreeNode(LinkList &p) /釋放p所指結點free(q1); q1=q2; q2=q2-next;3.2單鏈表的基本操作設置如下:void Insert(LinkList p,LinkList h); /將節(jié)點p插入到多項式鏈表hLinkList CreateLinkList(LinkList head,int m);/建立一個頭指針為head、項數為m的一元多項式,并返回該多項式的頭結點;/若分配空間失敗,則返回FALSEvoid DestroyLinkList(LinkList p);/銷毀多項式pvoid PrintLinkList(LinkList P);/輸出構造的一元多項式PStatus compare(LinkList a,LinkList b) /節(jié)點進行比較: a的指數 b的指數 return 1; a的指數=b的指數 return 0;a的指數next=NULL; for(i=0;icoef,&p-expn); Insert(p,head); /調用Insert函數插入結點 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多項式已空,但b多項式非空 else return 1;/b多項式已空,但a多項式非空/ comparefloat ValueLinkList(LinkList head,int x) /輸入x值,計算并返回多項式的值 for(p=head-next;p;p=p-next) t=1; for(i=p-expn;i!=0;) / i 為指數的系數 pow(x,i) if(icoef*t; return sum;/ ValueLinkListLinkList MultiplyLinkList(LinkList pa,LinkList pb)/求解并建立多項式a*b,返回其頭指針 LinkList qa=pa-next; LinkList qb=pb-next; hf=(LinkList)malloc(sizeof(struct LNode);/建立頭結點 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); /調用Insert函數以合并指數相同的項return hf;/ MultiplyLinkList3.3主函數和其他函數的偽碼算法void main()/主函數Initiation(); /多項式初始化 PrintCommand();/輸出菜單 while(1) /循環(huán)一直為真 知道選擇j|J即退出命令時,程序退出 printf(n請選擇操作:); scanf(%c,&flag); Interpter(flag); /具體的操作命令/mainvoid Initiation() printf(請輸入a的項數:); scanf(%d,&m); pa=CreateLinkList(pa,m);/建立多項式a printf(請輸入b的項數:); scanf(%d,&n); pb=CreateLinkList(pb,n);/建立多項式bprintf(-多項式已創(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函數的調用關系圖反映了演示程序的層次結構:Main Initiation PrintCommand Interpter CreateLinkList PrintLK Derivative ValueLK AddLK SubtractLK MultiplyLK DestroyLK PrintLK PrintLK PrintLK PrintLK exit(0)說明LK :LinkList 即多項式節(jié)點函數說明:Initiation(); /多項式初始化PrintCommand(); /輸出菜單Interpter() ; /具體的操作命令PrintLinkList() ; /打印多項式(降序輸出)Derivative(); /多項式求導ValueLinkList(); /多項式求值AddLinkList() ; /兩個多項式相加SubtractLinkList(); /兩個多項式相減MultiplyLinkList(); /兩個多項式相乘DestroyLinkList(); /銷毀多項式compare() ; /兩個節(jié)點比較CreateLinkList(); /創(chuàng)建多項式Insert() ; /將節(jié)點插入已知多項式中四、調試分析4.1剛開始的時候由于對多項式的減法考慮不周全,代碼很復雜,后來經過仔細思考,減法時把每項的系數變成它的相反數,然后調用加法的函數即可,但是實現了減法之后要把系數恢復,不然會影響后面的運算。4.2求多項式在x處的值的函數在剛開始的時候出現過警告,雖然警告不會影響程序的運行,但是運算的結果不精確。之前函數的類型是int,但是里面的多項式的系數是浮點型的,而sum又是整型的,但是這樣得不到小數點后面的數值,導致結果不精確。后來經改進,把函數的類型及sum的類型均改為float型。五、用戶使用手冊5.1此程序的整體架構:主函數里有三個函數,Initialization(初始化)、PrintCommand(打印命令)、Interpret(解釋并執(zhí)行命令)。在Interpret函數中調用了其他的函數,以達到執(zhí)行命令的目的。5.2在輸入命令時要注意在輸入多項式的每一項的系數和指數必須有空格,否則可能會解釋命令出錯。在完成每一條的命令輸入時要鍵入Enter.六、測試結果(程序輸入的相關命令)七、附錄(源代碼):#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; /定義項的系數 ElemType expn; /定義項的指數 struct LNode *next; /指向下一個節(jié)點LNode,*LinkList;/*全局節(jié)點 初始化多項式節(jié)點為空*/static LinkList pa=NULL;static LinkList pb=NULL;static LinkList pc=NULL;/*將節(jié)點p插入到多項式鏈表h*/void Insert(LinkList p,LinkList h) if(p-coef=0) free(p); /系數為0的話釋放結點 else LinkList q1,q2; q1=h; q2=h-next; while(q2&p-expnexpn)/查找插入位置 q1=q2; q2=q2-next; if(q2&p-expn=q2-expn)/將指數相同相合并 q2-coef+=p-coef; free(p); if(!q2-coef)/系數為0的話釋放結點 q1-next=q2-next; free(q2); else/指數為新時將結點插入 p-next=q2; q1-next=p; /創(chuàng)建一元多項式 LinkList CreateLinkList(LinkList head,int m) /建立一個頭指針為head、項數為m的一元多項式 int i; LinkList p; p=head=(LinkList)malloc(sizeof(struct LNode); head-next=NULL; for(i=0;icoef,&p-expn); Insert(p,head);/調用Insert函數插入結點 return head;void DestroyLinkList(LinkList p)/銷毀多項式p LinkList q1,q2; q1=p-next; q2=q1-next; while(q1-next)free(q1); q1=q2; q2=q2-next;/輸出構造的一元多項式Pvoid PrintLinkList(LinkList P)LinkList q=P-next; int flag=1;/項數計數器 if(!q) /若多項式為空,輸出0 putchar(0); printf(n); return; while(q) if(q-coef0&flag!=1) putchar(+); /系數大于0且不是第一項 if(q-coef!=1&q-coef!=-1) /系數非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é)點進行比較/ a的指數 b的指數 return 1/ a的指數=b的指數 return 0/ a的指數expnb-expn) return 1; else if(!a|a-expnexpn) return -1; else return 0; else if(!a&b) return -1;/a多項式已空,但b多項式非空 else return 1;/b多項式已空,但a多項式非空LinkList AddLinkList(LinkList pa,LinkList pb)/求解并建立多項式a+b,返回其頭指針 LinkList qa=pa-next; LinkList qb=pb-next; LinkList headc,hc,qc; hc=(LinkList)malloc(sizeof(struct LNode);/建立頭結點 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);/當相加系數為0時,釋放該結點 return headc;LinkList SubtractLinkList(LinkList pa,LinkList pb)/求解并建立多項式a-b,返回其頭指針 LinkList h=pb; LinkList p=pb-next; LinkList pd; while(p) /將pb的系數取反 p-coef*=-1; p=p-next; pd=AddLinkList(pa,h); for(p=h-next;p;p=p-next) /恢復pb的系數 p-coef*=-1; return pd;float ValueLinkList(LinkList head,int x)/輸入x值,計算并返回多項式的值 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 為指數的系數 pow(x,i) if(icoef*t; return sum;/求解并建立導函數多項式,并返回其頭指針 對多項式進行求導 y=.LinkList Derivative(LinkList head)/求解并建立導函數多項式,并返回其頭指針 LinkList q=head-next,p1,p2,hd; hd=p1=(LinkList)malloc(sizeof(struct LNode);/建立頭結點 hd-next=NULL; while(q) if(q-expn!=0) /該項不是常數項時 p2=(LinkList)malloc(sizeof(struct LNode); p2-coef=q-coef*q-expn; p2-expn=q-expn-1; p2-next=p1-next;/連接結點 p1-next=p2; p1=p2; q=q-next; return hd;LinkList MultiplyLinkList(LinkList pa,LinkList pb)/求解并建立多項式a*b,返回其頭指針 LinkList hf,pf; LinkList qa=pa-next; LinkList qb=pb-next; hf=(LinkList)malloc(sizeof(struct LNode);/建立頭結點 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);/調用Insert函數以合并指數相同的項 return hf;/多項式初始化void Initiation() int m, n ; printf(請輸入a的項數:); scanf(%d,&m); pa=CreateLinkList(pa,m);/建立多項式a printf(請輸入b的項數:); scanf(%d,&n); pb=CreateLinkList(pb,n);/建立多項式bprintf(-多項式已創(chuàng)建-n);/輸出菜單void PrintCommand()printf(*n);printf(*n);printf( *多項式操作程序 *n);printf( * *n);printf( * A:輸出多項式aB:輸出多項式b *n);printf( * *n);printf( * C:輸出a的導數 D:輸出b的導數 *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多項式a=); PrintLinkList(pa); break; case B: case b:printf(n 多項式b=); PrintLinkList(pb); break; caseC: casec:pc=Derivative(pa); printf(n 多項式a的導函數為:a=); PrintLinkList(pc); br

溫馨提示

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

評論

0/150

提交評論