Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/55: Рейтинг темы: голосов - 55, средняя оценка - 4.87
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685

Вставка элемента в середину массива, в начало и в конец

14.02.2018, 17:28. Показов 11277. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал для начала массива и конца, а в средину не пойму как вставить, теоретически понимаю что 2 цикла идти должно до элемента куда надо ставить значение и после а как написать не пойму
мой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "stdafx.h"
#include <iostream>
using namespace std;
 
void Zmass(int *const arr, const int size)
{
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
    }
}
 
void show(const int*const arr, const int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << arr[i] << "\t";
    }
    cout << endl;
}
void dobav(int *&arr, int &size, const int value)//   указатель на ссылку подменяет адрес массивва где который мы будем передавать, размер массива который будет изменяться, число которое будет добалено в массив.
{
    
    int *newarr = new int[size + 1];
    for (int i = 0; i < size; i++)
    {
        newarr[i] = arr[i]; 
    }
    newarr[size] = value;
    size++;
    delete[]arr;
    arr = newarr;
}
 
void deletelem(int *&arr, int &size)
{
    size--;
    int *newarr = new int[size];
    for (int i = 0; i < size; i++)
    {
        newarr[i] = arr[i];
    }
    delete[]arr;
    arr = newarr;
}
 
void dobavnachalo(int *&arr, int &size, const int value)//   указатель на ссылку подменяет адрес массивва где который мы будем передавать, размер массива который будет изменяться, число которое будет добалено в массив.
{
 
    int *newarr = new int[size + 1];
    for (int i = 0; i < size; i++)
    {
        newarr[i + 1] = arr[i]; // добавил элемент в начало  массива
    }
    newarr[0] = value;
    size++; // отображает конечный элемен массива если он естть т.е. число 25
    delete[]arr;
    arr = newarr;
}
 
 
int main()
{
    int size = 5;
    int *arr = new int[size];
 
    Zmass(arr, size);
 
    show(arr, size);
 
    dobav(arr, size, 25);
 
    show(arr, size);
 
    dobavnachalo(arr, size, 13);
    show(arr, size);
 
    deletelem(arr, size);
    show(arr, size);
 
    delete[]arr;
    return 0;
}
кто что подсказать может?

Добавлено через 5 минут
Коментарии для себя писал не обращайте внимание ))

Добавлено через 43 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void dobavsr(int *&arr, int &size, const int value)//   указатель на ссылку подменяет адрес массивва где который мы будем передавать, размер массива который будет изменяться, число которое будет добалено в массив.
{
 
    int *newarr = new int[size + 1];
    for (int i = 0; i < size / 2; i++)
    {
        newarr[i] = arr[i];
 
    }
    newarr[size / 2] = value;
    for(int i=value ;i<size; i++)
    {
        newarr[i] = arr[i];
    }
    /*size++;*/
    delete[]arr;
    arr = newarr;
}
вот сделал первый массив добавил элемент, но не пойму как дописать остальные элементы в массив
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2018, 17:28
Ответы с готовыми решениями:

Вставка элемента в середину массива
Дело вот в чем. У меня есть массив структур. У всех есть поле &quot;id&quot; - 1,2,4,5,6,7,8 Мне надо в середину ставить еще одну структуру с id -...

Вставка элемента в середину массива
есть массив состоящий из 10 интов 12 85 66 12 44 0 0 0 0 0 как вставить новый элемент(напр. 25) на вторую позицию при этом остальные...

Как добавить элементы в конец, начало, середину list?
list&lt;int&gt; m;

14
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.02.2018, 17:56
Esso11, сложно сказать как вставить в середину массива с нечётным количеством элементов, поэтому
набросал для любой позиции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
using namespace std;
 
void InputShow (int *arr, int n)
{
    for (int i = 0; i < n; i++)
    {
        arr[i] = rand() % 10;
        cout << arr[i] << " ";
    }
    cout << endl;
}
    
void Add(int *arr, int *newarr, int n, int val, int poz)
{    
    for (int i = 0; i < poz-1; i++)    
    newarr[i] = arr[i]; 
    newarr[poz-1]=val;
    for (int i = poz-1; i < n+1; i++)    
    newarr[i+1] = arr[i];
    arr = newarr;
    for (int i = 0; i < n+1; i++)
    cout <<arr[i]<<" ";
    cout << endl;
}
    
void AddStart(int *arr, int *newarr, int n, int val)
{
    newarr[0] = val;
    for (int i = 0; i < n; i++)
    newarr[i+1] = arr[i];        
    arr = newarr;
    for (int i = 0; i < n+1; i++)
    cout <<arr[i]<<" "; 
    cout << endl;
} 
    
void AddEnd (int *arr, int *newarr, int n, int val)
{
    newarr[n] = val;
    for (int i = 0; i < n; i++)
    newarr[i] = arr[i];
    arr = newarr;
    for (int i = 0; i < n+1; i++)
    cout <<arr[i]<<" ";
    cout << endl;
}
 
int main()
{
    int n, val, poz;
    cout <<"Enter n: "; cin >>n;
    cout <<"Enter val: "; cin >>val;
    cout <<"Enter poz: "; cin >>poz;
    int *arr = new int[n];
    int *newarr = new int[n+1];  
    InputShow (arr, n); 
    AddStart(arr, newarr, n, val);
    AddEnd(arr, newarr, n, val); 
    Add(arr, newarr, n, val, poz); 
    delete[]arr;
    delete[]newarr;
    system("pause");
    return 0;
}
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
14.02.2018, 18:02  [ТС]
Yetty, я вот почти доделал, но у меня проблема во втором цикле почему то не могу переписать последние 3 элемента массива в новый массив
void dobavsr(int *&arr, int &size, const int value)// указатель на ссылку подменяет адрес массивва где который мы будем передавать, размер массива который будет изменяться, число которое будет добалено в массив.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
 
    int *newarr = new int[size + 1];
    for (int i = 0; i < size / 2; i++)
    {
        newarr[i] = arr[i];
 
    }
    newarr[size / 2] = value;
    for(int i=value ;i<size; i++)
    {
        newarr[i] = arr[i];
    }
    /*size++;*/
    delete[]arr;
    arr = newarr;
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.02.2018, 18:20
Esso11, пытался Вам объяснить что вставить дополнительный элемент в середину массива с нечётным количеством элементов нельзя принципиально, так что вряд ли смогу Вам помочь
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
14.02.2018, 18:25  [ТС]
Yetty, почему, если поделить массив пополам оно определит элемент 3 как средину туда мы вписываем число просто потом итерацию как мне возобновить у меня не получается просто мусор там (((
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
14.02.2018, 18:42
Esso11,
C++
1
2
3
4
5
6
7
8
9
int* insert(int *first, int *last, int value)
{
  const std::size_t n = last - first, center = (n + 1)  / 2;
  int *ans = new int[n + 1];
  std::copy(first, first + center, ans);
  ans[center] = value;
  std::copy(first + center + 1, last, ans + center + 1);
  return ans;
}
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
14.02.2018, 18:51  [ТС]
outoftime, а что не правильно в моем коде точнее в функции с вставкой по середине? не подскажите?

Добавлено через 56 секунд
outoftime, просто если честно вашу запись я не понимаю

Добавлено через 5 минут
std::copy(first + center + 1, last, ans + center + 1); - эту строчку не понял ....
А как это записать в цикл?)
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
14.02.2018, 18:59
Цитата Сообщение от outoftime Посмотреть сообщение
std::copy(first + center + 1, last, ans + center + 1)
Тут начинать надо с first + center

Цитата Сообщение от Esso11 Посмотреть сообщение
просто если честно вашу запись я не понимаю
Ок

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <algorithm>
 
int *insert(int *first, int *last, int value)
{
    const std::size_t n = last - first, // узнали размер переданного участка
                      center = (n + 1) / 2; // узнали индекс центрального элемента
    int *ans = new int[n + 1]; // создали новый массив на 1 элемент больше
    std::copy(first, first + center, ans); // скопировали первую половину исходного массива
    ans[center] = value; // добавили центральный элемент
    std::copy(first + center, last, ans + center + 1); // скопировали 2ю часть
    return ans; // вернули окончательный результат
}
 
int main()
{
    int *a = new int[4]{1, 2, 4, 5};
    int *b = insert(a, a + 4, 3); // вставили 3 между 2 и 4
    for (std::size_t i = 0; i < 5; ++i)
        std::cout << b[i] << " ";
    std::cout << std::endl;
}
http://ru.cppreference.com/w/cpp/algorithm/copy документация по std::copy
http://ru.cppreference.com/w/cpp/types/size_t тоже по std::size_t
1
 Аватар для Michail97
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 384
14.02.2018, 19:01
Либо тупая перестановка, либо из сишки знаю memmove для перекрывающихся блоков. В плюсах, может, есть получше способ
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
14.02.2018, 19:05
Цитата Сообщение от Esso11 Посмотреть сообщение
std::copy(first + center + 1, last, ans + center + 1); - эту строчку не понял
std::copy принимает 3 параметра:
1. начало последовательности откуда копировать
2. конец последовательности (когда остановиться)
3. начало последовательности куда копировать

Параметрами могут быть указатели либо итераторы которые поддерживают операцию разименования operator* и инкрементирования operator++

Добавлено через 1 минуту
Цитата Сообщение от Michail97 Посмотреть сообщение
В плюсах, может, есть получше способ
Самому интерессно узнать что может быть лучше.
1
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
14.02.2018, 19:17  [ТС]
outoftime, вы как всегда на высоте, спасибо большое
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
14.02.2018, 19:28
давно делал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <class T>
void addElement(T *&arr, int &size, int indexForAdd, T value)
{
    T *temp = new T[size+1];
 
    temp[indexForAdd] = value;
    memcpy(temp, arr, sizeof(T)*indexForAdd);
    memcpy(temp+indexForAdd+1, arr+indexForAdd, sizeof(T)*(size - indexForAdd));
 
    delete[] arr;
    size++;
    arr = temp;
}
 
int main()
{
    int n = 5;
    int *a = new int[n];
    /*...*/
    addElement(a,n,5, 99);
 
    for(int i=0; i<n; i++) std::cout << a[i] << " "; //!! n оно тоже меняет !!
 
    delete [] a;
1
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
14.02.2018, 20:13  [ТС]
Herji, а можно комментарий к вашему варианту? Интересный способ
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
14.02.2018, 20:38
Цитата Сообщение от Esso11 Посмотреть сообщение
а можно комментарий к вашему варианту? Интересный способ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
void addElement(T *&arr, int &size, int indexForAdd, T value)
{
    T *temp = new T[size+1]; // выделяем память под size+1 элементов
 
    temp[indexForAdd] = value; // задаем значение нового элемента
    memcpy(temp, arr, sizeof(T)*indexForAdd); // копируем из исходного массива всё что "до" нового элемента
    memcpy(temp+indexForAdd+1, arr+indexForAdd, sizeof(T)*(size - indexForAdd)); // и что "после"
 
    delete[] arr; // освобождаем память от исходного массива
    size++; /* увеличиваем переменную, в которой хранится размер массива;
                тут, конечно, некий рудимент, оставшийся от подобного для двумерных массивов -
                начиналось всё с них - чтобы не путаться при освобождении памяти (там
                нужен размер для этого)
            */
    arr = temp; // указатель исходного массива теперь тычет в выделенную в этой ф-ии память
}
1
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.02.2018, 20:41
Цитата Сообщение от Esso11 Посмотреть сообщение
Yetty, почему, если поделить массив пополам оно определит элемент 3 как средину
Esso11, Вам нужно вставить элемент или заменить ? если заменить - не нужно никаких дополнительных массивов - заменяете элемент 3 в исходном массиве и всё.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2018, 20:41
Помогаю со студенческими работами здесь

Возможна ли вставка новой записи в середину таблицы, а не добавление в конец?
Существует таблица - поле Счетчик и Текстовое поле (которое имеет хаотичные значение и сортировка его не имеет смысла). Записи отражаются в...

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

Вставка элемента в середину и поиск по списку
Хеееелп! В с++ я шарю плохо. Есть прога, работающая со списком (код почти весь стырен), но идет только добавление в конец и начало списка....

Удаление элемента и вставка в середину динамического связного списка
Добрый день. Помогите, пожалуйста, реализовать метод вставки в середину списка и удаление по принципу &quot;после такого-то элемента&quot; ...

2 Стека / 2 очереди. Вставка в середину пропущенного элемента арифметической прогрессии
Добрый день, форумчане! Нужно решить задачу, используя 2 стека или же 2 очереди (вставка элемента в произвольное место). Хочется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru