C语言,调用自定义函数对m行n列数组转置,大神帮我纠错。

#include "stdio.h"
int zhuan(int (*p)[100],int m,int n)
{
int i,j,temp;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
temp=(*(p+i))[j];
(*(p+i))[j]=(*(p+j))[i];
(*(p+j))[i]=temp;
}
return 0;
}
void main()
{
int i,j,a[100][100],m,n,(*p)[100];
printf("请输入数组行数:\n");
scanf("%d",&m);
printf("请输入数组列数:\n");
scanf("%d",&n);
printf("请输入数组:\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
p=&a[0];
zhuan(p,m,n);
printf("转置后的数组为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
运行后原样输出,没转置。

#include "stdio.h"
int zhuan(int (*p)[100],int m,int n)
{
int i,j,temp;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
// 防止重复交换
if ( ((i > j) && (m > n)) || (i < j) && (m < n))
{
temp=(*(p+i))[j];
(*(p+i))[j]=(*(p+j))[i];
(*(p+j))[i]=temp;
}

}
return 0;
}
void main()
{
int i,j,a[100][100],m,n,(*p)[100];
// 初始化二维数组
for (int k = 0; k < 100; k++)
{
for (int l = 0;l < 100; l++)
{
a[k][l] = 0;
}
}

printf("请输入数组行数:\n");
scanf("%d",&m);
printf("请输入数组列数:\n");
scanf("%d",&n);
printf("请输入数组:\n");
// 判断行和列是否大于100
while (m > 100 || n > 100)
{
printf("数组的行数和列数不能大于100,请重新输入\n");
printf("请输入数组行数:\n");
scanf("%d", &m);
printf("请输入数组列数:\n");
scanf("%d",&n);
printf("请输入数组:\n");
}

for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
p=&a[0];
zhuan(p,m,n);
printf("转置后的数组为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-12
已改,看注释

#include "stdio.h"
int zhuan(int (*p)[100],int m,int n)
{
int i,j,temp;
for(i=0;i<m;i++)
for(j=i+1;j<n;j++) // 这里应该是从j=i+1开始
{
temp=(*(p+i))[j];
(*(p+i))[j]=(*(p+j))[i];
(*(p+j))[i]=temp;
}
return 0;
}
void main()
{
int i,j,a[100][100],m,n,(*p)[100];
printf("请输入数组行数:\n");
scanf("%d",&m);
printf("请输入数组列数:\n");
scanf("%d",&n);
printf("请输入数组:\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
p=&a[0];
zhuan(p,m,n);
printf("转置后的数组为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}本回答被网友采纳
第2个回答  2012-11-12

转置了呀!