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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#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))<min1)		//当后面的数小于min1时,令min1=该数,就把min1的范围缩小了 
				{	min1=*(*(p+i)+j);		//整个循环完毕后,min1就是最小的 
					row=i;
					clow=j;
				}
			}
		}
		*(*(p+row)+clow)=*(*p);				//将最小元素与左上角元素对调 
		*(*p)=min1;
	//找最小值min2 
		for(i=0,min2=max,row=clow=0;i<5;i++)	//令min2为最大值max 
		{
			for(j=0;j<5;j++)
			{
				if((min1<*(*(p+i)+j))&&(*(*(p+i)+j)<min2))//当后面的数大于min1,并且小于min2时,令min2=该数,就把min2的范围缩小了
				{	min2=*(*(p+i)+j);					//整个循环完毕后,min2就是除min1以外最小的。 
					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)<min3))//当后面的数大于min2,并且小于min3时,令min3=该数,就把min3的范围缩小了
				{	min3=*(*(p+i)+j);						整个循环完毕后,min3就是除min1,min2以外最小的。 
					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)<min4))	//当后面的数大于min3,并且小于min4时,令min4=该数,就把min4的范围缩小了
				{	min4=*(*(p+i)+j);						//整个循环完毕后,min4就是除min1,min2,min3以外最小的。 
					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 <stdio.h>
#include <stdlib.h>
#include <math.h>
#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;
}

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

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

好的,下面是使用指针实现的代码: ```c #include <stdio.h> void sort(int *arr, int len) { int i, j, temp; for(i = 0; i < len - 1; i++) { for(j = 0; j < len - 1 - i; j++) { if(arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } void print_matrix(int (*matrix)[5], int row, int col) { int i, j; for(i = 0; i < row; i++) { for(j = 0; j < col; j++) { printf("%d\t", *(*(matrix+i)+j)); } printf("\n"); } } void set_matrix(int (*matrix)[5], int row, int col) { int i, j, max_index_i, max_index_j, min_index; int max, min[4]; int *pmax, *pmin[4]; // 找到矩阵最大值的位置 pmax = *matrix; max_index_i = max_index_j = 0; for(i = 0; i < row; i++) { for(j = 0; j < col; j++) { if(*(*(matrix+i)+j) > *pmax) { pmax = *(matrix+i)+j; max_index_i = i; max_index_j = j; } } } max = *pmax; // 找到矩阵最小值的位置 min_index = 0; pmin[0] = *matrix; pmin[1] = *matrix+col-1; pmin[2] = *(matrix+row-1); pmin[3] = *(matrix+row-1)+col-1; for(i = 0; i < 4; i++) { min[i] = *(pmin[i]); } sort(min, 4); // 设置矩阵元素 *pmax = max; *(*(matrix)+0) = min[0]; *(*(matrix)+col-1) = min[1]; *(*(matrix+row-1)) = min[2]; *(*(matrix+row-1)+col-1) = min[3]; } int main() { int matrix[5][5] = {{5, 4, 3, 2, 1}, {10, 9, 8, 7, 6}, {15, 14, 13, 12, 11}, {20, 19, 18, 17, 16}, {25, 24, 23, 22, 21}}; printf("原始矩阵:\n"); print_matrix(matrix, 5, 5); set_matrix(matrix, 5, 5); printf("处理后的矩阵:\n"); print_matrix(matrix, 5, 5); return 0; } ``` 这段代码,`set_matrix` 函数用于设置矩阵元素,`print_matrix` 函数用于打印矩阵,`sort` 函数用于排序。在 `main` 函数,首先打印原始矩阵,然后调用 `set_matrix` 函数设置矩阵元素,最后再打印处理后的矩阵。注意,指针的使用需要特别小心,需要注意指针的类型和指针的取值方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值