數據結構課程設計矩陣的運算.doc
《數據結構課程設計矩陣的運算.doc》由會員分享,可在線閱讀,更多相關《數據結構課程設計矩陣的運算.doc(16頁珍藏版)》請在裝配圖網上搜索。
1、數據結構 禪設計報告 題 目: 專 業(yè): 班 級: 學 號: 姓 名: 指導老師: 時 間: _、課程設計題目及所涉及知識點 設計題目是“矩陣的運算”,所涉及的知識點主要是: 1、 數據結構中的對于結構體的定義, 用typedef struct來實現,根據所設計的問題 在結構體里面定義數據類型及其變量,用define定義數組的大小,然后利用 typedef來實現對于變童的未知類型確定正確的類型。 2、 利用數組的形式來儲存數據,在實現不同操作過程中,有的用一維結構體數組(三 元組順序表)來存儲,有的用二維數組來儲存. 3、 轉迅的過程中利用的是快速轉置的方法
2、,附設了 num和cpot兩個輔助變童. 4、 矩陣的加法、減法、乘法、逆運算的基本算法方式. 5、 通過調用每個函數,來實現每個算法的功能. 二課程設計思路及算法描述 設計思路: 1、 首先是對于轉置的考慮,要運用快速轉凰的方法實現,必須用三元組順序表來 儲存數據,所以在第一個結構體中存在int類型的行數(mu)列數(nu)以及 非家元素的個數(tu);然后第二個結構體中分別有非零元素的行下標(i )、列 下標(j)和元素數值(e),最后在第一個結構體中實現對第二個結構體成為數 組結構體類型。 2、 對于其余加法、減法、乘法和逆運算則是運用另一個結構體來實現,里面只有 矩陣的行數
3、、列數和一個二維數紐(用門oat來定義類型). 3、 在main函數里面,來實現對于數據的輸入操作,利用if語句進行選擇來執(zhí)行 操作,利用do……while語句來實現功能的循環(huán)操作。 4、 分五個函數調用分別來實現轉置、加法、乘法、粗逆運算,每個里面都有最終 輸出結果的方式. 算法1:矩陣的轉置 輸入:mu中存放矩陣的行數,tu存放矩陣的列數,i接收行下標的數值,j接收列 下標的數值,e來存儲數據. 輸出:轉暹后的新矩陣. 輸入兩行兩列數據,在第二行第一列中有個數據為12,其余都為0,則輸出的結果 為第一行第二列數據為12,其余為0. 算法2:矩陣的加法運算 輸入:i中存放矩陣
4、的行數,j中存放矩陣的列數,二維數紐b中存放每個數據. 輸出:矩陣加完后的另一個新矩陣. 輸入兩個兩行三列的矩陣,在第一個矩陣里面第一行第一列有個數據20,其余為 0,在第二個矩陣里面第一行第二列中有個數據30,其余為0,則輸出的結果為一 個兩行三列的矩陣,其中第一行第一列數提為20,第一行第二列數據為30,其余 為0. 算法3:矩陣的減法運算 輸入:i中存放矩陣的行數,j中存放矩陣的列數,二維數組b中存放每個數據. 輸出:矩陣相減后的另一個新矩陣. 輸入兩個兩行三列的矩陣,在第一個矩陣里面第一行第一列有個數據20,其余為 0,在第二個矩陣里面第一行第一列中有個數據30,其余為0,
5、則輸出的結果為一 個兩行三列的矩陣,其中第一行第一列數據為-10,其余為0. 算法4:矩陣的乘法運算 輸入:i中存放矩陣的行數,j中存放矩陣的列數,二維數組b中存放每個數據. 輸出:矩陣加完后的另一個新矩陣. 輸入兩行兩列的矩陣,第一個矩陣里面第一行第一列有個數據2第二列有個數據 3,其余為0,在第二個矩陣里面第一行第一列有個數據2第二列中有個數據3,其 余為0,則輸出的結果為一個兩行兩列的矩陣,其中第一行第一列數據為4,第二 列為6,第一行第二列數據為30,其余為0. 算法五:矩陣的逆運算 輸入:i中存放矩陣的行數,j中存放矩陣的列數,二維數組b中存放每個數據. 輸出:矩陣進行
6、逆運算完后的另一個新矩陣. 輸入三行三列的矩陣,第一個矩陣里面第一行第一列有個數據3個數據分別為 1, 2, 3;第二行的數據分別為2, 2, 1;第三行的暑假分別為3, 4, 3;則輸出的 結果為三行三列矩陣,其中第一行的數據為1, 3, -2;第二行的數據分別為- 1.5, -3, 2.5; 第三行的數據分別為1, 1, -1. 三、課程設計中遇到的難點及解決辦法 1、在轉理的過程中,要求把轉置后的矩陣輸出出來,因為用的是三元組順序表的存儲 形式,所以不知道怎么去實現,然后通過進一步思考,運用先把一個矩陣存入家元素,然后 2 在對其進行更改,最后完成了此項的工作. 2
7、、就是對于矩陣的乘法運算和逆運算,掌握的不夠熟練,先是通過書籍對于矩陣的乘 法和逆運算得到更深的了解,然后通過一步步寫程序最后實現了矩陣的乘法運算和逆運算. 四、 總結 通過此次課程設計,讓我對于編程有了更深的認識,老師的精心指導讓我學會到了很 多,不僅僅是代碼,最主要的讓我的思維開闔了很多,在這個過程中,通過不斷的嘗試,不 斷的修改,最終克服了困難,完成了自己的任務,心里有種無比的喜悅,但同時又感覺到了 自己的知識面的狹隘,還有好多知識的海洋還沒有暢游,等待自己將是一回更大的考臉. 對于現在的自己,對學習程序還是有很大的興趣,它讓我體驗到了很多的快樂,我要 進步跟進現在的課程,努力去發(fā)
8、展自己,按照老師說的最主要的是具有了編程的思想,則具 有了編程的能力,我想我可以成功完成自己的目標。
五、 附錄一主要源程序代碼及運行結果
1、主要源程序代碼:
# include
9、pe e; }triple; typedef struct { triple data [maxsize+1]; //非零元三元組,data [0]未用 int mu, nu, tu; //矩陣的行數、列數和非零元個數 }sqlist ; void zhuanzhi (sql ist si, tsmatrix 412) //矩陣的轉置 { sql ist s2; int col, t9, p, q, al, bl; int num[100], copt [100]; s2. mu=sl? mu; s2? nu=sl? nu; s2? tu=sl? tu; if(s2. tu>
10、0) { for (col=l; col<=sl ?nu;++col) num [col] =0; for (t9=l; t9<=sl. tu; ++t9) ++num[sl. data [t9]. j]; //求si中每一列含非零元個數 copt [1]=1; //求第col列中第一個非零元在s2. data中序號 for (col=2; col<=sl? nu; ++col) copt [col]=copt[col-l]+num[col-l]; for (p=l; p<=sL tu; ++p) { col=sl- data [p]. j; q=copt [col];
11、s2?data [q]? i=sl?data[q]? j; s2? data [q]? j=sl?data[q]? i; s2. data [q]. e=sl. data [q]. e; ++copt [col]; 12. b[s2. data [q]? i] [s2. data [q]. j]=s2. data [q)? e;} printf ("轉置后的數據是:\nn); pr intf (R????????#?>???????????????????????????\nn); for (al=l; al<=sl. nu; al++) { for (b 1=1; bl<=sl. m
12、u; bl++) {printf C%10. 3f\ 12.b[al] [bl]); printf ("\tR);} printf (R\n"); ) printf(R???????????????????????????????????? printf ("\n"); } } void jiafa (tsmatrix 14, tsmatrix 15) //矩陣的加法 (tsmatrix 16; for (int t=0; t<14. i; t++) { for (int 11=0; tl<14. j; tl++) 16.b[t] [tl]=14.b[t] [tl]+
13、15.b[t] [tl];} printf ("矩陣加完后的結果:\nw); printf(*拿拿拿拿??拿■拿??■拿拿拿拿拿*************\n"); for (int t2=0; t2<14. i; t2++) { for (int t3=0; t3<14. j; t3++) {printf ("%10. 3f\16.b[t2] [t3]); printf("\tR);) printf ("\n");} printf } , void jianfa (tsmatrix 14, tsmatrix 15) //矩陣的減法 {tsmatrix 16; for
14、(int t=0; t<14?i;t++) { for (int tl=0; tl<14. j; tl++) 16.b[t] [tl]=14.b[t] [tl]-15.b[t] [tl];} printf C矩陣相減后的結果:\nH); printf for (int t2=0; t2<14. i; t2++) { for (int t3=0; t3<14. j; t3++) {printf (n%10. 3f\ 16.b[t2] [t3]); printf("\t");} printf ("\nR);} printf(R???????????????????????????
15、???\nn); } , void chengfa (tsmatrix 14, tsmatrix 15) //矩陣的乘法 { tsmatrix 16; for (int t=0; t<14. i; t++) 4 for (int 11=0; tl<15. j; 11++) { 16. b[t] [tl]=0; for (int k=0; k<14. j; k++) 16. b[t] [tl]+=14. b[t] [k]*15. b[k] [tl];} printf (*?矩陣乘完后的結果:\nn); pr intf for (int t2=0; t2<14. i; t
16、2++)
{ for (int t3=0; t3<15. j; t3++) {printf C%10. 3f\16.b[t2] [t3]);
printf (R\tR);)
printf ("\n");}
printf
} , void niyunsuan( tsmatrix s)〃矩陣的逆運算 { tsmatrix si;
float t, x; int k, i, j;
for (i=0; i 17、 i+i) si. b[i] [j]=L 0; else si. b[i] [j]=0. 0;
}
for (i=0; i 18、si. b[i] [j]=sl. b[i] (j]/t;}
float y=l? 0;
for (i=0; i 19、\s.b[i] [j]);
printf (H\nn);
}}}
void main0
{ tsmatrix 1, 11, 13; sql ist s;
int m,n,ml,nl,n4,n5, t, tl, t2, t3, t4, t5, t6, t7, t8;
do{ printf(n請輸入你要進行的操作:\nw);
printf(w>?>>###???????????????????????\nw);
printf(R矩陣轉置運算請按l\n矩陣的加法運算詔按2\n矩陣的乘法運算請按3\n 矩陣的減法運算請按4\n矩陣的逆運算請按5\n結束請按0: \nn);
print 20、f (R 21、=l; t4<=s. tu; t4++)
{scanf (w%d\&t5);
scanf ("%dn,&t6);
s. data [t4] ? i=t5; s. data [t4]? j=t6;
scanf&s.data[t4].e);}
for (t7-l; t7<=s. nu; t7++)
{ for (t8=l; t8<=s. mu; t8++)
ll.b[t7] [t8]=0. 0;
}
zhuanzhi (s, 11);
}
if (ml =2)
I
printf (*?您選擇進行的操作是矩陣的加法運算\n\nn);
printf (*請輸入矩陣的行數和列 22、數:\nn);
scanf &n);
scanf ("%dn, &m);
1. i=n;
1.
13. i=n;
13.仙;
printf
printf (n請輸入第一個%d#%d列的矩陣\n〔 1. i, 1. j);
{ for (t=0; t 23、"請輸入第二個%d #%d 列的矩陣\n\13. i, 13. j);
for (n4=0; n4 24、
1? j=m;
printf(*拿■拿■拿■拿■拿■拿■?*****************\n");
printf (-請輸入第一個%d行%d列的矩陣\nw, 1. i, 1. j);
{ for (t=0; t 25、(!", &ml);
13. i=nl;
13. j=ml;
printf(用■拿拿????????????■?*************\n");
printf ("請輸入第二個%d行%宀列的矩陣\n[ 13. i,13. j);
for (n4=0; n4<13. i; n4++)
{ for (n5=0; n5<13. j; n5++) scanf (r%f", &13. b[n4] [n5]);}
printf\nw);
chengfa (I, 13);
}
if (ml=4)
printf J您選擇進行的操作是矩陣的減法運算\n\nw);
printf (冃請 26、輸入矩陣的行數和列數:\nn);
scanf C%cT, &n);
scanf (R%dn,&m);
1. i=n;
1. j=m;
13. i=n;
13. j=m;
pr intf(用■拿■拿拿拿拿拿拿拿拿拿拿拿拿拿拿*************\n"); printfC請輸入第一個%d行%d列的矩陣\十,1. i, 1. j);
{ for (t=0; t 27、??????????????\nM)J
printf ("請輸入第二個%d行%(1列的矩陣\n\13. i,13. j);
for (n4=0; n4<13. i;n4++)
{ for(1)5=0; n5<13. j; n5++)
scanf &13. b[n4] [n5]);)
pr intf(n\nn); jianfa (1, 13);
}
if (ml=5)
{
printf C您選擇進行的操作是矩陣的逆運算\n\nn); printf 0請輸入矩陣的維數(即行和列相等的矩陣):\nn); scanf ("%d", &n);
1. i=n;
1. j=n;
pr 28、intf\nn)j printf (n請輸入%d e%d列的矩陣\岸,1. i, L j);
{ for (t=0; t 29、
(2) .矩陣的轉置運算:
■弋:\8虛結均\Microsoft Visual Studio\Common\MSDev98\Bin\Debug\sfd.exe*
4
*
*
T
2 3 4 七 1按按按5 按WOI円青枝 - 尚 - 算運運-務畀十 運法法法運e:1 置黑醤按十 齧的的的請一 邁電距矩題田Q亠 b-t丿vl^Y^A/V^AZv-t?-T4
請輸入你要轉置矩陣的行數.列數和非零元的個數
*囂和以養(yǎng)賈更矩陣非零元的行下標、列下標〈從[1】⑴開始由左至右由上到下〉及其數據< 穆翳的數 30、據是:
0?000 0?000
32.000 0.000
(3) .矩陣的加法運算:
t-- *
旳* 2 3 4 操 I 1S 対*安青青青安
AFkk4nT 1 s 1 > T 4XJ
行"
進I篦運運賈 要“運法法法運0: 你“1加乘減逆按 入3轉的的的的請 覚束
餐選擇進行的操作是矩陣的加法運算 請輸入矩陣的行數和列數:
2 2
請輸入第一個2行2列的矩陣
-憐禱■<*
青輸入第二個2行2列的矩陣
矩陣加完后的結果:
(4) .矩陣的減法運算:
0 ?G:\Jti^\Microsoft Visual Studio\Common\MSDev98\Bin\ 31、Debug\sfd.exe"
fl 2 3 4He 1H5 卄 的*按請請請按卄 行卄請宴B詈卄 進卄尊運運運算卄 要卄運法法法運0:卄 你卄W紮減專卄 A卄轉的的的的請卄 <卄^&^^&束十 胥 咲矩矩矩矩 "
您選擇進行的操作是矩陳的減法運算
請輸入柜陳的行數和列數:
2 2
青輸入第一個2行2列的矩陣
?2
1 2
請輸入第二個2行2列的矩陣
1 3
1 3
矩陸相減后的結果:
F?*呉*礙■禪■昨昨忙?舟懷舅■怖賀■耳■襖* 怔員■悴怪禎?* 昨植?*禪■祈■覺慨
0.000 -1.000
0.000 -1.000
(5 32、).矩陣的乘法
m 2 3 4 "1枝琴5
W璽里冃土口亦 “請篡B善
*茸運運運算
F -套法法運0: -置加乘減零 “書的的的請
MM辭“:;1斗鋒薛一出 *反叵叵叵乍=o
鶴矩陣的行詼可進行計鄭 b輸入第一個矩陣的行數和列數:
2 3
請輸入第一個2行3列的矩陣
12 3
2 3 4
■ ■舅開資 禪 H.HII舅餐 ■舅”開貝耳 修輸入第二個矩陣的行數和列數:
3 2
情輸入第二個3行2列的矩陣
1 2
2 2
P 1
MXMMXKMMMXMMXXMMMXXMXMXMMXMMMM
矩陣乘完后的結果,
14.00W 9?mw
20.000 14 33、.000
(6).矩陣的逆運算:
2 3 4
15 按至冃壬冃請按 請liBiMi請 算運運運算 運峯袪運0:
技 吐晞的的的請 拒拒矩拒jg 口
您選擇進行的操作是矩陣的逆運算
*G:\S^SI3\M icrosoft Visual Studio\Common\MSDev98\Bin\Debug\sfd.exe*
請輸入矩陣的維數〈即行和列相等的矩陣〉:
3
請輸入3行3列的矩陣
1 2 3
2 2 1
3 4 3
矩陣逆運算后的結果:
1.000 3.000 -2.00(1
-1.500 -3.000 2.500
1.008 1.000 -1.000
( 34、7).矩陣可以循環(huán)運算:
13
漸入矩脖的維姝即行和列相尊的矩陣”
選擇進行的撫作是矩陣的逆運算
>G:\J?S?8?3\Microsoft Visual Studio\Comfnon\MSDev98\Bin\Debug\sfd.exe*
請輸入你要進行的握作:
2 3 4 11^5 按請請請按 B運運運誦和 運法法法運0:KK InM-K- 番的的的請“
束-M-M -n 二n = n = n = n-bFTM-
f 8 2 3 4 操 3 lts5 的*安請請 行咲適11S.掛 進MM"昇運運運茸 要“運法法法運0: 你I直加乘按 入W轉的的的的譴 輸“&束
六、指導老師評語及成績
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。