Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Поиск минимального и максимального значений
Чтобы в массиве найти минимальное значение следует присвоить переменной min
значение первого элемента массива, а затем произвести сравнение с остальными элементами. Если значение текущего элемента меньше значения переменной min
, то присваиваем значение текущего элемента переменной min
.
Чтобы найти максимальное значение следует присвоить переменной max
значение первого элемента массива, а затем произвести сравнение с остальными элементами. Если значение текущего элемента больше значения переменной max
, то присваиваем значение текущего элемента переменной max
.
Пример поиска минимального и максимального значения приведен в листинге 6.1.
Листинг 6.1. Поиск минимального и максимального значений
#include <iostream>
int min(int *pArr, int length);
int max(int *pArr, int length);
void min_max(int *pArr, int length, int *pMin, int *pMax);
int main() {
const int ARR_SIZE = 5;
int arr[ARR_SIZE] = {2, 5, 6, 1, 3};
std::cout << "min = " << min(arr, ARR_SIZE) << std::endl;
std::cout << "max = " << max(arr, ARR_SIZE) << std::endl;
int _min = 0, _max = 0;
min_max(arr, ARR_SIZE, &_min, &_max);
std::cout << "min = " << _min << std::endl;
std::cout << "max = " << _max << std::endl;
_min = 0;
min_max(arr, ARR_SIZE, &_min, nullptr);
std::cout << "min = " << _min << std::endl;
_max = 0;
min_max(arr, ARR_SIZE, nullptr, &_max);
std::cout << "max = " << _max << std::endl;
return 0;
}
int min(int *pArr, int length) {
int min = pArr[0];
for (int i = 0; i < length; ++i) {
if (pArr[i] < min) min = pArr[i];
}
return min;
}
int max(int *pArr, int length) {
int max = pArr[0];
for (int i = 0; i < length; ++i) {
if (pArr[i] > max) max = pArr[i];
}
return max;
}
void min_max(int *pArr, int length, int *pMin, int *pMax) {
if (!pArr || length < 1) return;
int *p = pArr, min = pArr[0], max = pArr[0];
for (int i = 0; i < length; ++i, ++p) {
if (*p < min) min = *p;
if (*p > max) max = *p;
}
if (pMin) *pMin = min;
if (pMax) *pMax = max;
}
В этом примере мы создали три функции: min()
, max()
и min_max()
. Функции в первом параметре принимают адрес первого элемента массива, а во втором — длину массива. Внутри функции min()
выполняется поиск минимального значения, а внутри функции max()
— максимального значения. Найденные значения функции возвращают с помощью оператора return
. Как только внутри функции встречается оператор return
или поток доходит до конца блока функции, управление передается в место вызова функции. При этом становится доступно значение, указанное в операторе return
. Если функция ничего не возвращает, то при объявлении перед именем функции указывается ключевое слово void
. В этом случае оператор return
использовать не нужно. Хотя его можно и указать, например, чтобы досрочно выйти из функции:
if (!pArr || length < 1) return;
Если pArr
является нулевым указателем или длина массива меньше 1
, то просто выходим из функции. При этом после оператора return
значение не указывается.
Функция min_max()
выполняет поиск и минимального значения, и максимального значения массива одновременно. Однако из функции с помощью оператора return
мы можем вернуть только одно значение, поэтому вместо возврата значения, в третьем и четвертом параметрах функция принимает адреса переменных, в которые будут записаны найденные значения. Чтобы передать в функцию адрес переменной, перед ее именем указывается оператор &
:
int _min = 0, _max = 0;
min_max(arr, ARR_SIZE, &_min, &_max);
pair
(см. разд. 18.1) и tuple
(см. разд. 18.2).Внутри функции min_max()
мы проверяем наличие адреса переменной, поэтому можем передать нулевой указатель вместо адреса, если какое-либо значение нам не нужно. В этом примере мы хотим получить только минимальное значение:
_min = 0;
min_max(arr, ARR_SIZE, &_min, nullptr);
Внутри функций min()
и max()
мы используем доступ к элементу массива по индексу, указанному внутри квадратных скобок: pArr[i]
. При этом каждый раз положение элемента вычисляется относительно начала массива: *(pArr + i)
. Чем больше таких обращений, тем менее эффективна программа. Чтобы сделать программу более быстрой и эффективной внутри функции min_max()
на каждой итерации мы перемещаем указатель, используя адресную арифметику. В этом случае никаких дополнительных вычислений положения элемента внутри массива не производится.
Найти в массиве элементы с минимальным или максимальным значениями позволяют стандартные функции min_element()
, max_element()
и minmax_element()
(см. разд. 19.2):
// #include <algorithm>
const int ARR_SIZE = 3;
int arr[ARR_SIZE] = {1, 2, 3};
std::cout << *std::min_element(arr, arr + ARR_SIZE)
<< std::endl; // 1
std::cout << *std::max_element(arr, arr + ARR_SIZE)
<< std::endl; // 3
auto p = std::minmax_element(arr, arr + ARR_SIZE);
std::cout << *p.first << ' '
<< *p.second << std::endl; // 1 3
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов