Удаление массива из пользовательского ввода - PullRequest
0 голосов
/ 12 сентября 2018

Я новичок в C ++ и программировании в целом, и у меня есть групповое назначение для класса. Мы все работали над разными частями, и я должен сделать «удалить» часть программы. Я должен удалить конкретную переменную, которую пользователь спрашивает (если она находится в массиве), а не сдвигать массив вправо. После того, как он делает то, что ему нужно, он «сжимает» массив наполовину.

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

Вот моя часть моего кода:)

else if (option == 'd') {
        cout << "Delete element:" << endl; //Ask user which array position to delete//
        for (int i = 0; i < count; ++i) {

            cout << arr[i]; //print out which array index we have///
            cout << endl;
            int pos; //starts new variable for position///
            cin >> pos;
            if (pos >= 1 && pos <= size) //As long as position is greater than 1 and less than size it loops//
            {
                for (i = pos; i <= size; i++)
                {
                    arr[i - 1] = arr[i];
                }
                arr[size] = 0;
                cout << "Elements now:" << endl;
                for
                    (i = 0; i <= size; i++)
                    cout << arr[i] << endl;
            }
            else
                cout << "Element doesn't exist" << endl; //Tells user it doesn't exist if the position doesn't exist//

Так что, если я добавлю элемент, такой как 2, он покажет, что 2 находится в массиве. Я ввожу 2 на вход, и это дает мне

Elements now: 2 -33686019 0

Извините, если это сбивает с толку! Я пытаюсь учиться сам. Спасибо за ваше терпение!

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Предположим, что:

  1. arr - массив фиксированного размера.
  2. size на самом деле переменная, в которой хранится количество «используемых» элементов массива.
  3. ваша политика ввода принимает индексы, начинающиеся с 1, поэтому arr[0] соответствует вводу pos = 1.

Есть несколько проблем с этой частью:

            for (i = pos; i <= size; i++)
            {
                arr[i - 1] = arr[i];
            }
            arr[size] = 0;

Во-первых, если размер равен размеру массива, вы получите неопределенное поведение, потому что arr [size] не существует Вот где вы получаете странные значения, они являются результатом попытки чтения вне границ массива. Это неопределенное поведение.

Через секунду после смещения массива вы должны уменьшить размер, если не хотите печатать «неиспользуемые» элементы.

for (int i = pos-1; ++i < size;  ) 
// array should stop when i < size, but increment happens at beginning of loop. 
{
     arr[i-1] = arr[i];
}
arr[size-1] = 0;  // set last element to zero
size--;           
0 голосов
/ 13 сентября 2018

Вы пропустили объявление arr

0 голосов
/ 12 сентября 2018

Кажется, проблема вызвана путаницей в индексах массива. В C ++ массивы начинаются с 0, поэтому допустимые индексы для массива размера n равны 0,1, ..., n - 1. Для этого есть веские причины, и как только вы становитесь опытным программистом, это становится второй натурой, но раздражающие пользователи настаивают при подсчете от 1 и так для пользователей допустимыми индексами массива размера n являются 1,2, ..., n.

Лучший способ избежать путаницы - это преобразовывать пользовательские индексы в индексы C ++ непосредственно при вводе (или непосредственно перед выводом). Таким образом, большая часть вашего кода использует схему индексации C ++ (достаточно разумно, поскольку это программа C ++).

Применяя это к коду выше, вы получаете

int pos;
cin >> pos;
--pos; // convert from user indexes to C++ indexes
if (pos >= 0 && pos < size) // C++ indexes
{
    for (i = pos + 1; i < size; i++) // C++ indexes
    {
        arr[i - 1] = arr[i];
    }
    --size; // array is now smaller
    cout << "Elements now:" << endl;
    for (i = 0; i < size; i++) // C++ indexes
        cout << arr[i] << endl;
}
else
    cout << "Element doesn't exist" << endl;

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

...