概述
题目:主函数main()中a为M行N列二维整型数组,保存M*N个测试数据。
首先将二维数组中每一行最大元素移动到行尾,最大元素和该行其他元素的相对位置保持不变。再对M个行尾元素升序排序,同一行元素随行尾元素一起调整,和行尾元素保持在同一行中。
- 编写void max_matrix(int a[][N],int m,int n)函数,按上述规则移动每一行的最大元素。
- 编写void sort_matrix(int a[][N],int m,int n)函数,按行尾元素升序对二维数组排序。
例如:下列5*4个数据:
3 | 2 | 5 | 4 |
7 | 21 | 11 | 6 |
9 | 4 | 2 | 1 |
2 | 8 | 7 | 6 |
10 | 12 | 23 | 18 |
按上述规则每行最大元素移动到行尾后结果为:
4 | 3 | 2 | 5 |
11 | 6 | 7 | 21 |
4 | 2 | 1 | 9 |
7 | 6 | 2 | 8 |
18 | 10 | 12 | 23 |
按行尾元素升序对二维数组排序后结果为:
4 | 3 | 2 | 5 |
7 | 6 | 2 | 8 |
4 | 2 | 1 | 9 |
11 | 6 | 7 | 21 |
18 | 10 | 12 | 23 |
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<ctype.h>
#include<math.h>
#define M 5
#define N 4
void max_matrix(int a[][N],int m,int n)
{
int i,j,max,x,k;
for(i=0;i<m;i++) // i控制的是行,目的就是求出每一行的最大值
{ max=a[i][0]; //假设最大值是每一行的第1个
for(j=0;j<n;j++) //通过行号i不变,列号j的变动来比较谁是最大值!
if(max<a[i][j]) x=a[i][j];//现在每一行的最大值就是a[i][j]!
while(max!=a[i][n-1]) //等到最大值等于末尾的值时,即完成移位操作
{ x=a[i][n-1]; //算法跟一维数组移动一样
for(k=n-1;k>=1;k--) //但要注意的是:这一题要求是移动每一行最大值,所以在移动过程中,
a[i][k]=a[i][k-1]; //行号i不变,通过列号j的变动来实现移动!
a[i][k]=x;
}
}
}
void sort_matrix(int a[][N],int m,int n)
{
int i,j,x,k;
for(i=0;i<=m-2;i++) //简单的顺序排序法,要排序的个数即为最后一列的个数
for(j=i+1;j<=m-1;j++)
if(a[i][n-1]>a[j][n-1])//这里的n-1表示:最后一列的统一列号,而且这是二维数组!不能少了他!
{ x=a[j][n-1];
a[j][n-1]=a[i][n-1];
a[i][n-1]=x;
for(k=0;k<n-1;k++) //只有这里是多加的部分,实现了每一行元素根据行尾的排序来移动!
{x=a[j][k]; //这部分有分析
a[j][k]=a[i][k];
a[i][k]=x;
}
}
}
void main()
{
int a[M][N]={{3,2,5,4},{7,21,11,6},{9,4,2,1},{2,8,7,6},{10,12,23,18}};
int i,j;
max_matrix(a,M,N);
printf("After moving:n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("n");
}
printf("n");
sort_matrix(a,M,N);
printf("After sorting:n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("n");
}
}
分析:
for(k=0;k<n-1;k++)
{x=a[j][k];
a[j][k]=a[i][k];
a[i][k]=x;
}
4 | 3 | 2 | 5 |
11 | 6 | 7 | 21 |
4 | 2 | 1 | 9 |
7 | 6 | 2 | 8 |
18 | 10 | 12 | 23 |
假设第0行和第2行要进行交换,根据排序,5(a[i][n-1])和9(a[j][n-1])已经交换好,接下来就是交换这两行剩余的元素,即n-1个。
接下来试着写出交换具体步骤(就拿第0行和第2行进行举例,所以要结合上面表格来看):
a[0][0]=a[2][0] |
a[0][1]=a[2][1] |
a[0][2]=a[2][2] |
省去了用x的交换步骤。可以看出,行号就是i和j,且在交换过程中不发生改变,所以只要用for语句来实现列号的变动,就可以实现交换。所以有时候想不通只需要走一下具体的步骤就可以想通!!!
最后
以上就是专注小伙为你收集整理的C语言#分析一道稍微different二维数组移动的全部内容,希望文章能够帮你解决C语言#分析一道稍微different二维数组移动所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复