矩阵的全套操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//
// 选题二矩阵操作
// 一、矩阵翻转
// 沿某中心轴翻转,或垂直,或水平翻转。
翻转的实质是,矩阵的每行(或每列)元素进行倒序排放。
//
// 二、矩阵卷动
// 可以左右、上下卷动。
如下图:
//
// 矩阵卷动涉及二个问题:
// (1)卷动方向,或左右卷动,或上下卷动。
// (2)卷动幅度T,如上下卷动行数,左右卷动列数。
// 卷动的实质是将某行或某列元素循环移位。
上下卷动时,是将每列元素循环移位,左右卷动时是将每行元素循环移位,卷动方向决定是左移还是右移。
// 一维数组的循环移位问题:
// 如,已知int temp[10],将其循环右移一位。
// 显然,移位后,
// temp[8] ~ temp[0]
// 依次存入
// temp[9] ~ temp[1]
// 而原来的temp[9] 则返回数组起始部位,存入temp[0] 。
// 那么,循环右移W位呢?循环左移W位呢?
// 了解了一维数组循环移位问题后,显然,矩阵卷动无非是多个一维数组循环移位,只要在外层加个大循环就解决了。
// 三、矩阵旋转
// 矩阵旋转(绕中心点)涉及二个方面:
// (1)旋转方向,顺时针还是逆时针。
// (2)旋转角度,如90o、180o、270o、360o等。
// 分析:
// (1)考虑旋转方向、角度
// (2)此处仅考虑方阵情况,即矩阵行、列数相同。
// (3)考虑是奇次方阵还是偶次方阵。
// (4)旋转时,实质是数组元素的重新组合,对应交换元素值。
// (5)设方阵有K圈,每圈操作过程相似。
// 因此,问题的关键是某圈元素的旋转、交换。
// 如下图。
//
//
// 考虑几种特殊情况,如90°,180 °,270 °,360 °等。
// (1)其它角度都是90°的整数倍。
因此,设计时仅需要考虑90°情况,其它情况只需重复操作若干次即可。
以顺时针旋转为例,如需旋转180 °,只需将旋转90 °操作连续执行两次即能实现。
// (2)逆时针旋转可以看作为"过度"旋转,如逆时针90°,可认为是顺时针旋转270 °。
// 当然,也可设计新的交换规则。
// 四、设计要求
// 编写代码,实现矩阵的翻转、卷动和旋转。
运行程序后,随机生成一个元素为三位正整数的5×5矩阵,并显现下面的参考界面:
// 矩阵操作
// ============
// 1.矩阵翻转
// 2.矩阵卷动
// 3.矩阵旋转
// 请选择(1、2或3,0:退出):
// 选择一个菜单后,要求输入操作的方向、行数或列数或角度,输入后,显示操作结果。
#include<iostream.h> // 输入输出头文件
#include<stdlib.h> //接收字符函数的头文件
#include<iomanip.h> //setw()函数头文件
void print(int s[5][5]) //定义函数
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
cout<<" "<<s[i][j]; //输出数组
cout<<endl;
}
}
void turn(int s[5][5]) //翻转函数
{
int t,y; //定义变量
cout<<"请选择一种翻转方式(1:水平翻转,2:垂直翻转):"<<endl; //选择
cin>>y;
cout<<"操作后的数组为:"<<endl;
if(y==1) //水平翻转
{
for(int i=0;i<5;i++)
for(int j=0;j<2;j++)
{
t=s[i][j];
s[i][j]=s[i][4-j];
s[i][4-j]=t;
}
print(s);
cout<<endl;
}
if(y==2) //垂直翻转
{
for(int j=0;j<5;j++)
for(int i=0;i<2;i++)
{
t=s[i][j];
s[i][j]=s[4-i][j];
s[4-i][j]=t;
}
print(s);
cout<<endl;
}
}
void roll(int s[5][5]) //卷动函数
{
int t,m,n;
cout<<"请输入卷动方向(1:向左卷动,2:向右卷动,3:向上卷动,4:向下卷动):"<<endl;
cin>>m;
cout<<"请输入卷动的幅度:"<<endl;
cin>>n;
cout<<"操作后的数组为:"<<endl;
for(int k=0;k<n;k++)
{
if(m==1) //向左卷动
{
for(int i=0;i<5;i++)
{
t=s[i][0];
for(int j=0;j<4;j++)
s[i][j]=s[i][j+1];
s[i][4]=t;
}
}
if(m==2) //向右卷动
{
for(int i=0;i<5;i++)
{
t=s[i][4];
for(int j=4;j>0;j--)
s[i][j]=s[i][j-1];
s[i][0]=t;
}
}
if(m==3) //向上卷动
{
for(int j=0;j<5;j++)
{
t=s[0][j];
for(int i=0;i<4;i++)
s[i][j]=s[i+1][j];
s[4][j]=t;
}
}
if(m==4) //向下卷动
{
for(int j=0;j<5;j++)
{
t=s[4][j];
for(int i=4;i>0;i--)
s[i][j]=s[i-1][j];
s[0][j]=t;
}
}
}
print(s);
cout<<endl;
}
void pc(int s[5][5]) //顺时针90°旋转
{
int b[5][5];
for(int i=0;i<5;i++)
for(int k=0;k<5;k++)
b[i][k]=s[i][k];
for(i=0;i<5;i++)
for(int k=0;k<5;k++)
s[i][k]=b[k][4-i];
}
void eddy(int s[5][5]) //旋转函数
{
int m,n,r;
cout<<"请输入旋转方向(1:顺时针旋转,2:逆时针旋转):"<<endl;
cin>>r;
cout<<"请输入要旋转的角度(90°,180°,270°,360°):"<<endl;
cin>>m;
cout<<"操作后的数组为:"<<endl;
if(r==1) //顺时针旋转
{
m=360-m; //如逆时针旋转90°,可以认为是顺时针旋转270°
}
if(r==2) //逆时针旋转
{
m=m;
}
if(m%90==0)
{
n=m/90; //求出n
}
for(int w=0;w<n;w++) //根据n来确定调用函数的次数
pc(s);
print(s);
cout<<endl;
}
void main()
{
int n,x,a[5][5]; //定义5*5的二维数组
char p;
loop:
cout<<setw(29)<<" "<<" **矩阵操作** "<<endl; //输出选择界面cout<<setw(29)<<" "<<" ================ "<<endl;
cout<<setw(29)<<" "<<" 1.矩阵翻转"<<endl;
cout<<setw(29)<<" "<<" 2.矩阵卷动"<<endl;
cout<<setw(29)<<" "<<" 3.矩阵旋转"<<endl;
cout<<setw(29)<<" "<<" 4.退出"<<endl;
cout<<setw(29)<<" "<<"请选择(1、2,3, 4):"<<endl;
cin>>x; //输入选择变化方式
if(x==1) //矩阵翻转
{
for(int i=0;i<5;i++)
for(int k=0;k<5;k++)
a[i][k]=(int) (rand()%(999-100))+100; //产生随机数
cout<<"原数组为:"<<endl;
print(a); //调用输出函数
turn(a); //调用翻转函数
goto loop;
}
if(x==2) //矩阵卷动
{
for(int i=0;i<5;i++)
for(int k=0;k<5;k++)
a[i][k]=(rand()%(999-100))+100; //产生随机数
cout<<"原数组为:"<<endl;
print(a); //调用输出函数
roll(a); //调用矩阵卷动函数
goto loop;
}
if(x==3) //矩阵旋转
{
for(int i=0;i<5;i++)
for(int k=0;k<5;k++)
a[i][k]= (rand()%(999-100))+100; //产生随机数
cout<<"原数组为:"<<endl;
print(a); //调用输出函数
eddy(a); //调用旋转函数
goto loop;
}
if(x==4) //选择退出
{
cout<<"您确定要退出矩阵操作吗?(y/n):"<<endl;
cin>>p;
if(p=='y'||p=='Y')
{
cout<<endl;
cout<<setw(30)<<"谢谢您的使用!再见^_^"<<endl;
}
else
{
cout<<endl;
goto loop;
}
}
else
{
cout<<"输入有误!请重新输入!"<<endl;
goto loop;
}
}。