以下实现的是矩阵的转置
一、 数组的维度已知时
1. 用普通方法定义,是以二维的方式定义的,可以用 a [ i ] [ j ] 这种二维的方式访问数组的数据,传参时发送数组名,接收时写完整数组的形式。
#include<iostream>
using namespace std;
void reverse(int a[3][3] ){
int c=0;
for(int i=0;i<3;i++){
for(int j=i;j<3;j++){
c = a[i][j];
a[i][j]=a[j][i];
a[j][i]=c;
}
}
}
void main(){
int a[3][3];
cout<<"请输入数据:"<<endl;
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cin>>a[i][j];
}
}
cout<<"----------------原数组为------------------"<<endl;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
reverse(a);
cout<<"----------------转置后数组为------------------"<<endl;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
2. 动态定义数组
也是以二维的动态方式定义的数组,所以访问时可以用 a [ i ] [ j ] 这种二维的方式访问数组的数据
#include<iostream>
using namespace std;
void reverse(int (*a)[3] ){
int c=0;
for(int i=0;i<3;i++){
for(int j=i;j<3;j++){
c = a[i][j];
a[i][j]=a[j][i];
a[j][i]=c;
}
}
}
void main(){
int(*a)[3]=new int[3][3];//指针数组,左边的数字同列相同(三维数组等号左边的数字是等号右边的两个数字)
cout<<"请输入数据:"<<endl;
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cin>>a[i][j];
}
}
cout<<"----------------原数组为------------------"<<endl;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
reverse(a);
cout<<"----------------转置后数组为------------------"<<endl;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
二、数组维度未知时
这种方法允许用户定义数组维度,普通数组在定义时,方括号内的必须是常数,所以此处必须动态定义数组
并且要以一维的方式定义,因为动态定义的二维数组指针要返回到一个一维指针数组中,但是这个一维指针数组定义时方括号内也需要常数,如果将此数组指针也动态定义,比较复杂。所以一个n阶矩阵的元素个数就是n * n 个。
既然是一维数组访问数据 a [ i ] [ j ] 时就要用 a [ i * n + j ] 的方法,传递和接收参数时,用指针,并且同时传递维度 n
#include<iostream>
using namespace std;
void reverse(int *p,int n ){
int c=0;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
c = *(p + i*n + j);
*(p + i*n + j) = *(p + j*n + i);
*(p + j*n + i) = c;
}
}
}
void main(){
int row;
cout<<"矩阵维度:";//矩阵是正方形
cin>>row;
int *a = new int[row*row];
cout<<"请输入数据:"<<endl;
int i,j;
for(i=0;i<row;i++){
for(j=0;j<row;j++){
cin>>a[i*row+j];
}
}
cout<<"----------------原数组为------------------"<<endl;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cout<<a[i*row+j]<<" ";
}
cout<<endl;
}
reverse(a,row);
cout<<"----------------转置后数组为------------------"<<endl;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cout<<a[i*row+j]<<" ";
}
cout<<endl;
}
}