找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2522|回復: 1
收起左側(cè)

C++面向?qū)ο蟪绦蛟O計實驗報告 帶兩種定義矩陣方法源程序

[復制鏈接]
ID:171414 發(fā)表于 2017-3-17 00:06 | 顯示全部樓層 |閱讀模式
0.png
完整的報告下載(word格式):
第2次實驗.zip (2.48 MB, 下載次數(shù): 4)



下面是部分內(nèi)容預覽:
----------------------------------------------------------------------------
C++面向?qū)ο蟪绦蛟O計實驗報告

實驗報告

學生姓名:吳琪學    號:19215115專業(yè)班級:計科151

一.實驗目的
(1)熟練Visual Studio 6.0和2008兩種開發(fā)環(huán)境,包括基本操作命令、相應菜單項和快捷鍵;掌握C++程序的基本結(jié)構及相應編輯、編譯、調(diào)試和運行的方法;
(2)復習數(shù)組、單鏈表等數(shù)據(jù)結(jié)構的編程實現(xiàn);
(3)掌握利用數(shù)組、單鏈表實現(xiàn)n×n矩陣的存儲、數(shù)乘、轉(zhuǎn)置和旋轉(zhuǎn)反射等
二.實驗內(nèi)容
實驗1:矩陣的數(shù)乘
(1)程序功能簡介
根據(jù)矩陣處理的數(shù)據(jù)知識,編程實現(xiàn)矩陣的數(shù)乘程序。
(2)程序設計要求
① 實現(xiàn)n×n矩陣的數(shù)乘,其中n為用戶輸入的任意整數(shù);
② 先采用數(shù)組來表示矩陣,再采用單鏈表來表示矩陣,分別實現(xiàn)兩種數(shù)據(jù)結(jié)構下的矩陣數(shù)乘,并比較兩種數(shù)據(jù)結(jié)構的程序?qū)崿F(xiàn)難易程度;
③生成相應可執(zhí)行程序,并提交實驗報告和可執(zhí)行程序。
實驗2:矩陣的旋轉(zhuǎn)反射和轉(zhuǎn)置
(1)程序功能簡介
根據(jù)矩陣處理的數(shù)據(jù)知識,編程實現(xiàn)矩陣旋轉(zhuǎn)反射和轉(zhuǎn)置程序。
(2)程序設計要求
① 實現(xiàn)n×n矩陣的旋轉(zhuǎn)反射和轉(zhuǎn)置,其中n為用戶輸入的任意整數(shù);
② 先采用數(shù)組來表示矩陣,再采用單鏈表來表示矩陣,分別實現(xiàn)兩種數(shù)據(jù)結(jié)構下的矩陣旋轉(zhuǎn)反射和轉(zhuǎn)置程序,并比較兩種數(shù)據(jù)結(jié)構的程序?qū)崿F(xiàn)難易程度;
③生成相應可執(zhí)行程序,并提交實驗報告和可執(zhí)行程序。

三.實驗環(huán)境
PC微機
DOS操作系統(tǒng)或 Windows 操作系統(tǒng)
Visual c++程序集成環(huán)境
四.實驗內(nèi)容和步驟
實驗1:矩陣的數(shù)乘
程序設計說明
① 矩陣數(shù)乘的數(shù)據(jù)原理相對簡單,主要是解決矩陣的表示,可以采用數(shù)組和單鏈表兩種方式;
② 先采用數(shù)組來表示矩陣,實現(xiàn)相應矩陣數(shù)乘程序;
③ 再采用單鏈表來表示矩陣,相應矩陣的數(shù)乘操作變得簡單。
實驗2:矩陣的旋轉(zhuǎn)反射和轉(zhuǎn)置
程序設計說明
① 矩陣旋轉(zhuǎn)反射和轉(zhuǎn)置的數(shù)據(jù)原理相對簡單,主要是解決矩陣的表示,可以采用數(shù)組和單鏈表兩種方式;
② 先采用數(shù)組來表示矩陣,實現(xiàn)相應旋轉(zhuǎn)反射和轉(zhuǎn)置程序;
③ 再采用單鏈表來表示矩陣,相應矩陣的旋轉(zhuǎn)反射和轉(zhuǎn)置操作變得簡單,只要按一定的算法改變鏈表中節(jié)點的次序即可。
五.實驗數(shù)據(jù)及處理結(jié)果
【實驗1
【設計思路】
輸入矩陣n*n的大小n,數(shù)乘的大小,按行列順序輸入矩陣的賦值,輸出矩陣的初始狀態(tài)以及數(shù)乘的結(jié)果。
【數(shù)據(jù)輸入】輸入矩陣n*n的大小n,數(shù)乘的大小,按行列順序輸入矩陣的賦值。
【數(shù)據(jù)輸出】輸出矩陣的初始狀態(tài)以及數(shù)乘的結(jié)果。


1.001.jpg

【結(jié)果及截圖】
答:運行程序,(對于數(shù)組)輸入矩陣大小4,按行列順序輸入矩陣賦值:9 6 3 8 5 2 7 4 1 7 8 9 4 5 6 0,輸入旋轉(zhuǎn)角度90,選擇x反射,矩陣初始布局以及特殊變換后的布局如下:
1.005.jpg
(對于鏈表)輸入矩陣大小4,按行列順序輸入矩陣賦值:6 4 2 8 4 3 6 7 1 2 3 6 4 1 7 5,輸入旋轉(zhuǎn)角度270,選擇y反射,矩陣初始布局以及特殊變換后的布局如下:
1.006.jpg


六、實驗總結(jié)及體會

       通過本次實驗,熟練了Visual Studio 6.0和2008兩種開發(fā)環(huán)境,包括基本操作命令、相應菜單項和快捷鍵,并掌握C++程序的基本結(jié)構及相應編輯、編譯、調(diào)試和運行的方法。此外,復習數(shù)組、單鏈表等數(shù)據(jù)結(jié)構的編程實現(xiàn),掌握利用數(shù)組、單鏈表實現(xiàn)n×n矩陣的存儲、數(shù)乘、轉(zhuǎn)置和旋轉(zhuǎn)反射等操作的方法,對數(shù)據(jù)存儲和算法復雜度有了更深刻的理解。




【源程序?qū)崿F(xiàn)】
shucheng.h
  1. //鏈表操作

  2. typedef struct LNode{

  3.               int num;

  4.               LNode *next;

  5. }*LinkList,LNode;

  6. void initList(int n,LinkList &list);

  7. void meanList(int n,LinkList &list);

  8. void valueList(int k,int n,LinkList &list);

  9. void printList(int n,LinkList &list);



  10. //數(shù)組操作

  11. void initma(int n,int **&matrix);

  12. void meanma(int n,int **matrix);

  13. void valuema(int k,int n,int **matrix);

  14. void printma(int n,int **matrix);

  15. 【shucheng.cpp】

  16. #include"shucheng.h"

  17. #include"iostream"

  18. using namespace std;



  19. void initma(int n,int **&matrix){

  20.               matrix=new int*[n];

  21.               int i;

  22.               for(i=0;i<n;i++){

  23.                             matrix[i]=new int[n];

  24.               }

  25. }



  26. void meanma(int n,int **matrix){

  27.               int i,j;

  28.               cout<<"please input 數(shù)組矩陣 in order:";

  29.               for(i=0;i<n;i++){

  30.                             for(j=0;j<n;j++){

  31.                                           cin>>matrix[i][j];

  32.                             }

  33.               }

  34. }



  35. void valuema(int k,int n,int **matrix){

  36.               int i,j;

  37.               for(i=0;i<n;i++){

  38.                             for(j=0;j<n;j++){

  39.                                           matrix[i][j]*=k;

  40.                             }

  41.               }

  42. }



  43. void printma(int n,int **matrix){

  44.               int i,j;

  45.               for(i=0;i<n;i++){

  46.                             for(j=0;j<n;j++){

  47.                                           cout<<matrix[i][j]<<" ";

  48.                             }

  49.                             cout<<endl;

  50.               }            

  51. }



  52. void initList(int n,LinkList &list){

  53.               int i;

  54.               list=new LNode;

  55.               list->num=1;

  56.               list->next=NULL;



  57.               LinkList p;

  58.               for(i=0;i<n*n;i++){

  59.                             p=new LNode;

  60.                             p->num=1;//初值定為1

  61.                             p->next=list->next;

  62.                             list->next=p;

  63.               }

  64. }



  65. void meanList(int n,LinkList &list){

  66.               LinkList p=list->next;

  67.               cout<<"please input 鏈表矩陣 in order:";

  68.               int i;

  69.               for(i=0;i<n*n;i++){

  70.                             cin>>p->num;

  71.                             p=p->next;

  72.               }

  73. }



  74. void valueList(int k,int n,LinkList &list){

  75.               LinkList p=list->next;

  76.               int i;

  77.               for(i=0;i<n*n;i++){

  78.                             p->num*=k;

  79.                             p=p->next;

  80.               }

  81. }



  82. void printList(int n,LinkList &list){

  83.               LinkList p=list->next;

  84.               int i;

  85.               for(i=0;i<n*n;i++){

  86.                             cout<num<<" ";

  87.                             p=p->next;

  88.                             if((i+1)%n==0)

  89.                                           cout<<endl;

  90.               }

  91. }
