2016-01-30 2 views
-1

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

Вот мой код:

#include <iostream> 
#include <Algorithm> 
#include <Windows.h> 
#include <vector> 

using namespace std; 

int main() { 
    //Variables 
    int sze; 
    int mraw = 0; 
    double mean; 
    double median; 
    double range; 
    int fullnum = 0; 
    int lastnum = 1; 
    vector<int> med; 

    cout << "How many numbers do you have? "; 
    cin >> sze; 
    int *arr = new int[sze]; 
    for (int i = 0; i < sze; i++) { 
     med.push_back(arr[i]); 
    } 
    //Getting numbers 
    for (int i = 0; i < sze, i++;) { 
     system("cls"); 
     cout << "Enter number #" << i + 1 << ": "; 
     cin >> arr[i]; 
    } 

    //Mean 

    for (int i = 0; i < sze; i++){ 
     fullnum += arr[i]; 
    } 
    mean = fullnum/sze; 

    //Median 

    sort(med.begin(), med.end()); 
    int mvs = sze; 
    while (med.size() >= 2) { 
     med.erase(med.begin()); 
     med.erase(med.begin() + med.size() - 1); 
     mvs--; 
    } 
    if (mvs == 2) { 
     mraw = med[1] + med[2]; 
     median = mraw/2; 
    } 
    else { 
     median = mvs; 
    } 

    //Range 

    vector<int> rnge; 
    for (int i = 0; i < sze; i++) { 
     rnge.push_back(arr[i]); 
     lastnum++; 
    } 
    sort(rnge.begin(), rnge.end()); 
    int bigsmall[2]; 
    bigsmall[1] = rnge[1]; 
    bigsmall[2] = rnge[lastnum]; 
    range = bigsmall[2] - bigsmall[1]; 

    //Outputs 

    cout << "Mean: " << mean << "\nMedian: " << median << "\nRange: " << range; 
    system("cls"); 
    return 0; 
} 
+2

Помимо вопроса, выделенного в ответе ниже, вы фактически не вводите какие-либо значимые значения в свой вектор. Вы выделяете массив arr и немедленно копируете его содержимое (которые неинициализированы) в 'med', а затем продолжайте считывать значения в' arr'. Вы должны полностью избавиться от «arr» и просто использовать вектор. –

+0

В чем смысл создания массива 'bigsmall'? Почему бы просто не использовать две переменные, 'int large, small'? – Barmar

+0

'arr' и' med' полностью разделены. копирование значений из одного в другое не создает ссылку –

ответ

0

У вас есть то, что было бы, если off-by-one errorlastnum инициализировался 0.

Когда rnge пуст, предположительно lastnum is 0. Это означает, что доступ rnge[lastnum] является ошибкой, так как rnge пуст.

Применение индуктивного аргумента показывает, что lastnum - это количество элементов, а не индекс последнего элемента. Таким образом, rnge[lastnum] всегда выходит за пределы допустимого диапазона.

В действительности, вы настроите lastnum к 1, так что ваша ошибка на самом деле вне по-двух.

Смежные вопросы