C语言二维数组如何交换两行或者两列?
1 2 5 7
5 3 8 0
2 4 7 9
需要比较每一行第一个数字的大小,按照每一行第一个数字从大到小排列,只是比较第一个数字,后面的数字不动的,上面这个输出之后就是
5 3 8 0
2 4 7 9
1 2 5 7
我不知道在二维数组里面怎么整行移动,也不知道能不能做到整行移动,如果需要用到指针,麻烦多解释一下指针的用法,我刚开始学C语言,对指针的使用不太熟练,谢谢大家。
补充:不好意思,上面输出的二维数组第二行和第三行之间多打了一行,这个是没有的,应该是这样的:
5 3 8 0
2 4 7 9
1 2 5 7 展开
代码:
#include<stdio.h>
int main()
{
int i, j, a[2][3] = { {1,2,3},{4,5,6} },b[3][2];
printf("array a:\n");
for (i = 0; i <=1; i++)//处理a数组中的一行中各元素
{
for (j = 0; j <= 2; j++)//处理a数组中的某一列元素
{
printf("%5d", a[i][j]);
b[j][i] = a[i][j];
}
printf("\n");
}
printf("array b:\n");
for (i = 0; i<=2; i++)
{
for (j = 0; j <=1; j++)
{
printf("%5d", b[i][j]);
}
printf("\n");
}
return 0;
}
扩展资料:
1、return在函数中的作用
我们如果将函数看做一个加工厂,参数就是我们向加工厂投入的原料,具体的函数功能实际上就是加工的过程,而return语句代表返回值,就是加工厂在实现加工之后给“投资人”的成品。
2、return语句的特点
a、在函数当中,遇到return语句之后就意味着函数运行的结束,在此之后的代码是不运行的。
b、它不支持任何运算也没有任何内建方法,和任何其他的数据类型比较是否相等时永远返回false,也可以将None赋值给任何变量。
c、执行到return语句时,会退出函数,return之后的语句不再执行。但将return语句放在try语句块中,是个例外。
3、return的默认值:return函数默认的返回值为undefined。
#include<iostream>
using namespace std;
void show (int a[3][4])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
cout<<a[i][j]<<"\t";
}
cout<<endl;
}
}
int main()
{
int a[3][4],i,j,k;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
cin>>a[i][j];
show(a);
for(i=0;i<3;i++)
{
for(j=i+1;j<3;j++)
{
if(a[i][0]<a[j][0])
{
for(k=0;k<4;k++)
{
int p;
p=a[i][k];
a[i][k]=a[j][k];
a[j][k]=p;
}
}
}
}
cout<<endl;
show(a);
return 0;
}
谢谢回复
我查了一下cout和endl,这都是C++里面的,我还没有学C++,希望能用C语言写,C语言也是这样子的么?
#include
void show (int a[3][4])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
int main()
{
int a[3][4],i,j,k;
for(i=0;i<3;i++)
for(j=0;j<4;j++) scanf("%d",&a[i][j]);
show(a);
for(i=0;i<3;i++)
{
for(j=i+1;j<3;j++)
{
if(a[i][0]<a[j][0])
{
for(k=0;k<4;k++)
{
int p;
p=a[i][k];
a[i][k]=a[j][k];
a[j][k]=p;
}
}
}
}
printf("\n");
show(a);
return 0;
}
可以整一个临时的数组交换就行了。一维数组就相当于一个指针,二维数组就相当于指针的指针。
即int a[10],a其实就是一个int *。int b[10][10],b就是一个int **,而b[0]就是一个int *。
比如你的数组a[0] = {1 2 5 7} a[1] = {5 3 8 0} a[2] = {2 4 7 9},其实就是一个指针。如果这个整明白了,就好操作了。
int i,j;
int a[3][4] ={ 1,2,5,7, 5, 3, 8, 0, 2, 4, 7, 9};
int b[4]; /* 临时保存交换的数据 */
for(i = 0; i < 3; i ++)
{
for(j = i; j < 2; j ++)
{
/* 冒泡排序,把最小的放到最后 */
if (a[j][0] < a [j + 1][0])
{
memcpy(b,a[j], sizeof(b));
memcpy(a[j], a[j + 1], sizeof(b));
memcpy(a[j + 1], b, sizeof(b));
}
}
}
谢谢回复。
有三个问题:
关于指针,你说int a[10],a其实就是一个指针,如果int *a[10],这里该怎么理解?
memcpy我之前没有用过,为什么要加sizeof(b)?这儿能用strcpy么?
老师现在经常用malloc和free,这个有必要么
int * a = malloc(10 * sizeof(int)),也可以a[0],a[1]这种方式使用,和int b[10]这种一样,a和b的类型是一致的。 int * a[10]就不是这个意思了,这个是10个int *的指针,a[1] = malloc(10 * sizeof(int))来用,a[1][0],就可以代表其中的元素。 int * a[10]就代表二维数组了。
不能用strcpy,memcpy是内存拷贝,直接向地址里面拷贝一定长度的内存。strcpy只能拷贝字符串,要求必须要有\0.这种数组不是字符串,不能用strcpy。
malloc只是申请一块内存,内存申请和释放比较浪费性能。malloc一般用在使用大内存的时候,或者需要向另一个函数传递地址的时候用。一般局部变量能搞定的,就没必要malloc。这里malloc也是可以实现的。
在数组int a[M][N]中,如需交换i(0 <= s < M)行和t(0 <= t < M)行,s != t,代码如下。
for(i = 0; i < N; ++i) { tmp = a[s][i]; a[s][i] = a[t][i]; a[t][i] = tmp; }
在数组int a[M][N]中,如需交换i(0 <= s < M)列和t(0 <= t < M)列,s != t,代码如下。
for(i = 0; i < M; ++i) { tmp = a[i][s]; a[i][s] = a[i][t]; a[i][t] = tmp; }