復制代碼


test.cpp
  1. #include"shucheng.h"

  2. #include"iostream"

  3. using namespace std;



  4. void main(){

  5.               int n;

  6.               cout<<"please input the size of matrix:";

  7.               cin>>n;

  8.               int k;

  9.               cout<<"please input the 數(shù)乘的值:";

  10.               cin>>k;

  11.               int **matrix;

  12.               initma(n,matrix);//建立數(shù)組

  13.               meanma(n,matrix);//賦值

  14.               printma(n,matrix);

  15.               valuema(k,n,matrix);//求數(shù)乘

  16.               cout<<"the result of 數(shù)乘"<<endl;

  17.               printma(n,matrix);



  18.               LinkList list;

  19.               initList(n,list);

  20.               meanList(n,list);

  21.               printList(n,list);

  22.               valueList(k,n,list);

  23.               cout<<"the result of 數(shù)乘"<<endl;

  24.               printList(n,list);



  25. }
復制代碼


【結(jié)果及截圖】
答:運行程序,輸入矩陣大小4,輸入數(shù)乘的值2,(數(shù)組)按行列順序輸入矩陣賦值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,輸出矩陣初始賦值以及數(shù)乘后的結(jié)果如下:
1.002.jpg
(鏈表)按行列順序輸入矩陣賦值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,輸出矩陣初始賦值以及數(shù)乘后的結(jié)果如下:
1.003.jpg
【比較數(shù)組與鏈表】
在對于矩陣賦值、對矩陣進行數(shù)乘以及輸出矩陣時,以數(shù)組形式存儲的矩陣需要通過兩層循環(huán)實現(xiàn)操作,而以鏈表來表示矩陣只需一層循環(huán),相較之下,以鏈表表示矩陣,進行相關操作的效率更高。
實驗2
【設計思路】
分別通過數(shù)組和鏈表實現(xiàn)矩陣的變換:
輸入矩陣n*n的大小n,以及按行列順序輸入矩陣的賦值,回車輸出矩陣轉(zhuǎn)置的結(jié)果,根據(jù)提示輸入旋轉(zhuǎn)矩陣的角度x(90的倍數(shù)),回車輸出矩陣順時針旋轉(zhuǎn)x度的結(jié)果,根據(jù)提示反射的方式(x或y),輸入x或y后回車,輸出矩陣反射的結(jié)果。
【數(shù)據(jù)輸入】 輸入矩陣的大小,矩陣的賦值,旋轉(zhuǎn)的角度,反射的方式。
【數(shù)據(jù)輸出】 矩陣的初始狀態(tài),矩陣轉(zhuǎn)置、旋轉(zhuǎn)、反射的結(jié)果。



1.004.jpg




【源程序?qū)崿F(xiàn)】
second.h
  1. //鏈表操作

  2. typedef struct LNode{

  3.               int num;

  4.               LNode *next;

  5. }*LinkList,LNode;

  6. void initList(int n,LinkList &list);

  7. void meanList(int n,LinkList &list);

  8. void printList(int n,LinkList &list);

  9. void zhuanzhiList(int n,LinkList &list);

  10. void xuanzhuanList(int n,LinkList &list);

  11. void fansheList(int n,LinkList &list);



  12. //數(shù)組操作

  13. void initma(int n,int **&matrix);

  14. void meanma(int n,int **matrix);

  15. void printma(int n,int **matrix);



  16. void zhuanzhi(int n,int **matrix);



  17. void xuanzhuan(int n,int **matrix);



  18. void fanshe(int n,int **matrix);
復制代碼

//其他
second.cpp
內(nèi)容詳見附件

test.cpp

  1. #include"second.h"

  2. #include"iostream"

  3. using namespace std;



  4. void main(){

  5.               int n;

  6.               cout<<"please input the size of matrix:";

  7.               cin>>n;

  8.             

  9.               //數(shù)組

  10.               int **matrix;

  11.               initma(n,matrix);//建立數(shù)組

  12.               meanma(n,matrix);//賦值

  13.               cout<<"please input 數(shù)組矩陣 in order:";



  14.               cout<<"the original state:"<<endl;

  15.               printma(n,matrix);

  16.               zhuanzhi(n,matrix);//轉(zhuǎn)置



  17.               xuanzhuan(n,matrix);//旋轉(zhuǎn)



  18.               fanshe(n,matrix);//反射





  19.               //鏈表

  20.               LinkList list;

  21.               cout<<"please input the size of matrix:";

  22.               cin>>n;

  23.               initList(n,list);

  24.               meanList(n,list);

  25.               LinkList p=list->next;

  26.               cout<<"please input 鏈表矩陣 in order:";

  27. /*              int i;

  28.               int rt=0;

  29.               for(i=0;i<16;i++){

  30.                             p->num=rt;

  31.                             rt++;

  32.                             p=p->next;

  33.               }*/



  34.               cout<<"the original state:"<<endl;

  35.               printList(n,list);

  36.               zhuanzhiList(n,list);

  37.               xuanzhuanList(n,list);

  38.               fansheList(n,list);

  39. }
