举例如下的矩阵A:
1 2 3
4 5 6
7 8 9
则经过转置后,即将矩阵的第i行变成了现在的第i列,则原来的矩阵A变为如下矩阵B:
1 4 7
2 5 8
3 6 9
代码:
#include
int main()
{
int n[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9}
int i, j, temp
printf("原始矩阵:\n")
for(i=0i<3i++)
{
for(j=0j<3j++)
printf("%d ", n[i][j])/*输出原始矩阵*/
printf("\n")
}
for(i=0i<3i++)
for(j=0j<3j++)
{
if (j>i)
{ /*将主对角线右上方的数组元素与主对角线左下方的数组元素进行单方向交换*/
temp=n[i][j]
n[i][j]=n[j][i]
n[j][i]=temp
}
}
printf("转置矩阵:\n")
for(i=0i<3i++)
{
for(j=0j<3j++)
printf("%d ", n[i][j])/*输出原始矩阵的转置矩阵*/
printf("\n")
}
return 0
}
扩展资料:return 0代表程序正常退出。return是C++预定义的语句,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值。
return语句用来结束循环,或返回一个函数的值。
1、return 0,说明程序正常退出,返回到主程序继续往下执行。
2、return 1,说明程序异常退出,返回主调函数来处理,继续往下执行。return 0或return 1对程序执行的顺序没有影响,只是大家习惯于使用return(0)退出子程序而已。
你的数组转置程序,主要有两个问题,
一 C语言二维数组的参数声明和传参不正确
二 二维数组的转置,只需要以主对角线为轴翻转一次就行了,
因此,transport函数中for_j循环的终止条件应该为j<i
改正后的数组转置C语言程序如下(改动的地方见注释)
#include<stdio.h>
int main()
{
int a[3][3]
int i,j
void transport(int a[][3])//这里把返回值类型int改成void,把a[3][3]改成a[][3]
printf("input:")
for(i=0i<3i++)
for(j=0j<3j++)
{
scanf_s("%d",&a[i][j])//这里建议把scanf_s改成scanf
}
transport(a)//这里把a[3][3]改成a
for(i=0i<3i++)
{//这里加大括号
for(j=0j<3j++)
printf("%3d",a[i][j])
printf("\n")//这里加一句,换行
}//这里加大括号
return 0
}
void transport(int a[][3])//这里把返回值类型int改成void,把a[3][3]改成a[][3]
{
int i,j,t
for(i=0i<3i++)
for(j=0j<ij++)//这里把j<3改成j<i
{
t=a[i][j]
a[i][j]=a[j][i]
a[j][i]=t
}
}
/*函数功能:
对任意row行col列的矩阵转置
函数入口参数:
指向一维整型数组的指针变量a,指向单元存放转置前的矩阵元素
整型变量row,矩阵的行数即二维整型数组的行数
整型变量col,矩阵的列数即二维整型数组的列数
函数出口参数:
指向一维整型数组的指针变量at,指向单元存放转置后的矩阵元素
函数返回值:
无
*/
void
convert(int
(*a)[col],
int
(*at)[row],
int
row,
int
col)
{
int
i,
j
for
(i=0
i<row
i++)
{
for
(j=0
j<col
j++)
{
*(*(at+j)+i)
=
*(*(a+i)+j)
}
}
}