上篇文章中所提及的函数中,主函数不够简洁,于是进一步优化
下面的代码中每一个都可以单独调用,模块化程度更高;
我是初学者,写的并不好,希望有大神可以指教指教。
#include<stdio.h>
int matmax(int *p,int N) //使用指针 化二维数组为一维数组进行找最大值所在位置。
{ //N为数组元素个数。
int pos;
if(N==1) //当元素个数只有一个时。
{
pos=0;
}
else
{
pos=matmax(p,N-1); //matmax(p,N-1)代表除去第N个元素外,所得的最最大值的位置。
if((*(p+pos))<(*(p+N-1))) //让前N-1个元素中的最大值与第N个元素比较;
{
pos=N-1;
}
}
return pos; //返回最大值的下标。
}
void site(int L,int M) //根据所得参数I值定位在数组中的位置。化一维坐标为二维坐标。
{
int I1,I2;
if(L<M) //第一行最后一个元素之前的数找位置,m为定义的数组列数。
{
I1=1;
I2=L; //所得I即为第一行的第I个元素。
}
else
{
if(L%M!=0) //第二行及其更高行数的每行最后一个元素之前的找位置。
{
I1=(L/M)+1; //例如5/3会得1余2,因为取整所以 (5/3)得1
I2=L%M; //同上理,因为取余所以为2。
}
else //达到列数m的整倍数时 的找位置函数。
{
I1=L/M; //当I为,m、2m、3m...所得I1即为其所在行。
I2=M; //因为 整数倍,一定在行尾。
}
}
printf("最大值在第%d行第%d列。\n",I1,I2);
}
int elt(int *q,int n_1,int n_2) //赋值函数;
{
int i,j;
printf("请对数组赋值\n");
for(i=0;i<n_1;i++) //for循环给数组每一个位置赋值。
{
for(j=0;j<n_2;j++)
{
printf("array[%d][%d]=",i+1,j+1);
scanf("%d",&(*(q+i*n_2+j))); //(*(q+i*n_2=j))表示是单个变量,等同于a[i][j];
}
}
}
void max_2(int *d,int l_1) //使用指针对二维数组降维,并以一维形式在数组内排序
{
int j_1,j_2,k; //一维数组中的冒泡法排序。
for(j_1=0;j_1<l_1;j_1++)
{
for(j_2=0;j_2<l_1-j_1;j_2++)
{
if((*(d+j_2))>(*(d+j_2+1)))
{
k=*(d+j_2+1);
*(d+j_2+1)=*(d+j_2);
*(d+j_2)=k;
}
}
}
}
void print(int *a,int num_1,int num_2) // 使用指针对二维数组降维,进行一维形式输出
{
int i_1,i_2;
printf("按大小排序后的数组如下\n");
for(i_1=0;i_1<num_1;i_1++)
{
for(i_2=0;i_2<num_2;i_2++)
{
printf("%d ",*(a+i_1*num_2+i_2)); //(i_1*num_2)意义是数乘的意思;,目的是为了换行;i_2是用来移动a的行位置;
}
printf("\n");
}
}
void line()
{
printf("---------------------\n");
}
int main()
{
int n,m,I;
printf("请定义二维数组行数n、列数m的大小:");
scanf("%d %d",&n,&m); //给数组的行列赋值 。
int array[n][m];
elt(array[0],n,m); //对二维数组赋值函数 ,(首元素地址,行数,列数) ;
I=matmax(array[0],n*m); //得最大值所在一维位置 (首元素地址,总元素个数);
I=I+1; //加一,修正I 为标准12345678910 ...
line();
site(I,m); //一维坐标化二维坐标函数;(一维坐标,列数);
max_2(array[0],n*m-1); //按由小到大顺序给数组排序。(元素首地址,进行总数-1次比较);
line();
print(array[0],n,m); //按max_2函数已排好的顺序输出。(元素首地址,行数,列数);
return 0;
}