c语言转置矩阵问题

大家好我是一个大一刚学完c语言的学生~编程遇到问题了!谢谢帮助!看看为什么M>N时实现不了转置~而M<=N时却可以~~程序如下!

#include <stdio.h>
#define M 5
#define N 6
int array[M][N];
void main()
{
void change(int array[M][N]);
int i,j;
printf("please input array:\n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&array[i][j]);
printf("\nThe array is:\n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%5d",array[i][j]);
printf("\n");
}
change(array);
printf("The changed array is:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%5d",array[i][j]);
printf("\n");
}
}
void change(int array[M][N])
{
int i,j,t;
for(i=0;i<M;i++)
for(j=i+1;j<N;j++)
{
t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}

(1) 数组下标超界是不允许的,当行和列不等时,元素交换后下标会超界。
M<=N时能得到正确结果是偶然。

(2) 行,列不等时, 应当声明一个大的数组。
如果 M>N, 声明int array[M][M];
如果 M<N, 声明int array[N][N];
或者直接声明一个较大的数组,例如 int array[10][10]

(3) change()中的双重循环
for(i=0;i<M;i++)
for(j=i+1;j<N;j++)
当N>M是对的,当N<M时是错的(或说,不完善的)

(4) 我们用声明一个较大的数组来改正你的程序:
int array[10][10]; // 全局量声明
void change(int array[10][10]); // main里的函数原形声明

void change(int array[10][10]) // 函数声明
{
int i,j,t;
if (M <= N){ // 添条件语句始
原来的循环不变
} // 添加 M>N 的 循环
else {
for(j=0;j<N;j++)
for(i=j+1;i<M;i++)
{
t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
};
}; // 条件语句终

}

其它部分不变。

编译后运行,无论M>N或M<=N 都正确了。
温馨提示:答案为网友推荐,仅供参考
相似回答