稀疏矩陣的運算課程設計_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  數據結構</b></p><p><b>  課程設計說明書</b></p><p>  題目: 稀疏矩陣的運算 </p><p>  院 系: 計算機科學與工程學院 </p><p>  專業(yè)班級: 計算機10-*班

2、 </p><p>  學 號: 201030**** </p><p>  學生姓名: ******    </p><p>  指導教師:  </p><p>  2011年 12 月 28 日</p><p>  課程

3、設計(論文)任務書</p><p>  計算機科學與工程 學院 </p><p>  2011年 11 月 8 日 </p><p><b>  目  錄</b></p><p><b>  1 問題描述1</b><

4、;/p><p><b>  2 需求分析1</b></p><p><b>  3 總體設計2</b></p><p>  3.1 Matrix結構的定義2</p><p>  3.2 系統流程圖3</p><p><b>  4 詳細設計4</b>

5、;</p><p>  4.1 “菜單”界面4</p><p>  4.2 建立矩陣4</p><p>  4.3 顯示矩陣6</p><p>  4.4 矩陣的轉置7</p><p>  4.5 矩陣的加法運算8</p><p>  4.6 矩陣的減法運算9</p>

6、<p>  4.7 矩陣的乘法運算9</p><p><b>  5 程序運行11</b></p><p>  5.1 輸入矩陣11</p><p>  5.2 矩陣轉置11</p><p>  5.3 矩陣加法12</p><p>  5.4 矩陣減法12</p>

7、;<p>  5.5 矩陣乘法12</p><p>  5.6 退出及錯誤提示13</p><p><b>  6 總結13</b></p><p><b>  參考文獻14</b></p><p><b>  1 問題描述</b></p>

8、<p>  題目內容:設計稀疏矩陣運算系統實現兩個稀疏矩陣的加法、減法、乘法以及轉置操作。</p><p><b>  基本要求:</b></p><p>  存儲結構選擇三元組存儲方式;</p><p>  實現一個稀疏矩陣的轉置運算;</p><p>  實現兩個稀疏矩陣的加法運算;</p>

9、;<p>  實現兩個稀疏矩陣的減法運算;</p><p>  實現兩個稀疏矩陣的乘法運算。</p><p>  設計目的:通過本次課程設計,了解稀疏矩陣的一些基本運算操作,并通過 相關的程序代碼實現。</p><p><b>  2 需求分析</b></p><p>  經過本次的課程設計,我認為

10、稀疏矩陣運算系統主要實現的功能如下:</p><p>  建立矩陣:只有先建立了矩陣,才能夠對矩陣進行運算操作,包括建立矩陣A和矩陣B;</p><p>  轉置運算操作:對矩陣A或者矩陣B進行轉置運算,輸出相應的轉置矩陣;</p><p>  四則運算操作:該步驟由兩個矩陣同時參與,對其進行加法運算(A+B)、減法運算(A-B)以及乘法運算(A*B和B*A);&l

11、t;/p><p>  退出:當做完矩陣的運算操作之后,就可以點擊它退出該界面。</p><p>  在這次設計中用到了一些變量和函數,例如:void Display(Matrix M);int Max(int i,int j);Matrix Zero(Matrix M)等,下面會做進一步詳細的介紹。</p><p><b>  3 總體設計</b>

