C语言-矩阵转置

Python021

C语言-矩阵转置,第1张

①目标

将一个二维数组表示的矩阵转置

②命令行

#include<stdio.h>

#include<stdlib.h>

~

③定义函数

void fun(int array[3][3])

{int i,j,t

for(i=0i<3i++)

for(j=i+1j<3j++)

/*注意:只遍历了矩阵的右上半部分。

如果for(j=0j<3j++,表示遍历矩阵全部元素,右上与左下交换,左下又与右上交换,导致重复转置,矩阵没有变化。*/

{t=array[i][j]

array[i][j]=array[j][i]

array[j][i]=t}

/*交换语句,矩阵右上半部分,与对应左下半部分,元素交换,完成转置*/

}

~

④主函数(调用)

void main()

{int i,j

int array[3][3]={{1,2,3},{4,5,6},{7,8,9}}

for(i=0i<3i++)

{for(j=0j<3j++)

/*输出原矩阵,遍历全部*/

printf("%7d",array[i][j])

printf("\n")}

fun(array)

/*利用fun函数完成转置*/

printf("converted array:\n")

for(i=0i<3i++)

{for(j=0j<3j++)

printf("%7d",array[i][j])

printf("\n")}

}

形参int (*a)[N]和int a[][N]在编译时都被解释为“a是指向长度为N的一维数组的指针”,所以函数体内的操作可以二者完全一样。就是说如果你这个函数是正确的的话,把第一个形参改为int (*a)[N],其余不变就是完全正确的。所以这没有什么新的意义,这里就不费笔墨了。至于改为形参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=0i<Np[i++]=a+j,j+=n)//处理一下指针,以便操作方阵

    for(i=0i<ni++){

        for(j=0j<nj++){

            scanf("%d",&p[i][j])//输入矩阵a

            b[j][i]=p[i][j]//转置为b

        }

    }

    printf("\n转置后的矩阵为:\n")

    for(i=0i<ni++){

        for(j=0j<nj++)

            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

}