Почему прерывание вызывается после создания экземпляра 'range error' what (): 'Range Error' -1 - PullRequest
1 голос
/ 28 апреля 2020

Я не знаю, почему компилятор возвращает эту ошибку. Я искал в Google, но ничего не нашел.

#include"std_lib_facilities.h"
int main()
{
  vector<double>numbers;
  cout<<"Enter any two numbers:\n";
  double two_numbers;
  //loop
  while(cin>>two_numbers){
    numbers.push_back(two_numbers);
    double vector_size = numbers.size();
    double two = 2;
    double formula_equal = 1.0/100;
    double od_ev = fmod(vector_size , two);
    //checking the conditions
    if(od_ev == 0)
      if(numbers[vector_size-1] > numbers[vector_size - 2])
        cout<<"The larger value is: "<<numbers[vector_size - 1]<<'\n'
            <<"The smaller value is: "<<numbers[vector_size - 2]<<'\n';
        if(numbers[vector_size-1] - numbers[vector_size - 2] < formula_equal)
          cout<<"These numbers are almost equal.";

      else if(numbers[vector_size-1] < numbers[vector_size - 2])
        cout<<"The larger value is: "<<numbers[vector_size - 2]<<'\n'
            <<"The smaller value is: "<<numbers[vector_size - 1]<<'\n';
        if(numbers[vector_size-2] - numbers[vector_size - 1] < formula_equal)
          cout<<"these numbers are almost equal.";

      else if(numbers[vector_size-1] == numbers[vector_size - 2])
        cout<<numbers[vector_size-1]<<" is equal to  "<<numbers[vector_size - 2]<<'\n';

      }
  }

Ответы [ 2 ]

4 голосов
/ 28 апреля 2020

Мои наблюдения:

  1. Проблема в строке:

    numbers[vector_size-1] > numbers[vector_size - 2]
    

    На первой итерации для l oop, vector_size может быть 1 и vector_size - 2 будет -1. Вы должны обработать этот случай и не разрешать доступ к любому элементу, кроме [0, vector.size()).

  2. Вы можете просто использовать unsigned в качестве типа данных для индексной переменной. То есть vector_size должно быть без знака. Кроме того, вы должны рассмотреть возможность использования в метода класса vector.

    Возвращает ссылку на элемент в указанном месте pos с проверкой границ. Если pos находится вне диапазона контейнера, генерируется исключение типа std :: out_of_range.

  3. Хорошей практикой является использование скобок {} вокруг многострочных оператор под оператором if, и необходимо заключить в скобки несколько операторов, которые должны выполняться, только если условия if становятся true. То, что вы ожидали, что код под вашим if(od_ev == 0) будет выполняться только тогда, когда od_ev будет ноль. Однако компилятор рассматривает только оператор:

    if(numbers[vector_size-1] > numbers[vector_size - 2])
         cout << "The larger value is: " << numbers[vector_size - 1] << '\n'
             << "The smaller value is: " << numbers[vector_size - 2] << '\n';
    

    Является частью оператора if, а остальные операторы будут выполняться независимо от значения od_ev. Это может быть причиной того, что ваш механизм проверки индекса не работает должным образом.

  4. Я не думаю, что вам нужно хранить все введенные пользователем числа в vector поскольку вы сравниваете только последние два значения, введенные пользователем. Вы можете придумать лучшую реализацию, которая не использует вектор.

3 голосов
/ 28 апреля 2020

Давайте исправим отступ:

if(od_ev == 0)
    if(numbers[vector_size-1] > numbers[vector_size - 2])
        cout<<"The larger value is: "<<numbers[vector_size - 1]<<'\n'
            <<"The smaller value is: "<<numbers[vector_size - 2]<<'\n';
if(numbers[vector_size-1] - numbers[vector_size - 2] < formula_equal)
    cout<<"These numbers are almost equal.";
else if(numbers[vector_size-1] < numbers[vector_size - 2])
    cout<<"The larger value is: "<<numbers[vector_size - 2]<<'\n'
        <<"The smaller value is: "<<numbers[vector_size - 1]<<'\n';
if(numbers[vector_size-2] - numbers[vector_size - 1] < formula_equal)
    cout<<"these numbers are almost equal.";
else if(numbers[vector_size-1] == numbers[vector_size - 2])
    cout<<numbers[vector_size-1]<<" is equal to  "<<numbers[vector_size - 2]<<'\n';

Если вы не используете {}, тогда тело if - это всего лишь один оператор, следовательно, вы получаете доступ к вектору вне границ в первая итерация.

Для иллюстрации рассмотрим следующее:

if (number.size() > 1) 
     std::cout << number.size();
     std::cout << number[0];

Правильно отформатировано:

if (number.size() > 1) 
    std::cout << number.size();
std::cout << number[0];

и, вероятно, должно было быть:

if (number.size() > 1) {
    std::cout << number.size();
    std::cout << number[0];
}

Я нахожу ваш vector_size довольно запутанным. Используйте numbers.size() (он имеет постоянную сложность, а не линейный, как можно было бы ожидать). Также используйте метод векторов at для лучшей диагностики, когда вы не уверены на 100% в доступе только к действительным индексам.

Также не используйте double для индекса, а double two = 2; - полное нет - go. Если вы действительно хотите two, то как минимум сделайте его const, чтобы two = 3; было невозможно.

...