12、</p><p>  3.1 Matrix結構的定義</p><p>  struct Matrix{</p><p>  int H;//矩陣的行數</p><p>  int L;//矩陣的列數</p><p>  int fly;//矩陣中的非零元個數</p><p>  int

13、 zhi[Maxsize][Maxsize];//非零元值[所在行][所在列]</p><p><b>  }; </b></p><p><b>  操作集合:</b></p><p>  Matrix Enter(Matrix M);//建立矩陣M</p><p>  void Displ

14、ay(Matrix M);//顯示矩陣M</p><p>  void Transpose(Matrix M);//M矩陣的轉置</p><p>  void Add(Matrix M,Matrix N);//求和運算 A+B</p><p>  void Sub(Matrix M,Matrix N);//求差運算 A-B</p><p&

15、gt;  void Multi(Matrix M,Matrix N);//求積運算 A*B</p><p>  int Max(int i,int j);//求最大值</p><p>  Matrix Zero(Matrix M);//矩陣所有元素賦值為0</p><p><b>  3.2 系統流程圖</b></p>&l

16、t;p>  該運算系統的系統流程圖如圖1所示:</p><p><b>  圖1 系統流程圖</b></p><p><b>  4 詳細設計</b></p><p>  4.1 “菜單”界面</p><p>  進入稀疏矩陣運算系統后的“菜單”界面如圖2所示。</p><

17、;p>  圖2 “菜單”界面</p><p><b>  4.2 建立矩陣</b></p><p>  矩陣在建立之后才能夠進行運算操作,建立矩陣A和矩陣B,調用函數Enter(M),首先根據所輸入的矩陣M的行數H和列數L,建立H*L的矩陣M,并且調用函數Zero(M)將其所有元素均賦值為0;其次再根據所輸入矩陣M的非零元個數fly做循環(huán)控制變量,按提示輸入非

18、零元所在的行h和列l(wèi)以及非零元的值,如果輸入的行h或者列l(wèi)大于矩陣M的行H或列L,則提示輸入錯誤;最后將非零元的值保存在矩陣M中的相應位置。程序如下:</p><p>  Matrix Enter(Matrix M)//建立矩陣</p><p><b>  {</b></p><p>  cout<<"請輸入矩陣的行數和

19、列數:";</p><p>  cin>>M.H>>M.L;</p><p>  cout<<"請輸入矩陣的非零元個數:";</p><p>  cin>>M.fly;</p><p>  cout<<endl;</p><p>

20、  if(M.fly>(M.H*M.L))</p><p><b>  {</b></p><p>  cout<<"非零元個數多于矩陣元素總數,請重新輸入!"<<endl;</p><p>  cout<<"請重新輸入矩陣的非零元個數:";</p>

21、<p>  cin>>M.fly;</p><p><b>  }</b></p><p>  M=Zero(M);</p><p><b>  int h;</b></p><p><b>  int l;</b></p><p&g

22、t;  for(int n=1;n<=M.fly;n++)//輸入非零元所在的行、列和值</p><p><b>  {</b></p><p>  cout<<"請輸入第"<<n<<"個非零元所在的行和列:";</p><p>  cin>>h&g

23、t;>l;</p><p>  if(h>M.H||l>M.L)//行列輸入錯誤提示</p><p><b>  {</b></p><p>  cout<<"行列輸入錯誤,請重新輸入:"<<endl;</p><p>  cout<<&quo

24、t;請重新輸入第"<<n<<"個非零元所在的行和列:";</p><p>  cin>>h>>l;</p><p><b>  }</b></p><p>  cout<<"請輸入該非零元的值:";</p><p&g

25、t;  cin>>M.zhi[h][l];</p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  return M;</b></p><p><b>  }</b></p><

26、p>  注:該函數中調用的Zero()函數的功能為將矩陣M根據行數H和列數L把所有的元素賦值為0,代碼如下:</p><p>  Matrix Zero(Matrix M)//矩陣所有元素賦值為0</p><p><b>  {</b></p><p>  for(int i=1;i<=M.H;i++)</p>

27、<p>  for(int j=1;j<=M.L;j++)</p><p>  M.zhi[i][j]=0;</p><p><b>  return M;</b></p><p><b>  }</b></p><p><b>  4.3 顯示矩陣</b>&l

28、t;/p><p>  建立好矩陣以后,為了驗證所建立的矩陣是否成功,以及在后期運算時矩陣的顯示,設計該函數,能更直觀的看到輸入以及輸出的矩陣,代碼如下:</p><p>  void Display(Matrix M)//顯示矩陣</p><p><b>  {</b></p><p>  int count=0;<

