HatunaLM
@HatunaLM

Как можно вычислить максимальное и минимальное значение массива?

Я сейчас изучаю массивы и наткнулась на такую задачу, как минимальное и максимальное значение массива. В итоге, исходя из разнообразных примеров, пришла к следующему коду (часть, c[i] - массив):
int max = 0;
int min = 0;

int max_index = 0; 
int min_index = 0;

for(int i = 0; i < 20; ++i)
{
   if(max < c[i])
   {
      max       = c[i];
      max_index = i;
   }

   if(min > c[i])
   {
      min       = c[i];
      min_index = i;
   }
}

В итоге максимальное значение выводит верно, а минимальным элементом указывается 0, которого в самом массиве нет. Мало того, что минимальное значение неверное, так я еще никак не могу понять суть вышеуказанной части кода. Каким образом получается максимальное значение и минимальное? Вот вообще понять не могу, а просто зазубривать не хочется. Буду признательна за ответ.
  • Вопрос задан
  • 11254 просмотра
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Коротко, ты можешь не сохранять минимальное и максимальное значение отдельно, т.к. они всегда доступны по индексу в массиве. Другое дело - это что у тебя нет этих индексов до начала прохода по массиву, тебе их просто неоткуда взять. Этот момент и определяет верное начальное состояние в решении твоей задачи. Отсутствие этого момента и приводит к тому, что твой код сейчас работает неверно.

Тебе нужны только индексы тех элементов, которые ты считаешь как минимальный и максимальный.
size_t min_value_index = 0;
size_t max_value_index = 0;

Я выбираю инициализацию в 0 для того чтобы изначально обозначить первый же элемент массива и как минимальный, и как максимальный одновременно. Именно так я определю начальное состояние алгоритма.

Далее надо сделать проход по массиву.
for( size_t index = 1; index < stream_length; ++index )
{
   // ...
}

Мне незачем сравнивать элемент по нулевому индексу с самим собой, т.к. я изначально уже выбрал его, поэтому проход по массиву можно начать со следующего элемента.

Теперь надо записать условие выбора минимального и максимального значений.
for( size_t index = 1; index < stream_length; ++index )
{
   if( stream[ index ] < stream[ min_value_index ] )
   {
      min_value_index = index;
   }
   
   if( stream[ index ] > stream[ max_value_index ] )
   {
      max_value_index = index;
   }
}

При записи условий очень важно соблюдать логику. Нужно писать так, чтобы выражение читалось как можно легче, используя слова в названиях и порядок записи операций.
Тут видно что если по текущему индексу значение меньше запомненного минимального, то надо запомнить текущий индекс как индекс минимального значения. И для максимального значения точно так же.

По завершении цикла в min_value_index будет гарантированно лежать индекс минимального значения массива, а в max_value_index - индекс максимального.

Как работает этот код.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BacCM
@BacCM
C++ почти с рождения
Самое правильное, так:

cout << *min_element(begin(c), end(c)) << endl;
cout << *max_element(begin(c), end(c)) << endl;


Можно так

std::partial_sort(begin(с), begin(с) + 1, end(с));
auto m = с.front();
std::partial_sort(begin(с), begin(с) + 1, end(с), greater<long>());
auto M = с.front();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы