题目:

输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换。

写3个函数:

  1. 输人10个数
  2. 进行处理
  3. 输出10个数

分析:

题目要求写3个函数来实现,1、3函数比较简单,所以我们只分析函数2:

  • 我们可以使用2个指针来实现:
  1. 第1个指针记录最大数的地址
  2. 第2个指针记录最小数的地址
  • 记录完毕后将指针中的值与目标值交换即可

交换时需要注意一点:如果原数组中,max在最前面。那么在第一次min的交换中,max的地址就会发生变化。此时应该让max的地址从原始值改至偏移后的地址(也就是原来的min地址)。

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <limits.h>

void Scan(int* p, int sz)
{
	assert(p);

	int i = 0;

	for (i = 0; i < sz; i++)
	{
		scanf("%d", p + i);
	}
}

void Print(const int* p, int sz)
{
	assert(p);

	int i = 0;
	
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}

void Swap(int* p, int sz)
{
	assert(p);

	int max = INT_MAX;
	int min = INT_MIN;
	int* p_min = &max;
	int* p_max = &min;
	int tem = 0;
	int i = 0;
	
	for (i = 0; i < sz; i++)
	{
		//找最小值位置
		if (*p_min > *(p + i))
		{
			p_min = p + i;
		}
		//找最大位置
		if (*p_max < *(p + i))
		{
			p_max = p + i;
		}
	}

	//如果最大值在起始位置,经过第一次min交换后,最大值的位置会发生偏移
	//偏移后的位置即p_min
	if (p_max == p)
	{
		p_max = p_min;
	}

	//交换最小值
	if (p_min != p)
	{
		tem = *p_min;
		*p_min = *p;
		*p = tem;
	}

	//交换最大值
	if (p_max != p + sz -1)
	{
		tem = *p_max;
		*p_max = *(p + sz - 1);
		*(p + sz - 1) = tem;
	}
}

int main()
{
	int arr[10] = { 0 };
	int sz = 0;

	sz = sizeof(arr) / sizeof(arr[0]);

	//输入
	Scan(arr, sz);

	//处理
	Swap(arr, sz);
	
	//输出
	Print(arr, sz);

	return 0;
}

运行结果:

谭浩强 第5版 第8章 第3题_i++