Проблема с пользовательской функцией для проверки порядка элементов массива - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь написать функцию, которая проверяет, упорядочены ли все элементы данного массива от наименьшего к наибольшему, т. Е. a[0] <= a[1] <= a[2] ... имеет значение true.

Я проверяю это, используя для l oop с условием a[i] > a[i + 1]. функция должна возвращать значение индекса элемента, для которого это условие не выполняется. в противном случае он должен возвращать -1.

, когда я запускаю эту функцию на test2[], он должен возвращать 5, потому что 4 меньше 5 и значение индекса 4 в массиве test2[] это 5. но я продолжаю получать -1, что неправильно указывает, что элементы массива упорядочены от наименьшего к наибольшему.

Любой совет, как это исправить? Я пытался в течение долгого времени.

Заранее благодарю за понимание. моя программа вставлена ​​ниже.

#include <iostream>

using namespace std;

int outOfOrder(double a[], int size);

int main() {


  double test2[] = {1, 2, 3, 4, 5, 4, 8};
  int size = 7;

  outOfOrder(test2, size);

  return 0;

}

int outOfOrder(double a[], int size){

  for (int i = 0; i < size - 1; i++){

    if (a[i] > a[i + 1]){

      cout << i + 1;
      return (i + 1);

    } else {

      cout << -1;
      return -1;

    }

  }

  return 0;

}

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Ваши операторы cout не принадлежат функции outOfOrder(). Вместо этого вы должны обработать этот вывод внутри вашей функции main().

В outOfOrder() оператор return -1 необходимо переместить за пределы l oop. Вы нарушаете свой l oop после 1-й итерации, независимо от содержимого переданного массива.

Попробуйте:

int main() {
  double test2[] = {1, 2, 3, 4, 5, 4, 8};
  int size = 7;
  cout << outOfOrder(test2, size);
  return 0;
}

int outOfOrder(double a[], int size){
  for (int i = 0; i < size - 1; i++){
    if (a[i] > a[i + 1]){
      return (i + 1);
    }
  }
  return -1;
}
1 голос
/ 17 марта 2020

Функция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...