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

下載本文檔

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

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告題 目:專 業(yè):班 級:學(xué) 號:姓 名:指導(dǎo)老師:時 間:一、課程設(shè)計題目及所涉及知識點設(shè)計題目是“矩陣的運算” ,所涉及的知識點主要是:1、數(shù)據(jù)結(jié)構(gòu)中的對于結(jié)構(gòu)體的定義, 用 typedef struct 來實現(xiàn),根據(jù)所設(shè)計的問題在 結(jié)構(gòu)體里面定義數(shù)據(jù)類型及其變量, 用 define 定義數(shù)組的大小,然后利用 typedef 來 實現(xiàn)對于變量的未知類型確定正確的類型。2、利用數(shù)組的形式來儲存數(shù)據(jù),在實現(xiàn)不同操作過程中,有的用一維結(jié)構(gòu)體數(shù)組(三元 組順序表)來存儲,有的用二維數(shù)組來儲存。3、轉(zhuǎn)置的過程中利用的是快速轉(zhuǎn)置的方法,附設(shè)了 num和cpot兩個輔助變量。4、矩陣的

2、加法、減法、乘法、逆運算的基本算法方式。5、通過調(diào)用每個函數(shù),來實現(xiàn)每個算法的功能。二、課程設(shè)計思路及算法描述設(shè)計思路:1、首先是對于轉(zhuǎn)置的考慮, 要運用快速轉(zhuǎn)置的方法實現(xiàn), 必須用三元組順序表來儲存數(shù)據(jù),所以在第一個結(jié)構(gòu)體中存在int類型的行數(shù)(mU列數(shù)(nu)以及非零 元素的個數(shù)( tu );然后第二個結(jié)構(gòu)體中分別有非零元素的行下標( i )、列下標(j)和元素數(shù)值(e),最后在第一個結(jié)構(gòu)體中實現(xiàn)對第二個結(jié)構(gòu)體成為數(shù)組結(jié) 構(gòu)體類型。2、對于其余加法、減法、乘法和逆運算則是運用另一個結(jié)構(gòu)體來實現(xiàn),里面只有矩 陣的行數(shù)、列數(shù)和一個二維數(shù)組(用 float 來定義類型)。3、在 main 函數(shù)里

3、面, 來實現(xiàn)對于數(shù)據(jù)的輸入操作, 利用 if 語句進行選擇來執(zhí)行操作,利用dowhile語句來實現(xiàn)功能的循環(huán)操作。4、分五個函數(shù)調(diào)用分別來實現(xiàn)轉(zhuǎn)置、加法、乘法、和逆運算,每個里面都有最終輸 出結(jié)果的方式。算法 1:矩陣的轉(zhuǎn)置輸入:mu中存放矩陣的行數(shù),tu存放矩陣的列數(shù),i接收行下標的數(shù)值,j接收列 下標的數(shù)值,e來存儲數(shù)據(jù)。輸出:轉(zhuǎn)置后的新矩陣。輸入兩行兩列數(shù)據(jù),在第二行第一列中有個數(shù)據(jù)為 12,其余都為 0,則輸出的結(jié)果 為第一行第二列數(shù)據(jù)為 12,其余為 0。算法 2:矩陣的加法運算輸入:i中存放矩陣的行數(shù),j中存放矩陣的列數(shù),二維數(shù)組b中存放每個數(shù)據(jù)。 輸出:矩陣加完后的另一個新矩陣。

4、輸入兩個兩行三列的矩陣, 在第一個矩陣里面第一行第一列有個數(shù)據(jù) 20,其余為 0, 在第二個矩陣里面第一行第二列中有個數(shù)據(jù) 30,其余為 0,則輸出的結(jié)果為一個兩 行三列的矩陣,其中第一行第一列數(shù)據(jù)為 20,第一行第二列數(shù)據(jù)為 30,其余為 0。算法 3:矩陣的減法運算輸入:i中存放矩陣的行數(shù),j中存放矩陣的列數(shù),二維數(shù)組b中存放每個數(shù)據(jù)。 輸出:矩陣相減后的另一個新矩陣。輸入兩個兩行三列的矩陣, 在第一個矩陣里面第一行第一列有個數(shù)據(jù) 20,其余為 0, 在第二個矩陣里面第一行第一列中有個數(shù)據(jù) 30,其余為 0,則輸出的結(jié)果為一個兩 行三列的矩陣,其中第一行第一列數(shù)據(jù)為 -10,其余為 0。算

5、法 4:矩陣的乘法運算輸入:i中存放矩陣的行數(shù),j中存放矩陣的列數(shù),二維數(shù)組b中存放每個數(shù)據(jù)。 輸出:矩陣加完后的另一個新矩陣。輸入兩行兩列的矩陣,第一個矩陣里面第一行第一列有個數(shù)據(jù) 2 第二列有個數(shù)據(jù) 3, 其余為 0,在第二個矩陣里面第一行第一列有個數(shù)據(jù) 2第二列中有個數(shù)據(jù) 3,其余為 0,則輸出的結(jié)果為一個兩行兩列的矩陣,其中第一行第一列數(shù)據(jù)為 4,第二列為 6, 第一行第二列數(shù)據(jù)為 30,其余為 0。算法五:矩陣的逆運算輸入:i中存放矩陣的行數(shù),j中存放矩陣的列數(shù),二維數(shù)組b中存放每個數(shù)據(jù)。 輸出:矩陣進行逆運算完后的另一個新矩陣。輸入三行三列的矩陣,第一個矩陣里面第一行第一列有個數(shù)據(jù)

6、 3 個數(shù)據(jù)分別為 1, 2,3;第二行的數(shù)據(jù)分別為 2, 2, 1;第三行的暑假分別為 3, 4, 3;則輸出的結(jié)果為 三行三列矩陣, 其中第一行的數(shù)據(jù)為 1, 3, -2;第二行的數(shù)據(jù)分別為 -1.5 , -3, 2.5; 第三行的數(shù)據(jù)分別為 1, 1, -1。三、課程設(shè)計中遇到的難點及解決辦法1、在轉(zhuǎn)置的過程中,要求把轉(zhuǎn)置后的矩陣輸出出來,因為用的是三元組順序表的存儲 形式,所以不知道怎么去實現(xiàn),然后通過進一步思考,運用先把一個矩陣存入零元素,然后 在對其進行更改,最后完成了此項的工作。2、就是對于矩陣的乘法運算和逆運算,掌握的不夠熟練,先是通過書籍對于矩陣的乘法和逆運算得到更深的了解,

7、然后通過一步步寫程序最后實現(xiàn)了矩陣的乘法運算和逆運算四、總結(jié)通過此次課程設(shè)計, 讓我對于編程有了更深的認識, 老師的精心指導(dǎo)讓我學(xué)會到了很多, 不僅僅是代碼,最主要的讓我的思維開闊了很多,在這個過程中,通過不斷的嘗試,不斷的 修改,最終克服了困難,完成了自己的任務(wù),心里有種無比的喜悅,但同時又感覺到了自己 的知識面的狹隘,還有好多知識的海洋還沒有暢游,等待自己將是一回更大的考驗。對于現(xiàn)在的自己,對學(xué)習(xí)程序還是有很大的興趣,它讓我體驗到了很多的快樂,我要進 步跟進現(xiàn)在的課程,努力去發(fā)展自己,按照老師說的最主要的是具有了編程的思想,則具有 了編程的能力,我想我可以成功完成自己的目標。五、附錄主要源

8、程序代碼及運行結(jié)果1、主要源程序代碼 :# include <stdio.h># define max 100# define maxsize 100typedef float elemtype;typedef struct float bmaxmax;int i;/ 矩陣的行數(shù)int j;/ 矩陣的列數(shù) tsmatrix;typedef struct int i,j;/ 該非零元的行下標和列下標elemtype e;triple;typedef struct triple datamaxsize+1;/ 非零元三元組 ,data0 未用int mu,nu,tu;/ 矩陣的行數(shù)、列

9、數(shù)和非零元個數(shù)sqlist ;void zhuanzhi(sqlist s1,tsmatrix &l2)/ 矩陣的轉(zhuǎn)置 sqlist s2;int col,t9,p,q,a1,b1;int num100,copt100;s2.mu=s1.mu;s2.nu=s1.nu;s2.tu=s1.tu;if(s2.tu>0) for(col=1;col<=s1.nu;+col) numcol=0;for(t9=1;t9<=s1.tu;+t9)+nums1.datat9.j;/求 s1 中每一列含非零元個數(shù)copt1=1;/ 求第 col 列中第一個非零元在 s2.data 中序號

10、for(col=2;col<=s1.nu;+col) coptcol=coptcol-1+numcol-1;for(p=1;p<=s1.tu;+p) col=s1.datap.j;q=coptcol;s2.dataq.i=s1.dataq.j; s2.dataq.j=s1.dataq.i;s2.dataq.e=s1.dataq.e;+coptcol;l2.bs2.dataq.is2.dataq.j=s2.dataq.e;printf(" 轉(zhuǎn)置后的數(shù)據(jù)是 :n");printf("*for(a1=1;a1<=s1.nu;a1+) for(b1=1;

11、b1<=s1.mu;b1+) printf("%10.3f",l2.ba1b1); printf("t"); printf("n");矩陣的加法printf("printf("n");void jiafa(tsmatrix l4, tsmatrix l5)/ tsmatrix l6;for(int t=0; t<l4.i;t+) for(int t1=0;t1<l4.j;t1+)l6.btt1=l4.btt1+l5.btt1; printf(" 矩陣加完后的結(jié)果 :n"

12、;);printf("f*n");for(int t2=0; t2<l4.i;t2+) for(int t3=0;t3<l4.j;t3+) printf("%10.3f",l6.bt2t3);printf("t");printf("n");printf("f*n");void jianfa(tsmatrix l4, tsmatrix l5)/ tsmatrix l6;for(int t=0; t<l4.i;t+)矩陣的減法 for(int t1=0;t1<l4.j;t1+

13、)l6.btt1=l4.btt1-l5.btt1; printf(" 矩陣相減后的結(jié)果 :n");printf("f*n");for(int t2=0; t2<l4.i;t2+) for(int t3=0;t3<l4.j;t3+)printf("%10.3f",l6.bt2t3);printf("t");printf("n");printf("f*n");void chengfa(tsmatrix l4, tsmatrix l5)/矩陣的乘法 tsmatrix l

14、6;for(int t=0;t<l4.i;t+)for(int t1=0;t1<l5.j;t1+) l6.btt1=0;for(int k=0;k<l4.j;k+)l6.btt1+=l4.btk*l5.bkt1;printf(" 矩陣乘完后的結(jié)果 :n");printf("*n");for(int t2=0; t2<l4.i;t2+) for(int t3=0;t3<l5.j;t3+)printf("%10.3f",l6.bt2t3);printf("t");printf("

15、n"); printf("*n");矩陣的逆運算void niyunsuan( tsmatrix s)/ tsmatrix s1;float t,x;int k,i,j; for(i=0;i<s.i;i+)for(j=0;j<(2*s.i);j+) if(j<s.i) s1.bij=s.bij;else if(j=s.i+i) s1.bij=1.0;else s1.bij=0.0;for(i=0;i<s.i;i+) for(k=0;k<s.i;k+)if(k!=i) t=s1.bki/s1.bii;for(j=0;j<(2*s.

16、i);j+) x=s1.bij*t;s1.bkj=s1.bkj-x; for(i=0;i<s.i;i+) t=s1.bii;for(j=0;j<(2*s.i);j+)s1.bij=s1.bij/t; float y=1.0;for(i=0;i<s.i;i+) y=y*s1.bii;if(y=0.0)printf(" 對不起,您輸入的矩陣沒有逆矩陣 "); else for(i=0;i<s.i;i+)for(j=0;j<s.i;j+)s.bij=s1.bij+s.i; printf(" 矩陣逆運算后的結(jié)果 :n");for(i

17、=0;i<s.i;i+) for(j=0;j<s.i;j+) printf("%10.3f",s.bij); printf("n");void main() tsmatrix l,l1,l3; sqlist s;int m,n,m1,n1,n4,n5,t,t1,t2,t3,t4,t5,t6,t7,t8;do printf(" 請輸入你要進行的操作: n");printf("f*n");8printf(" 矩陣轉(zhuǎn)置運算請按 1n 矩陣的加法運算請按 2n 矩陣的乘法運算請按 3n矩陣的減法運算請

18、按 4n 矩陣的逆運算請按 5n 結(jié)束請按 0:n");scanf("%d",&m1);if(m1=1) printf(" 您選擇進行的操作是矩陣的轉(zhuǎn)置運算 nn"); printf(" 請輸入你要轉(zhuǎn)置矩陣的行數(shù)、列數(shù)和非零元的個數(shù) n"); scanf("%d",&t1);scanf("%d",&t2);scanf("%d",&t3);s.mu=t1;s.nu=t2;s.tu=t3;printf(" 請輸入你要轉(zhuǎn)置矩陣非零

19、元的行下標、列下標 ( 從 11 開始由左至右由上到 下)及其數(shù)據(jù) (按行逐個輸入 )n");for(t4=1;t4<=s.tu;t4+)scanf("%d",&t5);scanf("%d",&t6);s.datat4.i=t5;s.datat4.j=t6; scanf("%f",&s.datat4.e); for(t7=1;t7<=s.nu;t7+) for(t8=1;t8<=s.mu;t8+)l1.bt7t8=0.0; zhuanzhi(s,l1);if(m1=2)printf(

20、" 您選擇進行的操作是矩陣的加法運算 nn"); printf(" 請輸入矩陣的行數(shù)和列數(shù) :n");scanf("%d",&n);scanf("%d",&m);l.i=n;l.j=m;l3.i=n;l3.j=m;printf("*n");printf(”請輸入第一個出亍(列的矩陣n",l.i,l.j); for(t=0;t<l.i;t+)for(n1=0;n1<l.j;n1+)scanf("%f",&l.btn1);printf

21、("*n");printf("*n");printf("請輸入第二個出亍4列的矩陣n",l3.i,l3.j);for(n4=0;n4<l3.i;n4+) for(n5=0;n5<l3.j;n5+)scanf("%f",&l3.bn4n5);printf("*n");jiafa(l,l3);if(m1=3)printf(" 您選擇進亍的操作是矩陣的乘法運算 n( 只有當?shù)谝粋€矩陣的列數(shù)等于第二個 矩陣的亍數(shù)方可進亍計算 )nn");printf("

22、 請輸入第一個矩陣的亍數(shù)和列數(shù) :n");scanf("%d",&n); scanf("%d",&m);l.i=n;l.j=m;printf("*n");printf("請輸入第一個出亍(列的矩陣n",l.i,l.j); for(t=0;t<l.i;t+) for(n1=0;n1<l.j;n1+)scanf("%f",&l.btn1); printf("*n"); printf("*n");printf(&qu

23、ot; 請輸入第二個矩陣的亍數(shù)和列數(shù) :n"); scanf("%d",&n1);scanf("%d",&m1);l3.i=n1;l3.j=m1; printf("*n");printf("請輸入第二個出亍4列的矩陣n",l3.i,l3.j);for(n4=0;n4<l3.i;n4+) for(n5=0;n5<l3.j;n5+) scanf("%f",&l3.bn4n5); printf("*n");chengfa(l,l3);

24、if(m1=4)printf(" 您選擇進亍的操作是矩陣的減法運算 nn"); printf(" 請輸入矩陣的亍數(shù)和列數(shù) :n");scanf("%d",&n); scanf("%d",&m);l.i=n;l.j=m; l3.i=n;l3.j=m; printf("*n");printf(”請輸入第一個出亍(列的矩陣n",l.i,l.j); for(t=0;t<l.i;t+)for(n1=0;n1<l.j;n1+) scanf("%f",

25、&l.btn1); printf("*n"); printf("*n");printf("請輸入第二個出亍4列的矩陣n",l3.i,l3.j);for(n4=0;n4<l3.i;n4+) for(n5=0;n5<l3.j;n5+) scanf("%f",&l3.bn4n5); printf("*n");jianfa(l,l3);if(m1=5)printf(" printf("您選擇進亍的操作是矩陣的逆運算 nn"); 請輸入矩陣的維數(shù)

26、(即亍和列相等的矩陣 ):n");scanf("%d",&n);l.i=n;l.j=n;printf("*n");printf(" 請輸入出亍(列的矩陣n",l.i,l.j); for(t=0;t<l.i;t+)for(n1=0;n1<l.j;n1+)scanf("%f",&l.btn1);printf("*n");niyunsuan(l);while(m1!=0);2、運亍結(jié)果(如下圖) :(1)、執(zhí)亍的首界面:"G:oft Visual Stu

27、dioCommonMSDev9SBinDebug5fdrexepi=i回*&.冃士冃主冃閔 ffiwlai詈 算運運運"昇 運屢法運0: 置加乘減逆按 番的SS請束ff-5-6_H-l;l£-p9(2) 、矩陣的轉(zhuǎn)置運算:I ' *G:謂l掲結(jié)羈Mkrsoft 甘i$ual Stud i oCom mo nM Dev98 Bi rXDebugVd .exe"CZI口2 3 4-5 按請請請按 請slB用 St運運運"畀 運法法法運0! 置加癇欝拯 書的的的請束您選擇進行的操作是矩陣的轉(zhuǎn)置迂算請輸入你要轉(zhuǎn)置矩陣的行數(shù)、列數(shù)和非零元的個數(shù)巒入

28、擁寰轉(zhuǎn)置矩陽淒元的行下標、列下標(從1H11開始由左至右由上到下及苴數(shù)據(jù) 彳亍逐儲入2 32置后的數(shù)據(jù)是:B.0000.000(3) 、矩陣的加法運算:I 'G邈揭結(jié)扇制icrosoft Visual StudioComnnorM SDevS8EinDebugsfd.exe"= 同 S32 3 4 1按按按- 按朗朗圍按i 請ffissis 算運運運算 運法法法運0: 置加乘減逆按 的的的請 -pH-pH-H_41n-11(4) 、矩陣的減法運算: *6;徵據(jù)結(jié)斑Micro5oft Visual StudioComnnonM5Dev986inDebugsfd.axam請輸入你

29、要進行的請請按 請»>&用 "昇運運運"畀 話法法法運0: 置加乘誠逆按的的的請-EE-E-o-Edr-rT4勒選擇進行的操作杲矩陣的減注運算 k輸入矩陣的行數(shù)和列數(shù):B 2情輸入第一個2行2列的矩陣1 21 2請輸入第二個2行?列的矩陣1 3£ 3矩陣相減后的結(jié)果:(5) 、矩陣的乘法S3二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 *2 3 4 按請請請按 請»»詈 "畀運運運"畀 運法法法運0: 置加乘誠逆按 的的的請 5一一P6一一p-pTh-rr 刃刃刃- -15聲練矩陣的行數(shù)方可進行計算幘輸入

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論