找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 2529|回复: 1
收起左侧

C++面向对象程序设计实验报告 带两种定义矩阵方法源程序

[复制链接]
ID:171414 发表于 2017-3-17 00:06 | 显示全部楼层 |阅读模式
0.png
完整的报告下载(word格式):
第2次实验.zip (2.48 MB, 下载次数: 4)



下面是部分内容预览:
----------------------------------------------------------------------------
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

【结果及截图】
答:运行程序,(对于数组)输入矩阵大小4,按行列顺序输入矩阵赋值:9 6 3 8 5 2 7 4 1 7 8 9 4 5 6 0,输入旋转角度90,选择x反射,矩阵初始布局以及特殊变换后的布局如下:
1.005.jpg
(对于链表)输入矩阵大小4,按行列顺序输入矩阵赋值:6 4 2 8 4 3 6 7 1 2 3 6 4 1 7 5,输入旋转角度270,选择y反射,矩阵初始布局以及特殊变换后的布局如下:
1.006.jpg


六、实验总结及体会

       通过本次实验,熟练了Visual Studio 6.0和2008两种开发环境,包括基本操作命令、相应菜单项和快捷键,并掌握C++程序的基本结构及相应编辑、编译、调试和运行的方法。此外,复习数组、单链表等数据结构的编程实现,掌握利用数组、单链表实现n×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. //数组操作

  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 数组矩阵 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 数乘的值:";

  10.               cin>>k;

  11.               int **matrix;

  12.               initma(n,matrix);//建立数组

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

  14.               printma(n,matrix);

  15.               valuema(k,n,matrix);//求数乘

  16.               cout<<"the result of 数乘"<<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 数乘"<<endl;

  24.               printList(n,list);



  25. }
复制代码


【结果及截图】
答:运行程序,输入矩阵大小4,输入数乘的值2,(数组)按行列顺序输入矩阵赋值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,输出矩阵初始赋值以及数乘后的结果如下:
1.002.jpg
(链表)按行列顺序输入矩阵赋值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,输出矩阵初始赋值以及数乘后的结果如下:
1.003.jpg
【比较数组与链表】
在对于矩阵赋值、对矩阵进行数乘以及输出矩阵时,以数组形式存储的矩阵需要通过两层循环实现操作,而以链表来表示矩阵只需一层循环,相较之下,以链表表示矩阵,进行相关操作的效率更高。
实验2
【设计思路】
分别通过数组和链表实现矩阵的变换:
输入矩阵n*n的大小n,以及按行列顺序输入矩阵的赋值,回车输出矩阵转置的结果,根据提示输入旋转矩阵的角度x(90的倍数),回车输出矩阵顺时针旋转x度的结果,根据提示反射的方式(x或y),输入x或y后回车,输出矩阵反射的结果。
【数据输入】 输入矩阵的大小,矩阵的赋值,旋转的角度,反射的方式。
【数据输出】 矩阵的初始状态,矩阵转置、旋转、反射的结果。



1.004.jpg




【源程序实现】
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. //数组操作

  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
内容详见附件

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.               //数组

  10.               int **matrix;

  11.               initma(n,matrix);//建立数组

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

  13.               cout<<"please input 数组矩阵 in order:";



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

  15.               printma(n,matrix);

  16.               zhuanzhi(n,matrix);//转置



  17.               xuanzhuan(n,matrix);//旋转



  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. //数组操作
  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 数组矩阵 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 转置 state:"<<endl;
  42.         printma(n,matrix);
  43. }

  44. void xuanzhuan(int n,int **matrix){
  45.         cout<<"please input 旋转度数(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 顺时针旋转 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. //小函数
  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后的结点
  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 转置 state:"<<endl;
  158.         printList(n,list);
  159. }

  160. void xuanzhuanList(int n,LinkList &list){
  161.         cout<<"please input 旋转度数(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 旋转 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. }



复制代码


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

举报

ID:1 发表于 2017-3-17 16:45 | 显示全部楼层
好资料,51黑有你更精彩
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表