二维数组的一维调用再返回

上篇文章中所提及的函数中,主函数不够简洁,于是进一步优化
下面的代码中每一个都可以单独调用,模块化程度更高;

我是初学者,写的并不好,希望有大神可以指教指教。

#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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值