中易网

c语言矩阵转置 运用二维数组和指针

答案:3  悬赏:30  
解决时间 2021-02-23 12:19
#include <stdio.h>
#define N 10

void Transpose(int a[][N],int n)
{
int i,j,b[N][N];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
b[i][j]=a[j][i];
}
}

printf("\n转置后的矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",a[i][j]=b[i][j]);
}
printf("\n");
}
}
int main()
{
int a[N][N],n;
printf("输入转置矩阵的n=");
scanf("%d",&n);
printf("请输入一个%dx%d的矩阵\n" ,n,n);
Transpose(a,n);
return 0;
}
这个是对的 请帮忙用指针的方式改一下
void Transpose(int (*a)[N],int n)一个这样
void Transpose(int *a,int n)一个是这样
多谢大神
最佳答案
形参int (*a)[N]和int a[][N]在编译时都被解释为“a是指向长度为N的一维数组的指针”,所以函数体内的操作可以二者完全一样。就是说如果你这个函数是正确的的话,把第一个形参改为int (*a)[N],其余不变就是完全正确的。所以这没有什么新e799bee5baa6e997aee7ad94e58685e5aeb931333361303061的意义,这里就不费笔墨了。至于改为形参int *a,那得稍费周折,因为int *a是个一级指针,不能接受二维数组的全部信息,要在函数中作点预处理;调用的地方也要做点处理。举例如下:
#include "stdio.h"
#define N 10
void Transpose(int *a,int n){
    int i,j,b[N][N],*p[N];
    for(j=i=0;i<N;p[i++]=a+j,j+=n);//处理一下指针,以便操作方阵
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&p[i][j]);//输入矩阵a
            b[j][i]=p[i][j];//转置为b
        }
    }
    printf("\n转置后的矩阵为:\n");
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            printf("%d ",p[i][j]=b[i][j]);//改写a为转置后的矩阵
        printf("\n");
    }
}
int main(void){
int a[N][N],n;
    printf("输入转置矩阵的n=");
    scanf("%d",&n);
    printf("请输入一个%dx%d的矩阵\n" ,n,n);
    Transpose((int *)a,n);//这里对指针a要强制为与函数形参类型一致
    return 0;
}
全部回答
#include "stdafx.h" #include<iostream> using namespace std; void input(); void output(); void sort(); int a[4][4]; int main() { cout << "请输入二维数组中的7a64e59b9ee7ad943133336339643116个数" << endl; input(); cout << "转置前的二维数组为" << endl; output(); sort(); cout << "转置后的二维数组为二维数组为:" << endl; output(); return 0; } void input() { for (int i = 0; i<4; i++) for (int j = 0; j < 4; j++) cin >> a[i][j]; } void output() { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { cout << a[i][j] << "\t"; } cout << endl; } } void sort() { int t; int (*pa)[4]; pa = a; for(int i=0;i<4;i++) for (int j = i+1; j < 4; j++) { t = *(*(pa+i)+j); *(*(pa + i) + j) = *(*(pa + j) + i); *(*(pa + j) + i) = t; } }

帮你改正了. 你看看.

#include <stdio.h>

main() { void zhuanzhi(int * p); int a[3][3],i,j;

for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]);

zhuanzhi( ( int * )a ); //将二维数组强制转换成指针.传递给函数.

for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%d ",a[i][j]); printf( "\n" ); //加个回车.效果会明显些. }

getch(); }

void zhuanzhi(int * p) { int i,j,t; for(i=0;i<3;i++) { for(j=0; j<=i; j++) //交换一半就行了.否则会再次交换回去.. { t=*(p+i*3+j); *(p+i*3+j)=*(p+j*3+i); *(p+j*3+i)=t; } }

}

我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
《匆匆》中第四自然段的后两句话写出了作者对
依格孜艾日克地址有知道的么?有点事想过去
电信网络看不了h怎么办
京东 天猫双11一般什么东西打折, 几折?
江西车知捷汽车贸易有限公司地址在什么地方,
生化危机4电影究竟是3D的还是两D的、预告片是
我是腾讯会员时下载的片子,到了不是会员时,
为什么功率因数一般提高到0.9左右而不提高到
王大伯要做一个无盖的长方体铁皮水箱长八分米
深圳电信dns地址是多少
琴琴平价商店地址有知道的么?有点事想过去
华海药业工资待遇如何
楚之南有冥者者,以五百岁为春,八千岁为秋,
华益机电有限公司在什么地方啊,我要过去处理
如何把excel文件导入到sql server数据表中,
推荐资讯
御河东路怎么去啊,有知道地址的么
春()拂() 补充完整?
养父养母对自己不视如己出怎么办?
三菱4g63发动机油气两用什么火花塞好
周大生珠宝金行这个地址在什么地方,我要处理
什坊小街/宏庙胡同(路口)这个地址在什么地方
怎么读英文No money no words
江门到白色怎么坐火车
男生会有感觉女朋友是不是第一次吗?如果女友
火炬之光2里面灰烬法师火焰风暴对火焰烙印有
七零八落的反义词
兴丰家园西门(人行门)怎么去啊,有知道地址的
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?