题目:
输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换。
写3个函数:
- 输人10个数
- 进行处理
- 输出10个数
分析:
题目要求写3个函数来实现,1、3函数比较简单,所以我们只分析函数2:
- 我们可以使用2个指针来实现:
- 第1个指针记录最大数的地址
- 第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;
}