完整的报告下载(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,数乘的大小,按行列顺序输入矩阵的赋值。 【数据输出】输出矩阵的初始状态以及数乘的结果。
【结果及截图】 答:运行程序,(对于数组)输入矩阵大小4,按行列顺序输入矩阵赋值:9 6 3 8 5 2 7 4 1 7 8 9 4 5 6 0,输入旋转角度90,选择x反射,矩阵初始布局以及特殊变换后的布局如下: (对于链表)输入矩阵大小4,按行列顺序输入矩阵赋值:6 4 2 8 4 3 6 7 1 2 3 6 4 1 7 5,输入旋转角度270,选择y反射,矩阵初始布局以及特殊变换后的布局如下: 六、实验总结及体会 通过本次实验,熟练了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,输出矩阵初始赋值以及数乘后的结果如下: (链表)按行列顺序输入矩阵赋值:5 3 1 4 8 9 6 4 2 8 6 3 0 1 4 5,输出矩阵初始赋值以及数乘后的结果如下: 【比较数组与链表】 在对于矩阵赋值、对矩阵进行数乘以及输出矩阵时,以数组形式存储的矩阵需要通过两层循环实现操作,而以链表来表示矩阵只需一层循环,相较之下,以链表表示矩阵,进行相关操作的效率更高。 【实验2】 【设计思路】 分别通过数组和链表实现矩阵的变换: 输入矩阵n*n的大小n,以及按行列顺序输入矩阵的赋值,回车输出矩阵转置的结果,根据提示输入旋转矩阵的角度x(90的倍数),回车输出矩阵顺时针旋转x度的结果,根据提示反射的方式(x或y),输入x或y后回车,输出矩阵反射的结果。 【数据输入】 输入矩阵的大小,矩阵的赋值,旋转的角度,反射的方式。 【数据输出】 矩阵的初始状态,矩阵转置、旋转、反射的结果。
【源程序实现】 【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);
- }
复制代码
|