0.png (50.73 KB, 下載次數: 70)
下載附件
2017-3-17 00:32 上傳
完整的報告下載(word格式):
第2次實驗.zip
(2.48 MB, 下載次數: 4)
2017-3-17 00:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
下面是部分內容預覽:
----------------------------------------------------------------------------
C++面向對象程序設計實驗報告 實驗報告 學生姓名:吳琪學 號:19215115專業班級:計科151 一.實驗目的 (1)熟練Visual Studio 6.0和2008兩種開發環境,包括基本操作命令、相應菜單項和快捷鍵;掌握C++程序的基本結構及相應編輯、編譯、調試和運行的方法; (2)復習數組、單鏈表等數據結構的編程實現; (3)掌握利用數組、單鏈表實現n×n矩陣的存儲、數乘、轉置和旋轉反射等 二.實驗內容 實驗1:矩陣的數乘 (1)程序功能簡介 根據矩陣處理的數據知識,編程實現矩陣的數乘程序。 (2)程序設計要求 ① 實現n×n矩陣的數乘,其中n為用戶輸入的任意整數; ② 先采用數組來表示矩陣,再采用單鏈表來表示矩陣,分別實現兩種數據結構下的矩陣數乘,并比較兩種數據結構的程序實現難易程度; ③生成相應可執行程序,并提交實驗報告和可執行程序。 實驗2:矩陣的旋轉反射和轉置 (1)程序功能簡介 根據矩陣處理的數據知識,編程實現矩陣旋轉反射和轉置程序。 (2)程序設計要求 ① 實現n×n矩陣的旋轉反射和轉置,其中n為用戶輸入的任意整數; ② 先采用數組來表示矩陣,再采用單鏈表來表示矩陣,分別實現兩種數據結構下的矩陣旋轉反射和轉置程序,并比較兩種數據結構的程序實現難易程度; ③生成相應可執行程序,并提交實驗報告和可執行程序。
三.實驗環境 PC微機 DOS操作系統或 Windows 操作系統 Visual c++程序集成環境 四.實驗內容和步驟 實驗1:矩陣的數乘 程序設計說明 ① 矩陣數乘的數據原理相對簡單,主要是解決矩陣的表示,可以采用數組和單鏈表兩種方式; ② 先采用數組來表示矩陣,實現相應矩陣數乘程序; ③ 再采用單鏈表來表示矩陣,相應矩陣的數乘操作變得簡單。 實驗2:矩陣的旋轉反射和轉置 程序設計說明 ① 矩陣旋轉反射和轉置的數據原理相對簡單,主要是解決矩陣的表示,可以采用數組和單鏈表兩種方式; ② 先采用數組來表示矩陣,實現相應旋轉反射和轉置程序; ③ 再采用單鏈表來表示矩陣,相應矩陣的旋轉反射和轉置操作變得簡單,只要按一定的算法改變鏈表中節點的次序即可。 五.實驗數據及處理結果 【實驗1】 【設計思路】 輸入矩陣n*n的大小n,數乘的大小,按行列順序輸入矩陣的賦值,輸出矩陣的初始狀態以及數乘的結果。 【數據輸入】輸入矩陣n*n的大小n,數乘的大小,按行列順序輸入矩陣的賦值。 【數據輸出】輸出矩陣的初始狀態以及數乘的結果。
1.001.jpg (32.12 KB, 下載次數: 54)
下載附件
2017-3-17 00:32 上傳
【結果及截圖】 答:運行程序,(對于數組)輸入矩陣大小4,按行列順序輸入矩陣賦值:9 6 3 8 5 2 7 4 1 7 8 9 4 5 6 0,輸入旋轉角度90,選擇x反射,矩陣初始布局以及特殊變換后的布局如下:
1.005.jpg (30.41 KB, 下載次數: 63)
下載附件
2017-3-17 00:32 上傳
(對于鏈表)輸入矩陣大小4,按行列順序輸入矩陣賦值:6 4 2 8 4 3 6 7 1 2 3 6 4 1 7 5,輸入旋轉角度270,選擇y反射,矩陣初始布局以及特殊變換后的布局如下:
1.006.jpg (29.95 KB, 下載次數: 59)
下載附件
2017-3-17 00:32 上傳
六、實驗總結及體會 通過本次實驗,熟練了Visual Studio 6.0和2008兩種開發環境,包括基本操作命令、相應菜單項和快捷鍵,并掌握C++程序的基本結構及相應編輯、編譯、調試和運行的方法。此外,復習數組、單鏈表等數據結構的編程實現,掌握利用數組、單鏈表實現n×n矩陣的存儲、數乘、轉置和旋轉反射等操作的方法,對數據存儲和算法復雜度有了更深刻的理解。
【源程序實現】 【shucheng.h】 - //鏈表操作
- typedef struct LNode{
- int num;
- LNode *next;
- }*LinkList,LNode;
- void initList(int n,LinkList &list);
- void meanList(int n,LinkList &list);
- void valueList(int k,int n,LinkList &list);
- void printList(int n,LinkList &list);
-
- //數組操作
- void initma(int n,int **&matrix);
- void meanma(int n,int **matrix);
- void valuema(int k,int n,int **matrix);
- void printma(int n,int **matrix);
- 【shucheng.cpp】
- #include"shucheng.h"
- #include"iostream"
- using namespace std;
-
- void initma(int n,int **&matrix){
- matrix=new int*[n];
- int i;
- for(i=0;i<n;i++){
- matrix[i]=new int[n];
- }
- }
-
- void meanma(int n,int **matrix){
- int i,j;
- cout<<"please input 數組矩陣 in order:";
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- cin>>matrix[i][j];
- }
- }
- }
-
- void valuema(int k,int n,int **matrix){
- int i,j;
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- matrix[i][j]*=k;
- }
- }
- }
-
- void printma(int n,int **matrix){
- int i,j;
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- cout<<matrix[i][j]<<" ";
- }
- cout<<endl;
- }
- }
-
- void initList(int n,LinkList &list){
- int i;
- list=new LNode;
- list->num=1;
- list->next=NULL;
-
- LinkList p;
- for(i=0;i<n*n;i++){
- p=new LNode;
- p->num=1;//初值定為1
- p->next=list->next;
- list->next=p;
- }
- }
-
- void meanList(int n,LinkList &list){
- LinkList p=list->next;
- cout<<"please input 鏈表矩陣 in order:";
- int i;
- for(i=0;i<n*n;i++){
- cin>>p->num;
- p=p->next;
- }
- }
-
- void valueList(int k,int n,LinkList &list){
- LinkList p=list->next;
- int i;
- for(i=0;i<n*n;i++){
- p->num*=k;
- p=p->next;
- }
- }
-
- void printList(int n,LinkList &list){
- LinkList p=list->next;
- int i;
- for(i=0;i<n*n;i++){
- cout<num<<" ";
- p=p->next;
- if((i+1)%n==0)
- cout<<endl;
- }
- }
復制代碼
【test.cpp】 - #include"shucheng.h"
- #include"iostream"
- using namespace std;
-
- void main(){
- int n;
- cout<<"please input the size of matrix:";
- cin>>n;
- int k;
- cout<<"please input the 數乘的值:";
- cin>>k;
- int **matrix;
- initma(n,matrix);//建立數組
- meanma(n,matrix);//賦值
- printma(n,matrix);
- valuema(k,n,matrix);//求數乘
- cout<<"the result of 數乘"<<endl;
- printma(n,matrix);
-
- LinkList list;
- initList(n,list);
- meanList(n,list);
- printList(n,list);
- valueList(k,n,list);
- cout<<"the result of 數乘"<<endl;
- printList(n,list);
-
- }
復制代碼
【結果及截圖】 答:運行程序,輸入矩陣大小4,輸入數乘的值2,(數組)按行列順序輸入矩陣賦值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,輸出矩陣初始賦值以及數乘后的結果如下:
1.002.jpg (16.45 KB, 下載次數: 72)
下載附件
2017-3-17 00:32 上傳
(鏈表)按行列順序輸入矩陣賦值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,輸出矩陣初始賦值以及數乘后的結果如下:
1.003.jpg (12.88 KB, 下載次數: 85)
下載附件
2017-3-17 00:32 上傳
【比較數組與鏈表】 在對于矩陣賦值、對矩陣進行數乘以及輸出矩陣時,以數組形式存儲的矩陣需要通過兩層循環實現操作,而以鏈表來表示矩陣只需一層循環,相較之下,以鏈表表示矩陣,進行相關操作的效率更高。 【實驗2】 【設計思路】 分別通過數組和鏈表實現矩陣的變換: 輸入矩陣n*n的大小n,以及按行列順序輸入矩陣的賦值,回車輸出矩陣轉置的結果,根據提示輸入旋轉矩陣的角度x(90的倍數),回車輸出矩陣順時針旋轉x度的結果,根據提示反射的方式(x或y),輸入x或y后回車,輸出矩陣反射的結果。 【數據輸入】 輸入矩陣的大小,矩陣的賦值,旋轉的角度,反射的方式。 【數據輸出】 矩陣的初始狀態,矩陣轉置、旋轉、反射的結果。
1.004.jpg (63.38 KB, 下載次數: 47)
下載附件
2017-3-17 00:32 上傳
【源程序實現】 【second.h】 - //鏈表操作
- typedef struct LNode{
- int num;
- LNode *next;
- }*LinkList,LNode;
- void initList(int n,LinkList &list);
- void meanList(int n,LinkList &list);
- void printList(int n,LinkList &list);
- void zhuanzhiList(int n,LinkList &list);
- void xuanzhuanList(int n,LinkList &list);
- void fansheList(int n,LinkList &list);
-
- //數組操作
- void initma(int n,int **&matrix);
- void meanma(int n,int **matrix);
- void printma(int n,int **matrix);
-
- void zhuanzhi(int n,int **matrix);
-
- void xuanzhuan(int n,int **matrix);
-
- void fanshe(int n,int **matrix);
復制代碼
//其他 【second.cpp】
內容詳見附件
【test.cpp】
- #include"second.h"
- #include"iostream"
- using namespace std;
-
- void main(){
- int n;
- cout<<"please input the size of matrix:";
- cin>>n;
-
- //數組
- int **matrix;
- initma(n,matrix);//建立數組
- meanma(n,matrix);//賦值
- cout<<"please input 數組矩陣 in order:";
-
- cout<<"the original state:"<<endl;
- printma(n,matrix);
- zhuanzhi(n,matrix);//轉置
-
- xuanzhuan(n,matrix);//旋轉
-
- fanshe(n,matrix);//反射
-
-
- //鏈表
- LinkList list;
- cout<<"please input the size of matrix:";
- cin>>n;
- initList(n,list);
- meanList(n,list);
- LinkList p=list->next;
- cout<<"please input 鏈表矩陣 in order:";
- /* int i;
- int rt=0;
- for(i=0;i<16;i++){
- p->num=rt;
- rt++;
- p=p->next;
- }*/
-
- cout<<"the original state:"<<endl;
- printList(n,list);
- zhuanzhiList(n,list);
- xuanzhuanList(n,list);
- fansheList(n,list);
- }
復制代碼- #include"second.h"
- #include"iostream"
- using namespace std;
- //其他
- //數組操作
- void initma(int n,int **&matrix){
- matrix=new int*[n];
- int i;
- for(i=0;i<n;i++){
- matrix[i]=new int[n];
- }
- }
- void meanma(int n,int **matrix){
- int i,j;
- cout<<"please input 數組矩陣 in order:";
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- cin>>matrix[i][j];
- }
- }
- }
- void printma(int n,int **matrix){
- int i,j;
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- cout<<matrix[i][j]<<" ";
- }
- cout<<endl;
- }
- }
- void zhuanzhi(int n,int **matrix){
- int i,j;
- int t;
- for(i=0;i<n;i++){
- for(j=i;j<n;j++){
- t=matrix[i][j];
- matrix[i][j]=matrix[j][i];
- matrix[j][i]=t;
- }
- }
- cout<<"the 轉置 state:"<<endl;
- printma(n,matrix);
- }
- void xuanzhuan(int n,int **matrix){
- cout<<"please input 旋轉度數(90 180 270 360...):";
- int c;
- cin>>c;
- int num=(c/90)%4;
- int x;
- int i,j;
- int t;
- for(x=0;x<num;x++){
- for(i=0;i<n/2;i++){
- for(j=i;j<n-i-1;j++){
- t=matrix[i][j];
- matrix[i][j]=matrix[n-1-j][i];
- matrix[n-1-j][i]=matrix[n-i-1][n-j-1];
- matrix[n-i-1][n-j-1]=matrix[j][n-i-1];
- matrix[j][n-i-1]=t;
- }
- }
- }
- cout<<"the 順時針旋轉 state:"<<endl;
- printma(n,matrix);
- }
- void fanshe(int n,int **matrix){
- char c;
- cout<<"please choose x或y 反射:";
- cin>>c;
- int sign;
- switch(c){
- case 'x':sign=1;break;
- case 'y':sign=0;break;
- }
- int i,j;
- int t;
- if(sign==1){
- for(j=0;j<n;j++){
- for(i=0;i<n/2;i++){
- t=matrix[i][j];
- matrix[i][j]=matrix[n-i-1][j];
- matrix[n-1-i][j]=t;
- }
- }
- }
- else{
- for(i=0;i<n;i++){
- for(j=0;j<n/2;j++){
- t=matrix[i][j];
- matrix[i][j]=matrix[i][n-1-j];
- matrix[i][n-1-j]=t;
- }
- }
- }
- cout<<"the 反射 state:"<<endl;
- printma(n,matrix);
- }
- //鏈表操作
- void initList(int n,LinkList &list){
- int i;
- list=new LNode;
- list->num=1;
- list->next=NULL;
- LinkList p;
- for(i=0;i<n*n;i++){
- p=new LNode;
- p->num=1;//初值定為1
- p->next=list->next;
- list->next=p;
- }
- }
- void meanList(int n,LinkList &list){
- LinkList p=list->next;
- cout<<"please input 鏈表矩陣 in order:";
- int i;
- for(i=0;i<n*n;i++){
- cin>>p->num;
- p=p->next;
- }
- }
- void printList(int n,LinkList &list){
- LinkList p=list->next;
- int i;
- for(i=0;i<n*n;i++){
- cout<<p->num<<" ";
- p=p->next;
- if((i+1)%n==0)
- cout<<endl;
- }
- }
- //小函數
- void inList(LinkList &e,LinkList &qian){//插入到qian之后
- e->next=qian->next;
- qian->next=e;
- }
- void outList(LinkList &e,LinkList &qian){//刪除qian后的結點
- e=qian->next;
- qian->next=qian->next->next;
- e->next=NULL;
- }
- void zhuanzhiList(int n,LinkList &list){
- LinkList po=list->next,p=list->next;
- int k,i,j;
- LinkList e;
- for(k=0;k<n-1;k++){
- for(i=0;i<n-1;i++){
- for(j=1;j<n-k;j++){
- p=p->next;
- }
- outList(e,p);
- inList(e,po);
- po=po->next;
- }
- po=po->next;
- p=po;
- }
- cout<<"the 轉置 state:"<<endl;
- printList(n,list);
- }
- void xuanzhuanList(int n,LinkList &list){
- cout<<"please input 旋轉度數(90 180 270 360...):";
- int c;
- cin>>c;
- int num=(c/90)%4;
- int x,i,j,k;
- LinkList e;
- LinkList p;
- LinkList t;
- for(x=0;x<num;x++){
- p=list;
- t=list->next;
- for(i=0;i<n;i++){
- t=p->next;
- for(k=0;k<n-1;k++){
- for(j=0;j<n-i-1;j++){
- t=t->next;
- }
- outList(e,t);
- inList(e,p);
- }
- for(j=0;j<n;j++){
- p=p->next;
- }
- }
- }//x
- cout<<"the 旋轉 state:"<<endl;
- printList(n,list);
- }
- void fansheList(int n,LinkList &list){
- char ch;
- cout<<"please choose x或y 反射:";
- cin>>ch;
- int sign;
- switch(ch){
- case 'x':sign=1;break;
- case 'y':sign=0;break;
- }
- int i,j,k;
- LinkList a,b,c,d;
- LinkList p,t,e;
- if(sign==1){//x反射 上下
- a=list;
- b=list;
- for(i=0;i<n;i++){
- b=b->next;
- }
- for(i=0;i<n-1;i++){
- c=b->next;
- d=b;
- for(j=0;j<n;j++){
- d=d->next;
- }
- b->next=d->next;
- d->next=a->next;
- a->next=c;
- }
- }
- else{//y反射 左右
- p=list;
- for(i=0;i<n;i++){
- t=p->next;
- for(j=0;j<n-1;j++){
- outList(e,t);
- inList(e,p);
- }
- for(k=0;k<n;k++){
- p=p->next;
- }
- }
- }
- cout<<"the 反射 state:"<<endl;
- printList(n,list);
- }
復制代碼
|