Функция outOfOrder неверна.
int outOfOrder(double a[], int size){
for (int i = 0; i < size - 1; i++){
if (a[i] > a[i + 1]){
return (i + 1);
} else {
return -1;
}
}
return 0;
}
Возвращает -1, как только следующий элемент не станет меньше текущего элемента. Также у него есть неясное третье возвращаемое значение 0.
Кажется, вы имеете в виду следующее
size_t outOfOrder( const double a[], size_t size )
{
size_t i = 0;
if ( size != 0 )
{
while ( ++i < size && !( a[i] < a[i-1] ) );
}
return i == size ? -1 : i;
}
То есть первый параметр должен иметь квалификатор const, поскольку массив не изменяется в функции , И второй параметр должен иметь тип size_t.
Обычно такая функция или алгоритм возвращает значение размера массива, которое является значением размера второго параметра, в случае, когда все элементы массива удовлетворяют заданному условие.
Также не используйте магические числа c, такие как 7, в этом объявлении
int size = 7;
Вы можете вычислить количество элементов, по крайней мере, как
const size_t size = sizeof( test2 ) / sizeof( *test2 );
Обратите внимание, что в заголовке объявлен стандартный алгоритм std::is_sorted_until
<algorithm>
Вот демонстрационная программа, которая показывает оба подхода.
#include <iostream>
#include <iterator>
#include <algorithm>
size_t outOfOrder( const double a[], size_t size )
{
size_t i = 0;
if ( size != 0 )
{
while ( ++i < size && !( a[i] < a[i-1] ) );
}
return i == size ? -1 : i;
}
int main()
{
double test2[] = { 1, 2, 3, 4, 5, 4, 8 };
const size_t N = sizeof( test2 ) / sizeof( *test2 );
auto pos = outOfOrder( test2, N );
std::cout << "pos = " << pos << " test2[" << pos << "] = " << test2[pos] << '\n';
auto it = std::is_sorted_until( std::begin( test2 ), std::end( test2 ) );
pos = std::distance( std::begin( test2 ), it );
std::cout << "pos = " << pos << " test2[" << pos << "] = " << test2[pos] << '\n';
return 0;
}
Вывод программы:
pos = 5 test2[5] = 4
pos = 5 test2[5] = 4