復制代碼
  1. #include"second.h"
  2. #include"iostream"
  3. using namespace std;

  4. //其他

  5. //數(shù)組操作
  6. void initma(int n,int **&matrix){
  7.         matrix=new int*[n];
  8.         int i;
  9.         for(i=0;i<n;i++){
  10.                 matrix[i]=new int[n];
  11.         }
  12. }

  13. void meanma(int n,int **matrix){
  14.         int i,j;
  15.         cout<<"please input 數(shù)組矩陣 in order:";
  16.         for(i=0;i<n;i++){
  17.                 for(j=0;j<n;j++){
  18.                         cin>>matrix[i][j];
  19.                 }
  20.         }
  21. }

  22. void printma(int n,int **matrix){
  23.         int i,j;
  24.         for(i=0;i<n;i++){
  25.                 for(j=0;j<n;j++){
  26.                         cout<<matrix[i][j]<<" ";
  27.                 }
  28.                 cout<<endl;
  29.         }       
  30. }

  31. void zhuanzhi(int n,int **matrix){
  32.         int i,j;
  33.         int t;
  34.         for(i=0;i<n;i++){
  35.                 for(j=i;j<n;j++){
  36.                         t=matrix[i][j];
  37.                         matrix[i][j]=matrix[j][i];
  38.                         matrix[j][i]=t;
  39.                 }
  40.         }
  41.         cout<<"the 轉(zhuǎn)置 state:"<<endl;
  42.         printma(n,matrix);
  43. }

  44. void xuanzhuan(int n,int **matrix){
  45.         cout<<"please input 旋轉(zhuǎn)度數(shù)(90 180 270 360...):";
  46.         int c;
  47.         cin>>c;

  48.         int num=(c/90)%4;
  49.         int x;
  50.         int i,j;
  51.         int t;

  52.         for(x=0;x<num;x++){
  53.                 for(i=0;i<n/2;i++){
  54.                         for(j=i;j<n-i-1;j++){
  55.                                 t=matrix[i][j];
  56.                                 matrix[i][j]=matrix[n-1-j][i];
  57.                                 matrix[n-1-j][i]=matrix[n-i-1][n-j-1];
  58.                                 matrix[n-i-1][n-j-1]=matrix[j][n-i-1];
  59.                                 matrix[j][n-i-1]=t;
  60.                         }
  61.                 }
  62.         }

  63.         cout<<"the 順時針旋轉(zhuǎn) state:"<<endl;
  64.         printma(n,matrix);
  65. }
  66. void fanshe(int n,int **matrix){
  67.         char c;
  68.         cout<<"please choose x或y 反射:";
  69.         cin>>c;
  70.         int sign;
  71.         switch(c){
  72.         case 'x':sign=1;break;
  73.         case 'y':sign=0;break;
  74.         }
  75.         int i,j;
  76.         int t;
  77.         if(sign==1){
  78.                 for(j=0;j<n;j++){
  79.                         for(i=0;i<n/2;i++){
  80.                                 t=matrix[i][j];
  81.                                 matrix[i][j]=matrix[n-i-1][j];
  82.                                 matrix[n-1-i][j]=t;
  83.                         }
  84.                 }
  85.         }
  86.         else{
  87.                 for(i=0;i<n;i++){
  88.                         for(j=0;j<n/2;j++){
  89.                                 t=matrix[i][j];
  90.                                 matrix[i][j]=matrix[i][n-1-j];
  91.                                 matrix[i][n-1-j]=t;
  92.                         }
  93.                 }       

  94.         }

  95.         cout<<"the 反射 state:"<<endl;
  96.         printma(n,matrix);
  97. }

  98. //鏈表操作
  99. void initList(int n,LinkList &list){
  100.         int i;
  101.         list=new LNode;
  102.         list->num=1;
  103.         list->next=NULL;

  104.         LinkList p;
  105.         for(i=0;i<n*n;i++){
  106.                 p=new LNode;
  107.                 p->num=1;//初值定為1
  108.                 p->next=list->next;
  109.                 list->next=p;
  110.         }
  111. }

  112. void meanList(int n,LinkList &list){
  113.         LinkList p=list->next;
  114.         cout<<"please input 鏈表矩陣 in order:";
  115.         int i;
  116.         for(i=0;i<n*n;i++){
  117.                 cin>>p->num;
  118.                 p=p->next;
  119.         }
  120. }

  121. void printList(int n,LinkList &list){
  122.         LinkList p=list->next;
  123.         int i;
  124.         for(i=0;i<n*n;i++){
  125.                 cout<<p->num<<" ";
  126.                 p=p->next;
  127.                 if((i+1)%n==0)
  128.                         cout<<endl;
  129.         }
  130. }

  131. //小函數(shù)
  132. void inList(LinkList &e,LinkList &qian){//插入到qian之后
  133.         e->next=qian->next;
  134.         qian->next=e;
  135. }
  136. void outList(LinkList &e,LinkList &qian){//刪除qian后的結(jié)點
  137.         e=qian->next;
  138.         qian->next=qian->next->next;
  139.         e->next=NULL;
  140. }

  141. void zhuanzhiList(int n,LinkList &list){
  142.         LinkList po=list->next,p=list->next;
  143.         int k,i,j;
  144.         LinkList e;
  145.         for(k=0;k<n-1;k++){

  146.         for(i=0;i<n-1;i++){
  147.                 for(j=1;j<n-k;j++){
  148.                         p=p->next;
  149.                 }
  150.                 outList(e,p);
  151.                 inList(e,po);
  152.                 po=po->next;
  153.         }
  154.         po=po->next;
  155.         p=po;
  156.         }
  157.         cout<<"the 轉(zhuǎn)置 state:"<<endl;
  158.         printList(n,list);
  159. }

  160. void xuanzhuanList(int n,LinkList &list){
  161.         cout<<"please input 旋轉(zhuǎn)度數(shù)(90 180 270 360...):";
  162.         int c;
  163.         cin>>c;

  164.         int num=(c/90)%4;
  165.         int x,i,j,k;
  166.         LinkList e;
  167.         LinkList p;
  168.         LinkList t;
  169.         for(x=0;x<num;x++){
  170.                 p=list;
  171.                 t=list->next;
  172.                 for(i=0;i<n;i++){
  173.                         t=p->next;
  174.                         for(k=0;k<n-1;k++){
  175.                         for(j=0;j<n-i-1;j++){
  176.                                 t=t->next;
  177.                         }
  178.                         outList(e,t);
  179.                         inList(e,p);
  180.                         }
  181.                         for(j=0;j<n;j++){
  182.                                 p=p->next;
  183.                         }
  184.                 }
  185.         }//x

  186.         cout<<"the 旋轉(zhuǎn) state:"<<endl;
  187.         printList(n,list);
  188. }

  189. void fansheList(int n,LinkList &list){
  190.         char ch;
  191.         cout<<"please choose x或y 反射:";
  192.         cin>>ch;
  193.         int sign;
  194.         switch(ch){
  195.         case 'x':sign=1;break;
  196.         case 'y':sign=0;break;
  197.         }
  198.         int i,j,k;
  199.         LinkList a,b,c,d;
  200.         LinkList p,t,e;
  201.         if(sign==1){//x反射 上下
  202.                 a=list;
  203.                 b=list;
  204.                 for(i=0;i<n;i++){
  205.                         b=b->next;
  206.                 }
  207.                 for(i=0;i<n-1;i++){
  208.                         c=b->next;
  209.                         d=b;
  210.                         for(j=0;j<n;j++){
  211.                                 d=d->next;       
  212.                         }
  213.                         b->next=d->next;
  214.                         d->next=a->next;
  215.                         a->next=c;
  216.                 }
  217.         }
  218.         else{//y反射  左右
  219.                 p=list;
  220.                 for(i=0;i<n;i++){
  221.                         t=p->next;
  222.                         for(j=0;j<n-1;j++){
  223.                                 outList(e,t);
  224.                                 inList(e,p);
  225.                         }
  226.                         for(k=0;k<n;k++){
  227.                                 p=p->next;
  228.                         }
  229.                 }

  230.         }

  231.         cout<<"the 反射 state:"<<endl;
  232.         printList(n,list);
  233. }



復制代碼


評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1 發(fā)表于 2017-3-17 16:45 | 顯示全部樓層
好資料,51黑有你更精彩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表