完整的報告下載(word格式):
第2次實驗.zip
(2.48 MB, 下載次數(shù): 4)
2017-3-17 00:05 上傳
點擊文件名下載附件
下面是部分內(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é)果。
【結(jié)果及截圖】 答:運行程序,(對于數(shù)組)輸入矩陣大小4,按行列順序輸入矩陣賦值:9 6 3 8 5 2 7 4 1 7 8 9 4 5 6 0,輸入旋轉(zhuǎn)角度90,選擇x反射,矩陣初始布局以及特殊變換后的布局如下: (對于鏈表)輸入矩陣大小4,按行列順序輸入矩陣賦值:6 4 2 8 4 3 6 7 1 2 3 6 4 1 7 5,輸入旋轉(zhuǎn)角度270,選擇y反射,矩陣初始布局以及特殊變換后的布局如下: 六、實驗總結(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】 - //鏈表操作
- 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);
-
- //數(shù)組操作
- 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 數(shù)組矩陣 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 數(shù)乘的值:";
- cin>>k;
- int **matrix;
- initma(n,matrix);//建立數(shù)組
- meanma(n,matrix);//賦值
- printma(n,matrix);
- valuema(k,n,matrix);//求數(shù)乘
- cout<<"the result of 數(shù)乘"<<endl;
- printma(n,matrix);
-
- LinkList list;
- initList(n,list);
- meanList(n,list);
- printList(n,list);
- valueList(k,n,list);
- cout<<"the result of 數(shù)乘"<<endl;
- printList(n,list);
-
- }
復制代碼
【結(jié)果及截圖】 答:運行程序,輸入矩陣大小4,輸入數(shù)乘的值2,(數(shù)組)按行列順序輸入矩陣賦值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,輸出矩陣初始賦值以及數(shù)乘后的結(jié)果如下: (鏈表)按行列順序輸入矩陣賦值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,輸出矩陣初始賦值以及數(shù)乘后的結(jié)果如下: 【比較數(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é)果。
【源程序?qū)崿F(xiàn)】 【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);
-
- //數(shù)組操作
- 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】
內(nèi)容詳見附件
【test.cpp】
- #include"second.h"
- #include"iostream"
- using namespace std;
-
- void main(){
- int n;
- cout<<"please input the size of matrix:";
- cin>>n;
-
- //數(shù)組
- int **matrix;
- initma(n,matrix);//建立數(shù)組
- meanma(n,matrix);//賦值
- cout<<"please input 數(shù)組矩陣 in order:";
-
- cout<<"the original state:"<<endl;
- printma(n,matrix);
- zhuanzhi(n,matrix);//轉(zhuǎn)置
-
- xuanzhuan(n,matrix);//旋轉(zhuǎn)
-
- 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;
- //其他
- //數(shù)組操作
- 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 數(shù)組矩陣 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 轉(zhuǎn)置 state:"<<endl;
- printma(n,matrix);
- }
- void xuanzhuan(int n,int **matrix){
- cout<<"please input 旋轉(zhuǎn)度數(shù)(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 順時針旋轉(zhuǎn) 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;
- }
- }
- //小函數(shù)
- void inList(LinkList &e,LinkList &qian){//插入到qian之后
- e->next=qian->next;
- qian->next=e;
- }
- void outList(LinkList &e,LinkList &qian){//刪除qian后的結(jié)點
- 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 轉(zhuǎn)置 state:"<<endl;
- printList(n,list);
- }
- void xuanzhuanList(int n,LinkList &list){
- cout<<"please input 旋轉(zhuǎn)度數(shù)(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 旋轉(zhuǎn) 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);
- }
復制代碼
|