Проблема заключается во втором for
теле цикла.
Как отметил НатанОливер в комментариях, arr[i] > arr[i-1]
должен пытаться получить доступ к памяти с недопустимым смещением, когда i
равно 0.
То же самое относится и к другому условию - arr[i] > arr[i+1]
приведет к выходу за пределы - ну, ваш arr
может содержать максимум 50 элементов, поэтому, если n
меньше 50, вы должны получать доступ только к неинициализированной памяти.
Условие нахождения пика может быть переписано как:
for (unsigned i = 0u; i < n; i++){
bool isPeak = true;
if (i > 0 && arr[i] < arr[i - 1]){
isPeak = false;
}
if (i < n - 1 && arr[i] < arr[i + 1]){
isPeak = false;
}
if (isPeak){
std::cout << "PEAK: " << arr[i] << '\n';
}
}
Это использует короткое замыкание логических операторов - выражения оцениваются слева направо, поэтому - если мы вернемся к условию i > 0 && arr[i] < arr[i - 1]
- потенциально опасная проверка (которая может привести к неправильному доступу) не будет происходит, если первое условие (i > 0
) ложно.
Что касается самого кода, теперь он проверяет каждую сторону текущего элемента отдельно.
Еще лучше (хотя, вероятно, это не связано с тем, что имеет в виду ваш учитель), было бы использовать std::vector
. Код может обрабатывать более 50 элементов.