C/C++

C++ добавить элемент, который введет пользователь в одномерный динамический массив

У меня работает не совсем правильно. Как он работает: числом, которое введет пользователь, заменяет то число, которое было изначально. А нужно, чтобы пользователь ввел число и остальные числа сместились вправо. Пример:

Изначальный 4 5 6 7

какое число добавить: 10
куда добавить: 3

Стало: 4 5 10 6 7

Как исправить код?

#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");

int n, i, kakoe, kuda;

cout << "введите размерность\n";

cin >> n;

int* arr = new int[n];

cout << "введите числа\n";

for (i = 0; i < n; i++)

{
cin >> arr[i];
}
cout << "\nвот изначальный массив:\n";

for (i = 0; i < n; i++)

{
cout << arr[i] << ", ";
}

cout << "\nкакое число добавить?\n";
cin >> kakoe;

cout << "\nкуда число по счету добавить?\n";
cin >> kuda;
kuda = kuda - 1;
for (i = kuda; i < n; i++)

{

arr[kuda] = kuda + 1;
arr[kuda] = i++;
arr[kuda] = kakoe;

}
n++;
cout << "\nвот новый массив: \n";
for (i = 0; i < n; i++)
{
cout << arr[i] << ", ";
}
}
Тоже с заказом размерности массива сразу n+1:
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int n, i, kakoe, kuda;
cout << "введите размерность\n";
cin >> n;
int *arr = new int[n + 1];
cout << "введите числа\n";
for (i = 0; i < n; i++) cin >> arr[i];
cout << "вот изначальный массив:\n";
for (i = 0; i < n; i++) cout << arr[i] << "; ";
cout << "\nкакое число добавить?\n";
cin >> kakoe;
cout << "куда число по счету добавить?\n";
cin >> kuda;
kuda = kuda - 1;
for (i = n - 1; i >= kuda; i--) arr[i + 1] = arr[i];
arr[kuda] = kakoe;
cout << "вот новый массив: \n";
for (i = 0; i <= n; i++) cout << arr[i] << "; ";
cout << endl;
cin.get(); cin.get();
}
Виктор Кравченко
Виктор Кравченко
66 572
Лучший ответ
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");

int n, i, kakoe, kuda;

cout << "введите размерность\n";

cin >> n;

int* arr = new int[n+1]; // с запасом на 1 добавляемый

cout << "введите числа\n";

for (i = 0; i < n; i++)

{
cin >> arr[i];
}
cout << "\nвот изначальный массив:\n";

for (i = 0; i < n; i++)

{
cout << arr[i] << " ";
}

cout << "\nкакое число добавить?\n";
cin >> kakoe;

cout << "\nкуда число по счету добавить?\n";
cin >> kuda;
kuda = kuda - 1;

if (kuda >= 0 && kuda <= n)
{
for (int i = n; i >= 0; --i)
{
if (i == kuda)
{
arr[i] = kakoe;
break;
}
arr[i] = arr[i - 1];
}

n++;
cout << "\nвот новый массив: \n";
for (i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
}
else
{
cout << "\nиндекс вне массива";
}
}


Можно добавлять больше на 1 размерности, то бишь в конец, но для в начало вводите 1 позицию
for (i = kuda; i < n; i++)

{

arr[kuda] = kuda + 1; // Ваш цикл берет одну ячейку памяти [kuda], записывает в нее
arr[kuda] = i++; // свой индекс +1, затем в нее же записывает текущий счетчик i,
arr[kuda] = kakoe; // и в конце переписывает в него значение kakoe. И так по кругу.

}
То есть никакой сортировки данных не происходит. Это раз.
Два - динамический массив не увеличивается от того, что вы просто сделали n++. Размер задается только один раз при его формировании, дальнейшее назначение n - только чтобы вы не обращались за его границу, и ограничивали себя. n++ позволит вам обратиться за границу массива что является непредсказуемым. Для увеличения массива вы должны создать новый массив с размером n++, переписать в него данные из старого массива и удалить старый.