29、/p><p>  cout<<"矩陣為:"<<endl;</p><p>  for(int i=1;i<=M.H;i++)</p><p>  for(int j=1;j<=M.L;j++)</p><p><b>  {</b></p><p&g

30、t;  printf("%-4d",M.zhi[i][j]);</p><p><b>  count++;</b></p><p>  if(count==M.L)</p><p><b>  {</b></p><p>  cout<<endl;</p>

31、;<p><b>  count=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  cout<<endl;</p><p><b>  }</b></p>

32、<p><b>  4.4 矩陣的轉置</b></p><p>  該函數實現的是矩陣A或矩陣B的轉置操作,通過對矩陣的行和列進行調換,利用for()循環(huán)語句實現對矩陣A或矩陣B的轉置,其代碼如下:</p><p>  void Transpose(Matrix M)//矩陣轉置</p><p><b>  {<

33、/b></p><p><b>  C.H=M.L;</b></p><p><b>  C.L=M.H;</b></p><p>  cout<<"原來的";</p><p>  Display(M);</p><p>  for(in

34、t i=1;i<=M.L;i++)</p><p>  for(int j=1;j<=M.H;j++)</p><p><b>  {</b></p><p>  C.zhi[i][j]=M.zhi[j][i];</p><p><b>  }</b></p><p&

35、gt;  cout<<"轉置后的";</p><p>  Display(C);</p><p><b>  }</b></p><p>  4.5 矩陣的加法運算</p><p>  實現兩個矩陣之間的加法運算,即A+B,其代碼如下:</p><p>  void

36、 Add(Matrix M,Matrix N)//A+B</p><p><b>  {</b></p><p>  int n1=Max(M.H,N.H);</p><p>  int n2=Max(M.L,N.L);</p><p><b>  C.H=n1;</b></p>

37、<p><b>  C.L=n2;</b></p><p>  C=Zero(C);</p><p>  for(int i=1;i<=n1;i++)</p><p>  for(int j=1;j<=n2;j++)</p><p><b>  {</b></p>

38、<p>  C.zhi[i][j]=M.zhi[i][j]+N.zhi[i][j];</p><p><b>  }</b></p><p>  cout<<" A+B 的運算結果";</p><p>  Display(C);</p><p><b>  }<

39、/b></p><p>  4.6 矩陣的減法運算</p><p>  實現兩個矩陣之間的減法運算,即A-B,其代碼如下:</p><p>  void Sub(Matrix M,Matrix N)//A-B</p><p><b>  {</b></p><p>  int n1=Ma

40、x(M.H,N.H);</p><p>  int n2=Max(M.L,N.L);</p><p><b>  C.H=n1;</b></p><p><b>  C.L=n2;</b></p><p>  C=Zero(C);</p><p>  for(int i=1;

41、i<=n1;i++)</p><p>  for(int j=1;j<=n2;j++)</p><p><b>  {</b></p><p>  C.zhi[i][j]=M.zhi[i][j]-N.zhi[i][j];</p><p><b>  }</b></p>&l

42、t;p>  cout<<" A-B 的運算結果";</p><p>  Display(C);</p><p><b>  }</b></p><p>  4.7 矩陣的乘法運算</p><p>  實現兩個矩陣之間的乘法運算,即A*B,如果矩陣A的列數和矩陣B的行數不相同,則無法

43、進行乘法運算,系統會提示錯誤,其代碼如下:</p><p>  void Multi(Matrix M,Matrix N)//A*B</p><p><b>  {</b></p><p>  if(M.L!=N.H)</p><p><b>  {</b></p><p>

44、;  cout<<"矩陣A的列數和矩陣B的行數不相同,無法進行乘法運算!\n";</p><p><b>  }</b></p><p><b>  else</b></p><p>  if(M.L==N.H)</p><p><b>  {</b&

45、gt;</p><p><b>  C.H=M.H;</b></p><p><b>  C.L=N.L;</b></p><p>  C=Zero(C);</p><p>  for(int i=1;i<=Maxsize;i++)</p><p>  for(int

46、j=1;j<=Maxsize;j++)</p><p>  for(int k=1;k<=Maxsize;k++)</p><p><b>  {</b></p><p>  C.zhi[i][j]+=M.zhi[i][k]*N.zhi[k][j];</p><p><b>  }</b>

47、;</p><p>  cout<<"運算結果";</p><p>  Display(C);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  5 程序運行</b>

48、;</p><p><b>  5.1 輸入矩陣</b></p><p>  運行該運算系統,進入“菜單”選項以后,輸入“1”,選擇“輸入矩陣A”,運算結果如圖3所示;輸入“2”,選擇“輸入矩陣B”,運算結果如圖4所示:</p><p>  圖3 輸入矩陣A 圖4 輸入矩陣B &l

49、t;/p><p><b>  5.2 矩陣轉置</b></p><p>  輸入矩陣A和矩陣B以后,在“菜單”提示下,輸入“3”,進行矩陣A的轉置,運算結果如圖5所示;輸入“4”,進行矩陣B的轉置,運算結果如圖6所示:</p><p>  圖5 矩陣A的轉置 圖6 矩陣B的轉置

50、 </p><p><b>  5.3 矩陣加法</b></p><p>  在“菜單”提示下,輸入“5”,進行兩個矩陣的加法運算,即A+B,運算結果如圖7所示:</p><p><b>  圖7 矩陣加法</b></p

51、><p><b>  5.4 矩陣減法</b></p><p>  在“菜單”提示下,輸入“6”,進行兩個矩陣的加法運算,即A-B,運算結果如圖8所示:</p><p><b>  圖8 矩陣減法</b></p><p><b>  5.5 矩陣乘法</b></p>

52、<p>  在“菜單”提示下,輸入“7”,進行兩個矩陣的第一種乘法運算,即A*B,運算結果如圖9所示;輸入“8”,進行兩個矩陣的第二種乘法運算,即B*A,運算結果如圖10所示:</p><p>  圖9 矩陣乘法1(A*B) 圖10 矩陣乘法2(B*A) </p><p>  5.6 退出及錯誤提示 </p><p&g

53、t;  算法在運行時還有退出及錯誤提示功能,在“菜單”提示下,輸入“0”則退出系統,如圖11所示;若輸入0-8以外的數字,則會出現錯誤提示,如圖12所示:</p><p>  圖11 退出 圖12 錯誤提示 </p><p><b>  6 總結</b></p><p>  通過對數據結

54、構這門課的學習,我了解到:“數據結構”在計算機科學中是一門綜合性的專業(yè)基礎課。而我們現在所學的數據結構是C語言版的,是建立在C語言基礎之上的,若是C語言基礎知識不牢固,要想學好數據結構這門課程是有一定的困難的。所以在學習數據結構這門課程的時候,也順便復習了C語言的相關內容,加深了我對C語言的理解和應用,并且也深深體會到了數據結構這門課程的重要性。</p><p>  在本次課程設計過程中,我體會到自己所學的東西太

55、少了,很多都不知道,也遇到了不少實際問題,使我發(fā)現了在學習過程中的不足。這次課程設計,我本來打算做的是MFC可視化的人機友好界面,但是由于在程序設計以及運行時出現了太多目前無法解決的問題,只好退而求其次,應用了DOS界面來完成本次課程設計。在代碼設計時,也出現了一些基本的C語言語法錯誤,如函數的嵌套定義等,在老師和同學的幫助下都一一解決了,這也反映了我C語言基礎知識的不扎實,以后應在學習過程中加強這方面的學習。</p>&

56、lt;p>  通過本次課程設計,我對數據結構這門課有了進一步的理解。數據結構這門課最主要的內容在于算法思想,而程序編寫次之。在編寫程序時,如果算法思想</p><p>  是正確的,那么這個程序就已經成功了一多半。算法思想在數據結構中占有重要地位,如果說C語言是數據結構這座程序大廈的根基的話,那么算法思想就是構成大廈的一磚一瓦,再好的根基離了磚瓦也構不成大廈。所以,要想學好數據結構這門課程,平時不只要加強程

57、序的編寫,更要多思考算法思想,加強對算法思想的鍛煉和理解。</p><p>  本次課程設計得到了老師和很多同學的幫助,在此一并表示感謝。</p><p><b>  參考文獻</b></p><p>  [1]秦鋒.數據結構(C語言版).北京:清華大學出版社,2011</p><p>  [2]溫秀梅,丁學均.Visu

溫馨提示

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

評論

0/150

提交評論