2016-02-24 3 views
2

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

У меня должен быть массив, который инициализирован на 2 элемента, но поскольку пользователь вводит больше чисел, он будет постоянно расширяться на 2 элемента с помощью оператора , пока пользователь не войдет в «-1».

Хотя у меня есть кодирование, позволяющее массиву расти, results are disappointing, когда программа затем обрабатывает массив, чтобы вернуть разность между наименьшим числом в массиве и каждым другим числом. Единственный намек, который мне дал: «Когда вы меняете емкость, вы не копируете исходный массив в новый». Однако я не уверен, что с этим делать.

Подсказка в правильном направлении была бы принята с благодарностью.

#include <iostream> 

using namespace std; 

int main(){ 

int *ptr; //pointer to array 
int capacity = 2; //capactity of array 
int size = 0;  //how many ints recorded in array 
ptr = new int[capacity]; 
int tmp = 0; 

int *numArray = new int[capacity]; 

while (true){ 
    cout << "Enter a number: "; 
    int num; 
    cin >> num; 
    if (num == -1) break; 
    if (size == capacity){ 
     int *temp = new int[capacity + 2]; 
     capacity += 2; 
     delete[]ptr; 
     ptr = temp; 
    } 
    ptr[size++] = num; 
} 

int smallest = numArray[0]; 

// Code to process array and look for smallest number 
for (int i = 0; i < capacity; i++){ 
    if (numArray[i] < smallest){ 
     smallest = numArray[i]; 
    } 
} 

cout << endl << "The smallest number in the array is: " << smallest << endl << endl; 

for (int i = 0; i < capacity; i++){ 
    int difference = numArray[i] - smallest; 
    cout << "The difference between " << numArray[i] << " and the smallest number in the array is : " << difference << endl; 
} 

system("pause"); 
} 
+0

Для дальнейшего использования, эта цитата вводит в заблуждение: «При изменении емкости, вы не копировать из исходного массива в новый.» Не был уверен, что это была * инструкция * задания или просто наблюдение. –

+0

@ColinBasnett - Вероятно, я должен был объяснить, что это был намек, который дал человек, который смотрел на мой код. Упс. –

ответ

3

В этом кусочке кода

if (size == capacity){ 
    int *temp = new int[capacity + 2]; 
    capacity += 2; 
    delete[]ptr; 
    ptr = temp; 
} 

Вы создаете новый массив, но не копировать существующие массивы содержимого в нем.

Добавьте следующую строку сразу после создания массива

for (int i = 0; i < capacity ; ++i) temp[i] = ptr[i]; 

Когда идут делать расчеты вы будете иметь введенные значения в массиве.

В качестве альтернативы смотреть в std::vector

+0

Да, но это, кажется, противоречит (несколько нечетному) намеку, который дал ОП. – zdan

+0

@zdan - комментарий может быть прочитан как заявление о текущем поведении –

+0

К сожалению, мне было запрещено использовать векторы. Я реализовал предложенную вами линию (и заменил все numArray [i] на ptr [i], который, я уверен, я узнаю, был ошибкой), и пока он читает все числа, которые НЕ-1 правильно , он включает в себя -1 в массиве, придавая ему значение «-842150451» и просто испортит размер массива, а уравнения –