Поиск минимального и максимального значений

Чтобы в массиве найти минимальное значение следует присвоить переменной 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);
На заметку

Внутри функции 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

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов