第一篇:實(shí)驗(yàn)1 線性表應(yīng)用-多項(xiàng)式計(jì)算
一.實(shí)驗(yàn)?zāi)康暮鸵?/p>
1.進(jìn)一步掌握線性表的的基本操作。
2.掌握線性表的典型應(yīng)用----多項(xiàng)式表示與計(jì)算。
二.實(shí)驗(yàn)內(nèi)容
1. 設(shè)用線性表((a1, e1),(a2, e2), ……,(am, em))表示多項(xiàng)式P(x)= a1*xe1 + a2*xe2 +…+ am*xem,請編寫用鏈?zhǔn)酱鎯Y(jié)構(gòu)(帶表頭附加結(jié)點(diǎn)的單鏈表)存儲該多項(xiàng)式時(shí),多項(xiàng)式基本操作的實(shí)現(xiàn)函數(shù)。要求:把多項(xiàng)式線性表的結(jié)構(gòu)定義及多項(xiàng)式基本操作實(shí)現(xiàn)函數(shù)存放在文件Linkpoly.h中。說明:基本操作可包括如下 ① 初始化多項(xiàng)式InitPoly(p)② 輸出多項(xiàng)式TraversePoly(p)③ 清除多項(xiàng)式ClearPoly(p)④ 插入一項(xiàng) InsertPoly(p, a, e)
⑤ 刪除一項(xiàng) DeletetPoly(p, a, e, pos)⑥ 多項(xiàng)式求值PolySum(p, x)
⑦ 多項(xiàng)式相加PolyAdd(p1, p2)
2. 建立主程序文件test1.cpp,在主函數(shù)main()中通過調(diào)用Linkpoly.h中的函數(shù)進(jìn)行測試。
3. 編寫用順序存儲結(jié)構(gòu)存儲多項(xiàng)式時(shí),上述各多項(xiàng)式基本操作的實(shí)現(xiàn)函數(shù)。要求: 把多項(xiàng)式線性表的結(jié)構(gòu)定義及多項(xiàng)式基本操作實(shí)現(xiàn)函數(shù)存放在文件Seqpoly.h中,在主程序文件test1.cpp中增加測試語句對Seqpoly.h中的函數(shù)進(jìn)行測試。
4. 填寫實(shí)驗(yàn)報(bào)告,實(shí)驗(yàn)報(bào)告文件取名為report1.doc。
5. 上傳實(shí)驗(yàn)報(bào)告文件report1.doc與源程序文件test1.cpp及Linkpoly.h、Seqpoly.h 到Ftp服務(wù)器上自己的文件夾下。
三.函數(shù)的功能說明及算法思路
包括每個(gè)函數(shù)的功能說明,及一些重要函數(shù)的算法實(shí)現(xiàn)思路
四.實(shí)驗(yàn)結(jié)果與分析
包括運(yùn)行結(jié)果截圖等
五.心得體會
記錄實(shí)驗(yàn)感受、上機(jī)過程中遇到的困難及解決辦法、遺留的問題、意見和建議等。
【附錄----源程序】 Test1.cpp: #include //初始化多項(xiàng)式 InitPoly(pb);cout<<“請輸入要測試的項(xiàng)數(shù):”;cin>>n;cout<<“請依次輸入要測試的各項(xiàng)的系數(shù)和指數(shù):”;for(i=0;i cin>>a; cin>>e; InsertPoly(pa, a, e); //插入一項(xiàng) pa=pa->next;} pa=pa->next;cout<<“該多項(xiàng)式為:”;TraversePoly(pa); //輸出多項(xiàng)式 cout< cout<<“刪除成功!現(xiàn)在多項(xiàng)式為:”; TraversePoly(pa); cout< cout<<“刪除失??!”< cin>>a; cin>>e; InsertPoly(pb, a, e); //插入一項(xiàng) pb=pb->next;} pb=pb->next;pp=PolyAdd(pa, pb);cout<<“兩多項(xiàng)式相加后得到的多項(xiàng)式為:”;TraversePoly(pp);cout< cout< cout< cout<<“現(xiàn)在進(jìn)行第二次測試。(順序表表示)”< cin>>a; cin>>e; InsertPoly1(s, a, e);} cout<<“該多項(xiàng)式為:”;TraversePoly1(s);cout< cout<<“刪除成功!現(xiàn)在多項(xiàng)式為:”; TraversePoly1(s); cout< cout<<“刪除失??!”< cin>>a; cin>>e; InsertPoly1(t, a, e); //插入一項(xiàng) } q=PolyAdd1(s, t);cout<<“兩多項(xiàng)式相加后得到的多項(xiàng)式為:”;TraversePoly1(q);cout< Linkploy.h: struct NodeType{ float coef; int exp; NodeType *next;};bool InitPoly(NodeType *&p) //初始化多項(xiàng)式 { if((p=new NodeType)==NULL) return false;p->next=p;return true;} void TraversePoly(NodeType *p) //輸出多項(xiàng)式 { NodeType *h=p->next;if(h!=p){ cout< h=h->next;} while(h!=p){ if(h->coef>0) cout<<“+”; cout< h=h->next;} } void ClearPoly(NodeType *&p) //清除多項(xiàng)式 { NodeType *cp,*np;cp=p->next;while(cp!=p){ np=cp->next; delete cp; cp=np;} p->next=p;} bool InsertPoly(NodeType *&p, float a, int e) //插入一項(xiàng) { NodeType *h;if((h=new NodeType)==NULL) return false;h->coef=a;h->exp=e;h->next=p->next;p->next=h;return true;} bool DeletetPoly(NodeType *&p, float a, int e, int pos) //刪除一項(xiàng) { if(pos>1||pos<-1) return false;NodeType *cp=p->next;NodeType *np=p;if(pos==0){ while(cp!=p){ if(cp->coef==a&&cp->exp==e) break; else{ np=cp; cp=cp->next; } } } else if(pos==-1) while(cp!=p){ np=cp; cp=cp->next; } np->next=cp->next;delete cp; return true;} double PolySum(NodeType *p, float x) //多項(xiàng)式求值 { int i;double sum=0,item; NodeType *cp=p->next;while(cp!=p){ item=1; for(i=1;i<=cp->exp;i++) item=item*x; sum=sum+item*cp->coef; cp=cp->next;} return sum;} NodeType *PolyAdd(NodeType *p1, NodeType *p2) //多項(xiàng)式相加 { float coef;NodeType *a=p1->next,*b=p2->next,*c,*pc; InitPoly(c);pc=c;while(a!=p1&&b!=p2){ if(a->exp==b->exp){ coef=a->coef+b->coef; if(coef!=0){ InsertPoly(pc, coef, a->exp); pc=pc->next; } a=a->next; b=b->next; } else if(a->exp InsertPoly(pc,a->coef,a->exp); pc=pc->next; a=a->next; } else{ InsertPoly(pc,b->coef,b->exp); pc=pc->next; b=b->next; } } while(a!=p1){ InsertPoly(pc,a->coef,a->exp); pc=pc->next; a=a->next; } while(b!=p2){ InsertPoly(pc,b->coef,b->exp); pc=pc->next; b=b->next; } return c;} Seqploy.h: #define MaxSize 10000 struct ListType{ float *list; int size;};void InitPoly1(ListType &p) //初始化多項(xiàng)式 { p.list=(float*)malloc(MaxSize*sizeof(float)); if(p.list==NULL){ cout<<“動態(tài)可分配的儲存空間用完,退出運(yùn)行!”< exit(1); } p.size=0;for(int i=0;i p.list[i]=0;} void TraversePoly1(ListType p) //輸出多項(xiàng)式 { int i=0;if(p.list[i]!=0) cout< for(i=1;i if(p.list[i]!=0) break; cout< if(p.list[i]>0){ cout<<“+”; cout< } if(p.list[i]<0) cout< //清除多項(xiàng)式 { if(p.list!=NULL){ delete []p.list; p.list=NULL;} p.size=0;} void InsertPoly1(ListType &p, float a, int e) //插入一項(xiàng) { p.list[e]=a;if(p.size p.size=e;} bool DeletetPoly1(ListType &p, float a, int e, int pos) //刪除一項(xiàng) { int i,n;if(p.size==0){ cout<<“多項(xiàng)式為空,刪除無效!”< return false;} if(pos==0) if(p.list[e]==a) p.list[e]=0;else if(pos==-1) p.list[p.size]=0;return true;} double PolySum1(ListType p, float x) { double sum=0,item;int i,j;for(i=0;i<=p.size;i++){ item=1; for(j=1;j<=i;j++) item=item*x; sum=sum+item*p.list[i];} return sum;} ListType PolyAdd1(ListType p1, ListType p2){ ListType p;InitPoly1(p);float coef;int i,j;for(i=0;i<=p1.size;i++){ coef=p1.list[i]+p2.list[i]; InsertPoly1(p, coef, i);} //多項(xiàng)式求值 //多項(xiàng)式相加 if(i<=p1.size) for(j=i;j<=p1.size;j++) InsertPoly1(p, p1.list[j], j);if(i<=p2.size) for(j=i;j<=p2.size;j++) InsertPoly1(p, p2.list[j], j);return p;} 實(shí)驗(yàn)總結(jié)報(bào)告—棧和隊(duì)列 學(xué)號: 姓名: 時(shí)間: 一、目的 1.做實(shí)驗(yàn)的目的 加深對線性表的理解,學(xué)會定義線性表的存儲結(jié)構(gòu),掌握線性表的基本操作。 2.撰寫實(shí)驗(yàn)報(bào)告的目的 對本次實(shí)驗(yàn)情況進(jìn)行總結(jié),加強(qiáng)對實(shí)驗(yàn)內(nèi)容的理解,對實(shí)驗(yàn)過程有一個(gè)系統(tǒng)的認(rèn)識,從中獲得本次試驗(yàn)的經(jīng)驗(yàn),并對實(shí)驗(yàn)結(jié)果進(jìn)行適當(dāng)?shù)姆治?,加深對棧和?duì)列的理解和認(rèn)識。 二、內(nèi)容 1.說明實(shí)驗(yàn)次數(shù)及實(shí)驗(yàn)內(nèi)容 本次實(shí)驗(yàn)用一次實(shí)驗(yàn)課時(shí)完成 實(shí)驗(yàn)內(nèi)容: 節(jié)點(diǎn)定義: typedef struct node{ int idx;int age;struct node *next;}Node,*List;本次實(shí)驗(yàn)的對象的存儲內(nèi)容包括ID和AGE,所以定義了如上的結(jié)構(gòu)體,idx用于存儲ID號,age用于存儲年齡,next用于形成鏈?zhǔn)浇Y(jié)構(gòu),Node定義了該類型的一個(gè)節(jié)點(diǎn),List定義了該類型的一個(gè)鏈表。(1)、編寫函數(shù)CreateList()和PrintList(),從給定數(shù)組創(chuàng)建鏈表,打印鏈表。 int idx[8] = {1,2,3,4,5,6,7,8};int age[8] = {15,18,13,22,50,18,30,20};List CreatList(int idx[], int age[],int len){} int PrintList(List L){}(2)、編寫函數(shù)DeleteNode(List L, int delete_age),完成以下操作。int DeleteNodeAge(List L, int delete_age){} 該函數(shù)傳入List L,可以直接修改鏈表的節(jié)點(diǎn),建議返回值為int 或void類型,無需為List類型,3,4題同上。2.1刪除年齡為18的成員,打印鏈表。2.2刪除年齡為20的成員,打印鏈表。2.3刪除年齡為15的成員,打印鏈表。 2.4(可選)刪除年齡為21的成員(因無此成員,報(bào)錯(cuò)),打印鏈表。(3)、編寫函數(shù)InsertNodeByIdx(List L, Node nd),完成以下操作。(或編寫函數(shù)InsertNodeByIdx(List L, Node *pnd),完成以下操作。)(建議用 Node *pnd,因Node nd作為參數(shù)傳給函數(shù)InsertNodeByIdx,nd本身不能被修改,而插入鏈表需修改nd.next,故需創(chuàng)建新的節(jié)點(diǎn)把nd的idx和age賦值給新節(jié)點(diǎn)。) 3.1將(idx,age)=(6,23)插入鏈表,保證鏈表的idx仍為升序,打印鏈表。3.2將(idx,age)=(1,25)插入鏈表,保證鏈表的idx仍為升序,打印鏈表。(4)(選做)、編寫函數(shù)InsertNodeByAge(List L, Node nd),完成以下操作。(或編寫函數(shù)InsertNodeByAge(List L, Node *pnd),完成以下操作。) 4.1將(idx,age)=(9,31)插入鏈表,不用保證鏈表的idx仍為升序,新節(jié)點(diǎn)插在節(jié)點(diǎn)nd0后面,要求nd0.age是整個(gè)鏈表節(jié)點(diǎn)的age小于且最接近nd.age,打印鏈表。 (提示:本例要求插在(7,30)后面。)4.2插入節(jié)點(diǎn)(8,1) (提示:本例要求插在(1,25)之前,即最前面,因age=1最小。)2.做實(shí)驗(yàn)完成情況 要求實(shí)驗(yàn)內(nèi)容在實(shí)驗(yàn)時(shí)間內(nèi)全部完成,選做實(shí)驗(yàn)未做。創(chuàng)建鏈表: List CreateList(int idx[],int age[],int len){ List p,L;int i;L=NULL;for(i=len-1;i>=0;i--){ p=new Node; p->age=age[i]; p->idx=idx[i]; p->next=L; L=p;} return L;} 該操作創(chuàng)建一個(gè)不帶頭節(jié)點(diǎn)的鏈表并返回類型為List的結(jié)果 打印鏈表: void PrintList(List L){ List p=L;printf(“idx agen”);while(p){ printf(“%d %dn”,p->idx ,p->age); p=p->next;} } 該操作從表頭到表尾依次打印idx和age 刪除節(jié)點(diǎn): int DeleteNodeAge(List &L, int delete_age){ List p=L;int flag=0;if(p->age==delete_age){ L=L->next; flag=1;} else{ while(p->next){ if(p->next->age==delete_age){ flag++; if(p->next->next==NULL) p->next=NULL; else p->next=p->next->next; } else p=p->next; } } return flag;} 該操作刪除需要刪除的節(jié)點(diǎn),成功刪除返回刪除節(jié)點(diǎn)的個(gè)數(shù),否則返回0 插入節(jié)點(diǎn): void InsertNodeByIdx(List &L, Node *pnd){ List p=L;if(p->idx>=pnd->idx){ pnd->next=L; L=pnd; return;} else{ while(p->next){ if(p->next->idx<=pnd->idx) p=p->next; else{ pnd->next=p->next; p->next=pnd; return; } } } } 該操作完成節(jié)點(diǎn)的插入,插入之后鏈表仍按idx成升序 主函數(shù): int main(){ List L,pnd1,pnd2;pnd1=new Node;pnd2=new Node;int idx[8]={1,2,3,4,5,6,7,8},age[8]={15,18,13,22,50,18,30,20},r;L=CreateList(idx,age,8);PrintList(L);r=DeleteNodeAge(L,18);printf(“The result is %dn”,r);PrintList(L);r=DeleteNodeAge(L,20);printf(“The result is %dn”,r);PrintList(L);r=DeleteNodeAge(L,15);printf(“The result is %dn”,r);PrintList(L);pnd1->idx=6;pnd1->age=23;InsertNodeByIdx(L,pnd1);PrintList(L);pnd2->idx=1;pnd2->age=25;InsertNodeByIdx(L,pnd2);PrintList(L);system(“pause”);return 0;} 實(shí)驗(yàn)結(jié)果: 從實(shí)驗(yàn)代碼及結(jié)果來看,首先按要求創(chuàng)建單鏈表,從打印結(jié)果來看,鏈表成功創(chuàng)建;第二步刪除age為18的節(jié)點(diǎn),從鏈表來看有兩個(gè)age為18的節(jié)點(diǎn),所以Delete的返回值r為2,從打印結(jié)果來看,兩個(gè)節(jié)點(diǎn)成功刪除;第三步刪除age為20的節(jié)點(diǎn),鏈表中只有一個(gè)符合要求的節(jié)點(diǎn),所以返回值r為1,打印結(jié)果說明成功刪除;第四步插入idx為6,age為23的節(jié)點(diǎn),第四步插入idx為1,age為25的節(jié)點(diǎn),從打印結(jié)果來看均成功操作。 三、總結(jié) 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì) 多項(xiàng)式計(jì)算 班級: 學(xué)號: 姓名: 指導(dǎo)老師: 多項(xiàng)式計(jì)算 1、問題描述 能夠按照指數(shù)降序排列建立多項(xiàng)式;能夠完成兩個(gè)多項(xiàng)式的相加、相減和相乘,并將結(jié)果輸出。 2、設(shè)計(jì)思路 這個(gè)程序的關(guān)鍵是多項(xiàng)式的創(chuàng)建和排列,以及相乘時(shí)系數(shù)相乘和指數(shù)相加、相加時(shí)相同指數(shù)的系數(shù)相加、相減時(shí)相同指數(shù)的系數(shù)相減。由于多項(xiàng)式擁有指數(shù)和系數(shù)(假設(shè)基數(shù)已定),所以可以定義一個(gè)包含指數(shù)系數(shù)的結(jié)構(gòu)體,用單鏈表存儲多項(xiàng)式的數(shù)據(jù),所以結(jié)構(gòu)體包含next指針。數(shù)據(jù)插入時(shí)比較兩數(shù)的指數(shù),按照降序排序,從表頭的next開始,直至找到合適的位置,然后開始鏈表中數(shù)值的插入,如果相等則直接將指數(shù)相加,如果大于就將新數(shù)據(jù)插入到當(dāng)前指向的前面,否則將新數(shù)據(jù)插入到最后。輸入完數(shù)據(jù)后選擇計(jì)算方式(相乘、相加、相減),多項(xiàng)式運(yùn)算時(shí)要循環(huán)遍歷整個(gè)多項(xiàng)式,多項(xiàng)式的每一組數(shù)據(jù)都要和另一個(gè)多項(xiàng)式整組數(shù)據(jù)相運(yùn)算(每一個(gè)運(yùn)算值都存儲到新建的“多項(xiàng)式”鏈表中),直到兩個(gè)多項(xiàng)式都遍歷完結(jié)束。 3、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 在模擬多項(xiàng)式對象時(shí),為了簡化處理,只取最核心的兩個(gè)數(shù)據(jù):多項(xiàng)式的系數(shù)和指數(shù)。前面提到,要用單鏈表操作,所以要加上個(gè)next指針,再由該結(jié)構(gòu)體定義一個(gè)結(jié)點(diǎn)類型和指針類型。具體數(shù)據(jù)結(jié)構(gòu)定義如下: typedef struct node{ int xs;/*系數(shù)*/ int zs; /*指數(shù)*/ struct node * next;/*next指針*/ }Dnode,* Dnodelist; 4、功能函數(shù)設(shè)計(jì) (1)鏈表初始化函數(shù)Creat_node() 帶有頭結(jié)點(diǎn)的頭指針指向空(NULL)。(2)多項(xiàng)式數(shù)據(jù)的創(chuàng)建函數(shù)Creat_Dmeth() 當(dāng)鏈表初始化成功后,開始創(chuàng)建多項(xiàng)式。分別循環(huán)輸入兩個(gè)多項(xiàng)式的系數(shù)和指數(shù),其中要用到插入函數(shù)。 (3)數(shù)據(jù)的插入函數(shù)Insert_node()當(dāng)創(chuàng)建多項(xiàng)式時(shí),要用到此函數(shù),即利用插入的方式將多項(xiàng)式的數(shù)據(jù)連接起來。再輸入一組數(shù)據(jù)后,程序自動調(diào)用此函數(shù),插入時(shí)也進(jìn)行著排序,從表頭的next開始,一一比較指數(shù)大小,直到大于或等于當(dāng)前指向的數(shù)據(jù)或遍歷完所有數(shù)據(jù)時(shí)停止,然后開始鏈表中數(shù)值的插入,如果相等則直接將指數(shù)相加,如果大于就將新數(shù)據(jù)插入到當(dāng)前指向的前面,否則將新數(shù)據(jù)插入到最后。 (4)多項(xiàng)式的顯示函數(shù)Show()從多項(xiàng)式表頭的next開始,直到指向空(NULL),將系數(shù)與指數(shù)一一顯示。 (5)選擇運(yùn)算方式的函數(shù)select()三種選擇:1為相乘,2為相加,3為相減;每一種選擇調(diào)用相應(yīng)的運(yùn)算函數(shù)。 (6)多項(xiàng)式的運(yùn)算函數(shù):新建鏈表存儲計(jì)算后的多項(xiàng)式 1、多項(xiàng)式相乘Mulresult()創(chuàng)建兩個(gè)指針分別指向兩個(gè)多項(xiàng)式表頭的next,使用兩個(gè)while函數(shù)嵌套循環(huán),遍歷每一組數(shù)據(jù),每遍歷一次都將兩組數(shù)據(jù)的系數(shù)相乘,指數(shù)相加,再利用插入函數(shù)將系數(shù)與指數(shù)存儲到新建多項(xiàng)式的鏈表中。 2、多項(xiàng)式相加Addresult()創(chuàng)建兩個(gè)指針分別指向兩個(gè)多項(xiàng)式表頭的next,分別使用兩個(gè)while函數(shù)獨(dú)自循環(huán),遍歷各自的每一組數(shù)據(jù),每遍歷一次都將系數(shù)與指數(shù)存儲到新建多項(xiàng)式的鏈表中。因?yàn)榇鎯r(shí)利用到插入函數(shù),而插入函數(shù)中有相同指數(shù)的系數(shù)相加功能,所以直接將兩個(gè)多項(xiàng)式的數(shù)據(jù)依次插入到新的多項(xiàng)式中即可完成多項(xiàng)式相加。 3、多項(xiàng)式相減Subresult()創(chuàng)建兩個(gè)指針分別指向兩個(gè)多項(xiàng)式表頭的next,以兩個(gè)指針同時(shí)不為空為條件循環(huán)遍歷,如果當(dāng)前多項(xiàng)式1的指數(shù)小于多項(xiàng)式2,則將當(dāng)前多項(xiàng)式2的系數(shù)置負(fù),指數(shù)不變,存入新建多項(xiàng)式中,指向多項(xiàng)式2的指針指向下一個(gè);如果如果當(dāng)前多項(xiàng)式1的指數(shù)大于多項(xiàng)式2,則將當(dāng)前多項(xiàng)式1的系數(shù)指數(shù)不變,存入新建多項(xiàng)式中,指向多項(xiàng)式1的指針指向下一個(gè);否則將多項(xiàng)式1的系數(shù)減去2的系數(shù)后存入新建多項(xiàng)式中,指數(shù)不變存入,再將兩個(gè)指針同時(shí)指向下一個(gè)。結(jié)束循環(huán)后判斷是哪一個(gè)多項(xiàng)式遍歷完了,將未遍歷完的多項(xiàng)式剩下的數(shù)據(jù)全部插入到新建多項(xiàng)式中。 (7)主函數(shù)main()創(chuàng)建兩個(gè)多項(xiàng)式的鏈表并且初始化,分別調(diào)用相應(yīng)的多項(xiàng)式創(chuàng)建函數(shù),創(chuàng)建成功后選擇運(yùn)算方式,再將運(yùn)算結(jié)果輸出顯示。 5、程序代碼 #include Dnodelist Creat_node(void)/*鏈表初始化*/ { Dnodelist D;D=(Dnodelist)malloc(sizeof(Dnode));if(D) D->next=NULL;return D;} int Insert_node(Dnodelist D,int xs,int zs)/*插入函數(shù)*/ { Dnodelist p;Dnodelist q;Dnodelist r;p=D;while(p->next){ r=p; p=p->next; if(zs==p->zs)/*指數(shù)相等,系數(shù)直接相加,結(jié)束*/ { p->xs=p->xs+xs; return 1; } else if(zs>p->zs)/*指數(shù)大于當(dāng)前數(shù)據(jù)的,將數(shù)據(jù)插入當(dāng)前數(shù)據(jù)之前,結(jié)束*/ { q=Creat_node(); q->xs=xs; q->zs=zs; r->next=q; q->next=p; return 1; } }/*while(p->next)*/ q=Creat_node();/*要插入的數(shù)據(jù)指數(shù)最小,直接插入至鏈表最后*/ q->xs=xs;q->zs=zs;q->next=p->next;p->next=q;return 1;free(p);free(q);free(r);} Dnodelist Creat_Dmeth(int length)/*創(chuàng)建多項(xiàng)式*/ { int i,m,n;Dnodelist D;D=Creat_node();for(i=0;i scanf(“%d,%d”,&m,&n); Insert_node(D,m,n);/*調(diào)用插入函數(shù),將輸入的系數(shù)指數(shù)插入鏈表*/ } return D;} Dnodelist Mulresult(Dnodelist D1,Dnodelist D2)/*多項(xiàng)式相乘*/ { Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(q){ while(p) { x=p->xs*q->xs;/*系數(shù)相乘,指數(shù)相加*/ z=p->zs+q->zs; Insert_node(D,x,z); p=p->next; } p=D1->next; q=q->next;} return D;} Dnodelist Addresult(Dnodelist D1,Dnodelist D2)/*多項(xiàng)式相加*/ { Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(q){ x=q->xs; z=q->zs; Insert_node(D,x,z); q=q->next;} while(p){ x=p->xs; z=p->zs; Insert_node(D,x,z); p=p->next;/*直接插入數(shù)據(jù),利用插入函數(shù)可完成該功能*/ } return D;} Dnodelist Subresult(Dnodelist D1,Dnodelist D2)/*多項(xiàng)式相減*/ { Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(p&&q){ if((p->zs)<(q->zs))/*指數(shù)?。?的數(shù)據(jù)在2中不存在),直接插入*/ { x=-(q->xs);/*由于是式1減式2,所以系數(shù)置負(fù)*/ z=q->zs; Insert_node(D,x,z); q=q->next; } else if((p->zs)>(q->zs))/*直接插入*/ { x=p->xs; z=p->zs; Insert_node(D,x,z); p=p->next; } else /*入*/ { z=q->zs; x=(p->xs)-(q->xs); Insert_node(D,x,z); p=p->next; q=q->next; } }/*while(p&&q)*/ while(p){ x=p->xs; z=p->zs; Insert_node(D,x,z); p=p->next;} while(q){ x=-(q->zs); z=q->zs; Insert_node(D,x,z); q=q->next; 指數(shù)大(2的數(shù)據(jù)在1中不存在),指數(shù)相同的先將系數(shù)相減,再插 } /*將未遍歷完的數(shù)據(jù)直接插入*/ return D;} Dnodelist select(Dnodelist D1,Dnodelist D2)/*選擇函數(shù)*/ { Dnodelist D;int s;printf(“請選擇:n1:相乘n2:相加n3:相減n”);scanf(“%d”,&s);switch(s){ case 1: D=Mulresult(D1,D2);/*調(diào)用相乘函數(shù)*/ printf(“相乘結(jié)果(系數(shù),指數(shù)):n”); break;case 2: D=Addresult(D1,D2);/*調(diào)用相加函數(shù)*/ printf(“相加結(jié)果(系數(shù),指數(shù)):n”); break;case 3: D=Subresult(D1,D2);/*調(diào)用相減函數(shù)*/ printf(“相減結(jié)果(系數(shù),指數(shù)):n”); break;default: printf(“無此選項(xiàng)n”); break;} return D;} void Show(Dnodelist D)/*顯示(輸出)函數(shù)*/ { Dnodelist r;r=D->next;while(r){ printf(“(%d,%d)+”,r->xs,r->zs); r=r->next;} printf(“n”);} void main(){ Dnodelist D1,D2,D;int length;D1=Creat_node();D2=Creat_node();/*D1為多項(xiàng)式1,D2為多項(xiàng)式2,初始化*/ } printf(“輸入多項(xiàng)式1的組數(shù):n”);scanf(“%d”,&length);printf(”輸入多項(xiàng)式1系數(shù),指數(shù):(%d組)n“,length);D1=Creat_Dmeth(length);/*創(chuàng)建多項(xiàng)式1*/ printf(”輸入多項(xiàng)式2的組數(shù):n”);scanf(“%d”,&length);printf(“輸入多項(xiàng)式2系數(shù),指數(shù):(%d組)n”,length);D2=Creat_Dmeth(length);/*創(chuàng)建多項(xiàng)式2*/ D=select(D1,D2);/*選擇運(yùn)算方式*/ Show(D);/*輸出顯示*/ getch(); 6、運(yùn)行與測試 程序運(yùn)行時(shí),先提示第一個(gè)多項(xiàng)式的組數(shù),確定組數(shù)后才可輸入相應(yīng)的數(shù)據(jù),之后是多項(xiàng)式2;輸入完數(shù)據(jù)后,程序提示選擇運(yùn)算方式。選擇錯(cuò)誤則提示“無此選項(xiàng)”,運(yùn)行結(jié)束,選擇正確的選項(xiàng)將進(jìn)行相應(yīng)的運(yùn)算并輸出顯示。錯(cuò)誤選擇: 相乘: 相加: 相減: 7、設(shè)計(jì)心得 這個(gè)程序是我較早時(shí)就已經(jīng)完成了的,當(dāng)時(shí)只是完成了多項(xiàng)式相乘,并且由多項(xiàng)式相乘延伸到了大數(shù)相乘,由于設(shè)計(jì)思路大部分相同,所以在選題時(shí)只選了多項(xiàng)式計(jì)算這個(gè)程序。當(dāng)今天再次看這個(gè)程序時(shí)發(fā)現(xiàn)有的代碼是多余的,所以我又將主要功能函數(shù)簡化了些。之后又增加了幾個(gè)運(yùn)算功能。本來大部分的輸入與選擇都是在主函數(shù)里實(shí)現(xiàn)的,為了是程序更美觀,我又加了一個(gè)選擇函數(shù)與顯示函數(shù)。所以這次的設(shè)計(jì),增加了我對程序美觀的認(rèn)識,其實(shí)模塊清楚后看上去也更容易理解些。 IBM“藍(lán)云"云計(jì)算平臺應(yīng)用實(shí)例 IBM的“藍(lán)云”計(jì)算平臺是一套軟、硬件平臺,將Internet上使用的技術(shù)擴(kuò)展到企業(yè)平臺上,使得數(shù)據(jù)中心使用類似于互聯(lián)網(wǎng)的計(jì)算環(huán)境?!八{(lán)云”大量使用了IBM先進(jìn)的大規(guī)模計(jì)算技術(shù),結(jié)合了IBM自身的軟、硬件系統(tǒng)以及服務(wù)技術(shù),支持開放標(biāo)準(zhǔn)與開放源代碼軟件?!八{(lán)云”基于IBM Almaden研究中心的云基礎(chǔ)架構(gòu),采用了Xen和PowerVM虛擬化軟件,Linux操作系統(tǒng)映像以及Hadoop軟件(Google File System以及MapReduce的開源實(shí)現(xiàn))。IBM已經(jīng)正式推出了基于x86芯片服務(wù)器系統(tǒng)的“藍(lán)云”產(chǎn)品。 “藍(lán)云”計(jì)算平臺由一個(gè)數(shù)據(jù)中心、IBM Tivoli部署管理軟件(Tivoli provisioning manager)、IBMTivoli監(jiān)控軟件(IBM Tivoli monitoring)、IBM WebSphere應(yīng)用服務(wù)器、IBM DB2數(shù)據(jù)庫以及一些開源信息處理軟件和開源虛擬化軟件共同組成。“藍(lán)云”的硬件平臺環(huán)境與一般的x86服務(wù)器集群類似,使用刀片的方式增加了計(jì)算密度?!八{(lán)云”軟件平臺的特點(diǎn)主要體現(xiàn)在虛擬機(jī)以及對于大規(guī)模數(shù)據(jù)處理軟件Apache Hadoop的使用上。Hadoop是開源版本的Google File System軟件和MapReduce編程規(guī)范。 “藍(lán)云”計(jì)算平臺中的虛擬化技術(shù):“藍(lán)云”軟件的一個(gè)重要特點(diǎn)是虛擬化技術(shù)的使用。虛擬化的方式在“藍(lán)云”中有兩個(gè)級別,一個(gè)是在硬件級別上實(shí)現(xiàn)虛擬化,另一個(gè)是通過開源軟件實(shí)現(xiàn)虛擬化。硬件級別的虛擬化可以使用IBM P系列的服務(wù)器,獲得硬件的邏輯分區(qū)LPAR(logic partition)。邏輯分區(qū)的CPU資源能夠通過IBM Enterprise Workload Manager來管理。通過這樣的方式加上在實(shí)際使用過程中的資源分配策略,能夠使相應(yīng)的資源合理地分配到各個(gè)邏輯分區(qū)。P系列系統(tǒng)的邏輯分區(qū)最小粒度是1/10顆中央處理器(CPU)。Xen則是軟件級別上的虛擬化,能夠在Linux基礎(chǔ)上運(yùn)行另外一個(gè)操作系統(tǒng)。 虛擬機(jī)是一類特殊的軟件,能夠完全模擬硬件的執(zhí)行,運(yùn)行不經(jīng)修改的完整的操作系統(tǒng),保留了一整套運(yùn)行環(huán)境語義。通過虛擬機(jī)的方式。在云計(jì)算平臺上獲得如下一些優(yōu)點(diǎn): (1)云計(jì)算的管理平臺能夠動態(tài)地將計(jì)算平臺定位到所需要的物理節(jié)點(diǎn)上,而無須停止運(yùn)行在虛擬機(jī)平臺上的應(yīng)用程序,進(jìn)程遷移方法更加靈活;(2)降低集群電能消耗,將多個(gè)負(fù)載不是很重的虛擬機(jī)計(jì)算節(jié)點(diǎn)合并到同一個(gè)物理節(jié)點(diǎn)上,從而能夠關(guān)閉空閑的物理節(jié)點(diǎn),達(dá)到節(jié)約電能的目的;(3)通過虛擬機(jī)在不同物理節(jié)點(diǎn)上的動態(tài)遷移,遷移了整體的虛擬運(yùn)行環(huán)境,能夠獲得與應(yīng)用無關(guān)的負(fù)載平衡性能;(4)在部署上也更加靈活,即可以將虛擬機(jī)直接部署到物理計(jì)算平臺上,而虛擬機(jī)本身就包括了相應(yīng)的操作系統(tǒng)以及相應(yīng)的應(yīng)用軟件,直接將大量的虛擬機(jī)映像復(fù)制到對應(yīng)的物理節(jié)點(diǎn)即可。 “藍(lán)云”計(jì)算平臺中的存儲體系結(jié)構(gòu):“藍(lán)云”計(jì)算平臺中的存儲體系結(jié)構(gòu)對于云計(jì)算來說也是非常重要的,無論是操作系統(tǒng)、服務(wù)程序還是用戶的應(yīng)用程序的數(shù)據(jù)都保存在存儲體系中?!八{(lán)云”存儲體系結(jié)構(gòu)包含類似于Google File System的集群文件系統(tǒng)以及基于塊設(shè)備方式的存儲區(qū)域網(wǎng)絡(luò)SAN。 在設(shè)計(jì)云計(jì)算平臺的存儲體系結(jié)構(gòu)時(shí),不僅僅是需要考慮存儲容最的問題。實(shí)際上,隨著硬盤容量的不斷擴(kuò)充以及硬盤價(jià)格的不斷下降??梢酝ㄟ^組合多個(gè)磁盤獲得很大的磁盤容量。相對于磁盤的容量,在云計(jì)算平臺的存儲中,磁盤數(shù)據(jù)的讀寫速度是一個(gè)更重要的問題,因此需要對多個(gè)磁盤進(jìn)行同時(shí)讀寫。這種方式要求將數(shù)據(jù)分配到多個(gè)節(jié)點(diǎn)的多個(gè)磁盤當(dāng)中。為達(dá)到這一目的,存儲技術(shù)有兩個(gè)選擇,一個(gè)是使用類似于Google File System的集群文件系統(tǒng)。另一個(gè)是基于塊設(shè)備的存儲區(qū)域網(wǎng)絡(luò)SAN系統(tǒng)。 在藍(lán)云計(jì)算平臺上,SAN系統(tǒng)與分布式文件系統(tǒng)(例如Google File System)并不是相互對立的系統(tǒng),SAN提供的是塊設(shè)備接口。需要在此基礎(chǔ)上構(gòu)建文件系統(tǒng),才能被上層應(yīng)用程序所使用。而Google File System正好是一個(gè)分布式的文件系統(tǒng),能夠建立在SAN之上。兩者都能提供可靠性、可擴(kuò)展性,至于如何使用還需要由建立在云計(jì)算平臺上的應(yīng)用程序來決定,這也體現(xiàn)了計(jì)算平臺與上層應(yīng)用相互協(xié)作的關(guān)系。 圓錐體積計(jì)算和應(yīng)用 教材第15頁例 2、“練一練”,練習(xí)三第6-11題。 教學(xué)目標(biāo): 使學(xué)生進(jìn)一步掌握圓錐的體積計(jì)算方法,能根據(jù)不同的條件計(jì)算圓錐的體積,給應(yīng)用圓錐體積解決一些簡單的實(shí)際問題。 教學(xué)重點(diǎn): 運(yùn)用公式解決生活中的實(shí)際問題 教學(xué)難點(diǎn): 運(yùn)用公式解決生活中的實(shí)際問題 教具準(zhǔn)備:小黑板 教學(xué)進(jìn)程: 一、復(fù)習(xí)舊知 1、口算 練習(xí)三第6題,指名學(xué)生口算。 2、復(fù)習(xí)體積計(jì)算。 (1)問:圓錐的體積怎樣計(jì)算?為什么圓錐體積V= Sh? (2)口答下列各圓錐的體積。 ①底面積3平方分米,高2分米。 ②底面積4平方厘米,高4.5。 3、引入新課 今天這節(jié)課,我們練習(xí)圓錐體積的計(jì)算,通過練習(xí),還要能應(yīng)用圓錐體積計(jì)算的方法解決些簡單實(shí)際問題。 二、教學(xué)新課 1、教學(xué)例2 出示例2: 學(xué)生讀題 問:你們認(rèn)為這道題要先求什么,再求這堆沙的重量? 指名學(xué)生板演,其余學(xué)生獨(dú)立做。 集體訂正 2、組織練習(xí) (1)“練一練”第1題 指名三人板演,其余學(xué)生做第(3)小題。 (2)“練一練”第2題 (3)練習(xí)三第11題 四、課內(nèi)作業(yè) 練習(xí)三第7-9題 板書設(shè)計(jì) 圓錐體積計(jì)算和應(yīng)用 例2 練習(xí) V = Sh第二篇:實(shí)驗(yàn)總結(jié)報(bào)告-線性表
第三篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-一元多項(xiàng)式加減乘計(jì)算
第四篇:云計(jì)算應(yīng)用實(shí)例
第五篇:圓錐體積計(jì)算和應(yīng)用