數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告矩陣的運算.doc_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告矩陣的運算.doc_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告矩陣的運算.doc_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告矩陣的運算.doc_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告矩陣的運算.doc_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

荊楚理工學(xué)院課程設(shè)計成果 學(xué)院:_荊楚理工學(xué)院_ 班 級: 計算機(jī)科學(xué)與技術(shù)本一班 學(xué)生姓名: 沈猛 學(xué) 號: 2012404010145 設(shè)計地點(單位)_ _設(shè)計題目:_矩陣的轉(zhuǎn)置、加減和相乘_ 完成日期: 2013 年 12 月 30 日 指導(dǎo)教師評語: _ _ _ _ 成績(五級記分制):_ 教師簽名:_ _目 錄1 問題描述12 需求分析13 概要設(shè)計131抽象數(shù)據(jù)類型定義132模塊劃分24 詳細(xì)設(shè)計241數(shù)據(jù)類型的定義342主要模塊的算法描述35 測試分析96 課程設(shè)計總結(jié)11參考文獻(xiàn)12附錄 全部代碼131 問題描述采用十字鏈表存儲的稀疏矩陣,完成矩陣轉(zhuǎn)置、加減和相乘功能。2 需求分析(1)先用do-while語句選擇要操作的程序:1、矩陣的相加,2、矩陣的相乘,3、矩陣轉(zhuǎn)置。(2)輸入你想要操作的程序再用switch選擇:轉(zhuǎn)置函數(shù)void NormalTSMatrix(TSMatrix M,TSMatrix &T) ;加法函數(shù)void SeqAdd(TSMatrix a, TSMatrix b,TSMatrix &c);乘法函數(shù)void multsmatrix(TSMatrix M,TSMatrix N,TSMatrix &T);(3)在調(diào)用以上函數(shù)時先要建立三元數(shù)組輸入函數(shù)void InitTSM(TSMatrix *M)和矩陣的輸出函數(shù)void ShowTSM(TSMatrix M)。3 概要設(shè)計31抽象數(shù)據(jù)類型定義ADT Array數(shù)據(jù)對象:D=aj1j2jn|n(0)稱為數(shù)組的維數(shù),bi是數(shù)組第i維的長度,ji是數(shù)組元素的第i 維下標(biāo),aj1j2jnElemSet, ji=0, ,bi-1, i=1,2, ,n數(shù)據(jù)關(guān)系:R=R1,R2, ,RnRi=|0jkbk-1,1kn且ki, 0jibi-2,aj1.ji.jn,aj1ji+1jnD, i=2, ,n 基本操作: InitArray( &A, n, bound1, , boundn ) 操作結(jié)果:若維數(shù)n和各維長度合法,則構(gòu)造相應(yīng)的數(shù)組A,并返回OK。 DestroyArray( &A ) 操作結(jié)果:銷毀數(shù)組A。 Value( A, &e, index1, , indexn ) 初始條件:A是n維數(shù)組,e為元素變量,隨后是n個下標(biāo)值。 操作結(jié)果:若各下標(biāo)不越界,則e賦值為所指定的A的元素值,并返回OK。 Assign( &A, e, index1, , indexn ) 初始條件:A是n維數(shù)組,e為元素變量,隨后是n個下標(biāo)值。 操作結(jié)果:若下標(biāo)不越界,則將e的值賦給所指定的A的元素,并返回OK。ADT Array32模塊劃分本程序包括三個模塊:(1)主程序模塊void main()矩陣的相加矩陣的相乘矩陣的轉(zhuǎn)置(2)相加模塊實現(xiàn)矩陣的相加(3)相乘模塊實現(xiàn)矩陣的相乘(4)轉(zhuǎn)置模塊實現(xiàn)矩陣的轉(zhuǎn)置4 詳細(xì)設(shè)計41數(shù)據(jù)類型的定義#define MAXSIZE 1000typedef struct int e; int i,j;Triple; /*三元組類型定義*/typedef struct Triple dataMAXSIZE+1; int mu,nu,tu;TSMatrix; /*三元組順序表類型定義*/42主要模塊的算法描述(1) 主函數(shù) 圖1 主函數(shù)輸入int i,進(jìn)行switch選擇:當(dāng)輸入時1時操作1即進(jìn)行矩陣的加法,同理輸入時2和3時進(jìn)行的是矩陣的乘法和轉(zhuǎn)置;輸入是其他數(shù)時不進(jìn)行任何操作只輸出的是“choose error” 。(2) 建立十元數(shù)組矩陣圖2 建立十元數(shù)組矩陣首先輸入矩陣行數(shù),列數(shù),非零元素的個數(shù),然后進(jìn)行for循環(huán),在循環(huán)中請輸入元素所在行,列,值在判斷m=0|nM-mu|nM-nu是否成立,若成立則輸出input error!,若不成立則執(zhí)行M-datai.i=m; M-datai.j=n;M-datai.e=e。(3) 輸出矩陣圖3 輸出矩陣先是for語句控制輸出的格式,再用兩個for語句控制矩陣的行和列在等二個for語句中用if語句判斷M.datat.i=m&M.datat.j=n若成立則printf(%dt,M.datat.e);t+;否則printf(0t),即在矩陣中沒有數(shù)的地方輸出0。(4)矩陣的加法圖4 矩陣加法首先進(jìn)行是while(i=a.tu & j=b.tu)循環(huán),在此循環(huán)中分別判斷兩矩陣的行相等和不相等,列的相等和不相等時要分別執(zhí)行不同的語句即a的行號等于b的行號和a的列號等于b的列號時此時將他們的數(shù)據(jù)直接相加;a的行號等于b的行號和a的列號小于b的列號時相加后的值等于列號更小的矩陣中對應(yīng)元素的值;如果a的列號大于b的列號且行號相等,則相加后的值等于列號更小的矩陣中對應(yīng)元素的值;如果a的行號小于b的行號且列號相等,則相加后的值等于行號更小的矩陣中對應(yīng)元素的值;如果a的行號大于b的行號且列號相等,則相加后的值等于行號更小的矩陣中對應(yīng)元素的值。然后執(zhí)行while(i=a.tu)和while(jdataQn.e=*(Qe+(i-1)*N.nu+j);T-dataQn.i=i; T-dataQn.j=j;。(6)矩陣的轉(zhuǎn)置圖6 矩陣的轉(zhuǎn)置先把矩陣M的行數(shù)和列數(shù)分別賦給轉(zhuǎn)置后矩陣T的列數(shù)和行數(shù),元素個數(shù)不變;然后再找出矩陣的M的i列元素,得到矩陣T的i行元素,直至全部轉(zhuǎn)置完。5 測試分析測試數(shù)據(jù)及結(jié)果如下:圖7矩陣的加法測試分析結(jié)果根據(jù)矩陣加法測試結(jié)果分析可知:矩陣的加法是要比較矩陣A的行和列與矩陣B行和列分別之間大小,來執(zhí)行不同的語句。圖8 矩陣乘法測試分析結(jié)果根據(jù)矩陣乘法測試結(jié)果分析可知:首先要判斷矩陣的列數(shù)是否與矩陣的行數(shù)相等,如果若相等則執(zhí)行乘法相關(guān)語句,否則不能進(jìn)行乘法語句。 圖9 矩陣轉(zhuǎn)置測試分析結(jié)果根據(jù)矩陣轉(zhuǎn)置測試結(jié)果分析:只要你輸入的矩陣是對的則就能轉(zhuǎn)置。但注意不要超過MAXSIZE的值。6 課程設(shè)計總結(jié)通過這次課程設(shè)計使我充分的理解了用三元數(shù)組實現(xiàn)稀疏矩陣的加法,乘法,轉(zhuǎn)置。雖然此次的程序不是很完備,但是總體還是一個比較能體現(xiàn)數(shù)據(jù)結(jié)構(gòu)知識點能力的程序了,當(dāng)然只是相對于我這個初學(xué)者來說。在剛開始編程的時候,我感到很吃力,不知如何去編寫源程序,后來柳老師叫我們?nèi)タ创祟}目要用到那些知識和去上網(wǎng)搜索相關(guān)程序,此后經(jīng)過一個星期的努力終于編好了源程序,可是不能運行,我們這小組經(jīng)過反復(fù)的討論都沒找出錯誤,此時我們只好請教柳老師,老師一看就發(fā)現(xiàn)了問題原來我們定義的MAXSIZE 的值溢出了。其余的問題不大,只是程序不夠完美。所以我們又對程序進(jìn)行改進(jìn)直至完成。在此我非常要感謝的是我的指導(dǎo)老師柳小文老師,感謝老師的細(xì)心認(rèn)真的輔導(dǎo),讓我對數(shù)據(jù)結(jié)構(gòu)這門課程有了一定的研究。參考文獻(xiàn)教學(xué)參考書1李素若.數(shù)據(jù)結(jié)構(gòu).北京:化學(xué)工業(yè)出版社,2009.參考資料:1 朱蓉,數(shù)據(jù)結(jié)構(gòu)實驗指導(dǎo)書2嚴(yán)蔚敏 吳偉民,.數(shù)據(jù)結(jié)構(gòu)(C語言版),1999,清華大學(xué)出版社;3嚴(yán)蔚敏 吳偉民,.數(shù)據(jù)結(jié)構(gòu)題集(C語言版),1999,清華大學(xué)出版社;4徐孝凱,數(shù)據(jù)結(jié)構(gòu)課程實驗,2002,清華大學(xué)出版社;5孟佳娜 胡瀟琨,算法與數(shù)據(jù)結(jié)構(gòu)實驗與習(xí)題,2004,機(jī)械工業(yè)出版社;附錄 全部代碼#includestdio.h#include stdlib.h#includemalloc.h#define MAXSIZE 1000typedef struct int e; int i,j;Triple; /*三元組類型定義*/typedef struct Triple dataMAXSIZE+1; int mu,nu,tu;TSMatrix; /*三元組順序表類型定義*/void InitTSM(TSMatrix *M); /函數(shù)聲明void ShowTSM(TSMatrix M);void NormalTSMatrix(TSMatrix M,TSMatrix *T) ;void SeqAdd(TSMatrix a,TSMatrix b,TSMatrix *c);void multsmatrix(TSMatrix M,TSMatrix N,TSMatrix *T);void main() /主函數(shù) int i; TSMatrix sm,sm1,sm2,sm3,tsm; do printf(*n); printf(請選擇你想要的操作n);printf(); printf(1 矩陣相加); printf(2 矩陣相乘); printf(3 轉(zhuǎn)置n); scanf(%d,&i); switch(i) case 1: system(cls); printf(請創(chuàng)建A矩陣n); InitTSM(&sm1); ShowTSM(sm1); printf(請創(chuàng)建B矩陣n); InitTSM(&sm2); ShowTSM(sm2); printf(A加上B為:n); SeqAdd(sm1,sm2,&sm3); printf(*n); ShowTSM(sm3); break; case 2: system(cls); printf(請創(chuàng)建A矩陣n); InitTSM(&sm1); ShowTSM(sm1); printf(請創(chuàng)建B矩陣n); InitTSM(&sm2); ShowTSM(sm2); printf(A乘以B為:n); multsmatrix(sm1,sm2,&sm3); ShowTSM(sm3); break; case 3: system(cls); printf(請創(chuàng)建矩陣n); InitTSM(&sm); ShowTSM(sm); printf(矩陣轉(zhuǎn)置為:n); NormalTSMatrix( sm, &tsm) ; ShowTSM(tsm); break; default: printf(choose error!n); while(i!=0);void InitTSM(TSMatrix *M) /初始化數(shù)組元素 int e,m,n,t,i; printf(請輸入矩陣行數(shù),列數(shù),非零元素的個數(shù):n); scanf(%d%d%d, &m,&n,&t); M-mu=m; M-nu=n; M-tu=t; for( i=1;i=t;i+) printf(請輸入元素所在行,列,值:); scanf(%d%d%d, &m,&n,&e); if(m=0|nM-mu|nM-nu) printf(input error!n); i-; else M-datai.i=m; M-datai.j=n; M-datai.e=e; void ShowTSM(TSMatrix M) /顯示數(shù)組元素 int m,n,i,t=1; printf(則矩陣為:n); for( i=1;i=M.nu;i+) printf(%dt,i); printf(n); printf(*n); for(m=1;m=M.mu;m+) for(n=1;nmu=M.nu; T-nu=M.mu; T-tu=M.tu; if(T-tu) int t,i,k=1; for( i=1;iM.nu;i+) for( t=1;tdatak.i=M.datat.j; T-datak.j=M.datat.i; T-datak+.e=M.datat.e; void SeqAdd(TSMatrix a,TSMatrix b,TSMatrix *c) /矩陣加法 int i=1,j=1,k=1; /下標(biāo)置初始值 while(i=a.tu & jdatak.i=a.datai.i; c-datak.j=a.datai.j; c-datak.e=a.datai.e+b.dataj.e;/此時將他們的數(shù)據(jù)直接相加 i+; j+; k+; else if(a.datai.jdatak.i=a.datai.i; c-datak.j=a.datai.j; c-datak.e=a.datai.e;/如果行號相等,則相加后的值等于列號更小的矩陣中對應(yīng)元素的值 i+; k+; else if(a.datai.jb.dataj.j)/a的列號大于b的列號 c-datak.i=b.dataj.i; c-datak.j=b.dataj.j; c-datak.e=b.dataj.e; /如果行號相等,則相加后的值等于列號更小的矩陣中對應(yīng)元素的值 j+; k+; else if(a.datai.idatak.i=a.datai.i; c-datak.j=a.datai.j; c-datak.e=a.datai.e;/如果列號相等,則相加后的值等于行號更小的矩陣中對應(yīng)元素的值 i+; k+; else if(a.datai.ib.dataj.i)/a的行號大于b的行號 c-datak.i=b.dataj.i; c-datak.j=b.dataj.j; c-datak.e=b.dataj.e;/如果列號相等,則相加后的值等于行號更小的矩陣中對應(yīng)元素的值 j+; k+; while(idatak.e=a.datai.e; c-datak.i=a.datai.i; c-datak.j=a.datai.j; i+; k+; while(jdatak.e=a.dataj.e; c-datak.i=a.dataj.i; c-datak.

溫馨提示

  • 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

提交評論