(指针方法)10.将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。

(指针方法)10.将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。,第1张

这道题最关键的点在于:如何找到二维数组的四个最小值;

 这里小编给出两种方法:
        第一种:利用打擂台算法来找到最小值;代码如下:

#include 
#include 
#include 
#define M 10
void set_array(int (*p)[5])			//数组指针接收实参二维数组 
{
	int i,j,k=0;
	printf("调换前:\n");
	for(i=0;i<5;i++)				//为二维数组从1~25进行赋值 
	{
		for(j=0;j<5;j++)
		{
			*(*(p+i)+j)=k+j+1;
			printf("%5d ",*(*(p+i)+j));
		}
		printf("\n");
		k=k+5;
	}
}
void func(int (*p)[5])				//数组指针接收实参二维数组 
{
	int i,j,clow=0,row=0,min1,min2,min3,min4,max;//定义行,列,四个最小值,以及最大值, 
	//找最大值; 
	for(i=0,max=*(*p),clow=row=0;i<5;i++)	 
	{
		for(j=0;j<5;j++)
		{
			if(*(*(p+i)+j)>max)			
			{
				max=*(*(p+i)+j);		//打擂台算法找最大值
				row=i;
				clow=j;
			}
		}
	}
	*(*(p+row)+clow)=*(*(p+2)+2);		//找到最大值与二维数组中间元素a【2】【2】进行调换 
	*(*(p+2)+2)=max; 				
	//找最小值min1 
		for(i=0,min1=max,row=clow=0;i<5;i++) //先令min1为max, 
		{
			for(j=0;j<5;j++)
			{							
				if((*(*(p+i)+j))


row=i; clow=j; } } } *(*(p+row)+clow)=*(*p+4); //将最小元素与右上角元素对调 *(*p+4)=min2; //找最小值min3 for(i=0,min3=max,row=clow=0;i<5;i++) //令min3为最大值max { for(j=0;j<5;j++) { if((min2<*(*(p+i)+j))&&(*(*(p+i)+j)


row=i; clow=j; } } } *(*(p+row)+clow)=*(*(p+4)); //将最小元素与左下角元素对调 *(*(p+4))=min3; //找最小值min4 for(i=0,min4=max,row=clow=0;i<5;i++) //令min4为最大值max { for(j=0;j<5;j++) { if((min3<*(*(p+i)+j))&&(*(*(p+i)+j)


row=i; clow=j; } } } *(*(p+row)+clow)=*(*(p+4)+4); //将最小元素与右下角元素对调 *(*(p+4)+4)=min4; } void show_array(int (*p)[5]) { printf("转换后:\n"); int i,j; for(i=0;i<5;i++) //打印输出 { for(j=0;j<5;j++) { printf("%5d ",*(*(p+i)+j)); } printf("\n"); } } int main(void) { int a[5][5]; set_array(a); //调用赋值函数 func(a); //调用对调函数 show_array(a); //调用打印函数 return 0; }

这里小编还有第二种方法:

        将二维数组转化为一维数组,利用冒泡排序找出整个数组的前四位最小值;代码如下:

#include 
#include 
#include 
#define M 10
void set_array(int (*p)[5])				//用数组指针指向实参二维数组 
{
	int i,j,k=0;
	printf("调换前:\n");
	for(i=0;i<5;i++)					//为定义的二维数组赋值; 
	{
		for(j=0;j<5;j++)
		{
			*(*(p+i)+j)=k+j+1;		
			printf("%5d ",*(*(p+i)+j));
		}
		printf("\n");
		k=k+5;
	}
}
void func(int (*p)[5])
{
	int i,j,clow=0,row=0,b[25],max,temp=0,k[4],t;
	//找最大值; 
	for(i=0,max=*(*p);i<5;i++)		//利用打擂台算法找到最大值 
	{
		for(j=0;j<5;j++)
		{
			if(*(*(p+i)+j)>max)
			{
				max=*(*(p+i)+j);
				row=i;
				clow=j;
			}
		}
	}
	*(*(p+row)+clow)=*(*(p+2)+2);	//最大值与二维数组中心元素a【2】【2】进行调换 
	*(*(p+2)+2)=max; 
	
	//找四个最小值; 
	
	for(i=0;i<5;i++)			//转化成一维数组; 
	{
		for(j=0;j<5;j++)
		{
		b[temp]=*(*(p+i)+j);
		temp++;
		}
		
	}
	for(i=0;i<24;i++)			//利用冒泡排序找出前四个最小值 
	{
		for(j=0;j<24-i;j++)
		{
			if(b[j]>b[j+1])
			{
				t=b[j];
				b[j]=b[j+1];
				b[j+1]=t;	
			}
		}
	}
	
	for(i=0;i<4;i++)		//利用k【4】来存入前四个最小值 
	{
		k[i]=b[i];
	}
	*(*p)=k[0];					//将四个角分别与四个最小值进行调换, 
	*(*(p)+4)=k[1];
	*(*(p+4))=k[2];
	*(*(p+4)+4)=k[3];


}                                                                          
void show_array(int (*p)[5])	//用数组指针接收实参二维数组 
{	printf("转换后:\n"); 
	int i,j;
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			printf("%5d ",*(*(p+i)+j));		//打印输出 
		}
		printf("\n");
	}
}
int main(void)
{	int a[5][5];
	set_array(a);			//调用赋值函数 
	func(a);				//调用对调函数 
	show_array(a);			//调用打印函数 
	return 0;
}

总结:需要理解二维数组,以及数组指针的基本概念,熟练掌握打擂台算法以及冒泡排序算法。


小编感觉这道题虽然看起来很简单,但真正上手的时候会感到无从下手,需要我们扎实的基础知识。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562854.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-02
下一篇 2022-04-02

发表评论

登录后才能评论

评论列表(0条)

保存