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

Удаление элемента динамического массива в заданной позициии

27.06.2021, 16:09. Показов 6589. Ответов 18

Студворк — интернет-сервис помощи студентам
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
#include<iostream>
#include<cstdlib>
using namespace std;
void udal(int *&mas, int N){
    int poz;
    cin>>poz;
    if(poz<1){
        int *mas1=NULL;
        mas1= new int[N-1];
        int j=0;
        for(int i=0;i<N-1;i++){
        mas1[j]=mas[i+1];
        j++;    
        }
        delete [] mas;
        mas=mas1;
        N=N-1;
    }
}
int main(){
    int N;
    int start;
    cin>>N>>start;
    int *mas=NULL;
    mas=new int [N];
    srand(start);
    initmas(mas,N);
    printmas(mas,N);
    udal(mas,N);
    printmas(mas,N);
}


подскажите что я делаю е так?
Код должен формировать динамический массив, затем пользователь вводит номер позиции, и если номер меньше единицы, то удаляется передний элемент. Ни как не могу понять как избавиться о мусора в конце массива.
Хотя я выделяю память ровно на одну ячейку меньше инициализированного массива. Откуда там появляется свободная ячейка заполненная мусором?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2021, 16:09
Ответы с готовыми решениями:

Удаление элемента из динамического массива
Здравствуйте! Подскажите, пожалуйста. Имеется вот это: Type TDebtor = Record name: String; debt: Integer; end;...

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

Удаление элемента из динамического массива
Приветствую зашедших! Мне по условию дан динамический массив int элементов, в котором надо уничтожить ПЕРВЫЙ встречный 0. Подскажите, как...

18
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2021, 16:39
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
если номер меньше единицы, то удаляется передний элемент
передний это первый ? если номер больше единицы ? напишите оригинал условия задачи
0
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
27.06.2021, 16:51  [ТС]
Да. Передний это первый (то есть нулевой). Он должен удалиться из массива в том случае если введено значение меньше "1". Там в условии просто много функций должно быть. Вопрос конкретно к этой.
Смысл такой пользователь вводит велечину массива и начальное значение генератора случайных чисел.
инициализируется динамический массив.
Потом пользователь вводит номер индекса массива который нужно удалить и если он меньше единицы то удляется самый первый элемент массива (нулевой).
Например есть массив из пяти чисел 7 8 9 0 6
пользователь вводит номер позиции (индекс) элемента например "0".
В итоге получается 8 9 0 6. Изанимать он лишней памяти не должен.

Добавлено через 1 минуту
Цитата Сообщение от Yetty Посмотреть сообщение
передний это первый ? если номер больше единицы ? напишите оригинал условия задачи
Да. Передний это первый (то есть нулевой). Он должен удалиться из массива в том случае если введено значение меньше "1". Там в условии просто много функций должно быть. Вопрос конкретно к этой.
Смысл такой пользователь вводит велечину массива и начальное значение генератора случайных чисел.
инициализируется динамический массив.
Потом пользователь вводит номер индекса массива который нужно удалить и если он меньше единицы то удляется самый первый элемент массива (нулевой).
Например есть массив из пяти чисел 7 8 9 0 6
пользователь вводит номер позиции (индекс) элемента например "0".
В итоге получается 8 9 0 6. Изанимать он лишней памяти не должен.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2021, 17:21
Mirashikgsgyrdh, я же задал Вам вопрос:
Цитата Сообщение от Yetty Посмотреть сообщение
если номер больше единицы ?
не передавайте условие своими словами, ещё раз предлагаю:
Цитата Сообщение от Yetty Посмотреть сообщение
напишите оригинал условия задачи
0
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
27.06.2021, 17:45  [ТС]
Цитата Сообщение от Yetty Посмотреть сообщение
не передавайте условие своими словами, ещё раз предлагаю:

Сформируйте динамический одномерный массив целых чисел и заполните его случайными числами от -10 до 15. Пользователь вводит количество элементов массива и, через пробел, начальное значение генератора случайных чисел.

Реализуйте функции:

заполнения массива случайными значениями:   void initArray(int *a, int n);

печать массива через пробел: void printArray(int *a, int n);

добавление элемента в массив с заданной позиции (в функции запрашивается номер позиции, начинающийся с 1, а затем значение элемента): void addElement(int *&a, int &n);

        Например, массив был:  4 6 -2 4 8 5

        Пользователь вводит: 3 10 

        Массив в результате: 4 6 10 -2 4 8 5

        Если вводимая позиция больше размера массива, то элемент добавляется в конец. Если номер позиции меньше 1, то элемент добавляется в начало.

        Например, массив был: 2 6 7 8

        Пользователь вводит:  10 3

        Массив в результате: 2 6 7 8 3

        Если массив был: 1 3 5 7 9

        Пользователь вводит: -5 -6

        Массив в результате:  -6 1 3 5 7 9

удаление элемента в заданной позициии, начиная с 1 (в функции запрашивается номер позиции): void delElement(int *&a, int &n);

       Например, массив был: 3 5 7 8 1

       Пользователь вводит: 4

       Массив в результате: 3 5 7 1

       Если вводимый номер позиции меньше 1 или больше размера массива, то массив остается без изменения.

В функции main() реализовано меню для тестирования этих функций, этот код менять нельзя! Для работы с динамической памятью используйте средства языка С++.

Разберем пример теста: 10 7 1 3 12 3 2 1 3 4

10 - исходное число элементов массива

7 - начальное значение генератора случайных чисел

До цикла меню массив инициализируется и выводится:

15 15 9 15 -1 -1 8 -3 -10 7 

1 - выбор меню: вставка элемента

3 - позиция, в которую вставляется элемент

12 - значение элемента

3 - выбор меню: печать массива. После этого распечатывается измененный массив:

15 15 12 9 15 -1 -1 8 -3 -10 7

2 - выбор меню: удаление элемента

1 - позиция удаляемого элемента

3  - выбор меню: печать массива. После этого распечатывается измененный массив:

15 12 9 15 -1 -1 8 -3 -10 7 

4 - выбор меню: окончание программы.

вот полный текст задания

Добавлено через 1 минуту
моя функция это - delElement, та по которой возникли вопросы

Добавлено через 1 минуту
моя функция это - delElement, та по которой возникли вопросы

Добавлено через 7 секунд
моя функция это - delElement, та по которой возникли вопросы

Добавлено через 1 минуту
в условии написано меньше

Добавлено через 1 минуту
Просто неясно почему такое выделение динамической памяти, я же уменьшил на единицу величину массива
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2021, 18:04
Лучший ответ Сообщение было отмечено Mirashikgsgyrdh как решение

Решение

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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void Random (int *&a, int &n)
{
    for (int i = 0; i < n; i++)        
        a[i]=rand()%26 - 10;
}
 
void delElement (int *&a, int &n)
{
    int pos;
    cout << "pos="; cin >> pos;
    
    if(pos>=1 && pos<=n)
    {
        for (int i = pos-1; i < n-1; i++)
            a[i]=a[i+1];
        n--;
    }    
}
 
void Print (int *&a, int &n)
{
    for (int i = 0; i < n; i++)       
        cout << a[i] << " ";    
    cout << "\n";;
}
 
int main()
{
    int n, start;
    cin >> n >> start;
    srand(start);
 
      int *a = new int[n];
 
    Random(a,n);
    Print(a,n);
    delElement(a,n);
    Print(a,n);    
    
    delete[]a;
system("pause");
return 0;
}
0
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
27.06.2021, 18:07  [ТС]
А что не так с моим вариантом, можете пояснить?
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2021, 18:24
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
А что не так с моим вариантом, можете пояснить?
не получается сравнить варианты ? прежде всего не нужен второй массив

то есть при удалении элемента память перевыделять не нужно. при добавлении элемента совсем другой подход - необходимо перевыделять память
1
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
27.06.2021, 18:27  [ТС]
Ну, прежде всего прошу меня извинить, я невнимательно прочел задание.
если меньше единицы и больше размера массива, то массив остается без изменения.
Но все же, если считать что условие все таки существует, меньше 1 или больше размера массива, то как решить эту задачу?
Учитывая что нужно сформировать динамический массив который занимает столько места в памяти сколькл ему не обходимо.
Ведь ввашем решении нет динамического массива.
В любом случае большое спасибо вы и так помогли.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2021, 18:34
Лучший ответ Сообщение было отмечено Mirashikgsgyrdh как решение

Решение

Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
Но все же, если считать что условие все таки существует, меньше 1 или больше размера массива, то как решить эту задачу?
я сбросил Вам решение (именно удаление элемента массива) под условие задачи. в чём состоит Ваш вопрос ?
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
Ведь в вашем решении нет динамического массива
развеселили а если присмотреться ? динамический массив объявляется в строке 38
0
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
27.06.2021, 18:46  [ТС]
простите, долбаная жара!))
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2021, 18:56
Mirashikgsgyrdh, покажите свою реализацию функции void addElement(int *&a, int &n)
0
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
27.06.2021, 19:03  [ТС]
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
void dobav(int *&mas,int &N){
    int vvod, poz;
    cin>>poz>>vvod;
    if(poz<1){
        int *mas1=NULL;
        mas1= new int[N+1];
        int j=1;
        for(int i=0;i<N;i++){
            mas1[j]=mas[i];
            j++;
        }
        mas1[0]=vvod;
        delete [] mas;
        mas=mas1;
        N=N+1;
    }
    if(poz>N){
        int *mas1=NULL;
        mas1=new int [N+1];
        int j=0;
        for(int i=0;i<N;i++){
            mas1[j]=mas[i];
            j++;
        }
        mas1[N]=vvod;
        delete [] mas;
        mas=mas1;
        N=N+1;
    }
    if(poz>=1&&poz<N){
        int *mas1=NULL;
        mas1= new int [N+1];
        int j=0;
        for(int i=0;i<poz;i++){
            mas1[j]=mas[i];
            j++;
        }
        mas1[poz]=vvod;
        j=poz+1;
        for(int i=poz+1;i<N+1;i++){
            mas1[j]=mas[i-1];
            j++;
        }
        delete [] mas;
        mas=mas1;
        N=N+1;
    }
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2021, 19:52
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void initArray(int *a, int n)
{
    for (int i = 0; i < n; i++)        
        a[i]=rand()%26 - 10;
}
 
void addElement(int *&a, int &n)
{
    int pos, value;
    cout << "pos="; cin >> pos;
    cout << "value="; cin >> value;    
    
    n++;
    
    int *new_a = new int[n];    
    
    for (int i = 0; i < n; i++)    
        if (i<pos-1) new_a[i]=a[i];
        else if (i>pos-1) new_a[i]=a[i-1];        
    
    if (pos>n-1) new_a[n-1]=value;
    else if (pos<1) new_a[0]=value;
    else new_a[pos-1]=value;
    
    delete[]a;
    
    a=new_a;
} 
 
void printArray(int *a, int n)
{
    for (int i = 0; i < n; i++)       
        cout << a[i] << " ";    
    cout << "\n";;
}
 
int main()
{
    int n, start;
    cin >> n >> start;
    srand(start);
 
      int *a = new int[n];
 
    initArray(a,n);
    printArray(a,n);
    addElement(a,n);
    printArray(a,n);    
    
    delete[]a;
system("pause");
return 0;
}
Добавлено через 5 минут
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
if(poz>=1&&poz<N)
оба неравенства нестрогие
0
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
28.06.2021, 11:54  [ТС]
Спасибо, согласен. Но я попробовал вашу функцию по удалению и ина вместо того чтобы убирать, просто переписывает следующий элемент в предыдущую ячейку. А размер массива остается прежним.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
28.06.2021, 13:00
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
размер массива остается прежним
опять Вы что-то придумываете что мешает для проверки вывести размер после печати массива ?
C++
1
2
3
4
5
6
Random(a,n);
Print(a,n);
cout << "n=" << n << "\n"; 
delElement(a,n);
Print(a,n);
cout << "n=" << n << "\n";
Добавлено через 18 минут
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
переписывает следующий элемент в предыдущую ячейку
именно так и происходит удаление элемента - последующие элементы сдвигаются налево, после этого размер массива уменьшается на единицу
0
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
28.06.2021, 13:05  [ТС]
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
#include<iostream> 
#include<cstdlib> 
using namespace std;
void initArray(int *a, int n){
for (int i = 0; i < n; i++){
a[i]=rand()%26 - 10;
}
}
void printArray(int *a, int n){
for (int i = 0; i < n; i++){
cout << a[i] << " ";
}
cout << "\n";
}
void udal(int *&mas, int N){
int poz;
cin>>poz;
if(poz>=1&&poz<=N){
int *mas1=NULL;
mas1= new int[N-1];
int j=0;
for(int i=0;i<poz;i++){
mas1[j]=mas[i];
j++;
}
for(int i=poz;i<N-1;i++){
mas1[j]=mas[i+1];
j++;
}
delete [] mas;
mas=mas1;
N=N-1;
}
}
int main(){
int N;
int start;
cin>>N>>start;
int *mas=NULL;
mas=new int [N];
srand(start);
initArray(mas,N);
printArray (mas,N);
udal(mas,N);
printArray(mas,N);
}
Я все таки, если это возможно, прошу вас объяснить что не так с моим кодом. Почему остается последняя ячейка заполненная мусором если я выделил память для этого массива на одну ячейку меньше чем у предыдущего?

Добавлено через 2 минуты
опять Вы что-то придумываете что мешает для проверки вывести размер после печати массива ?


Может я ошибся.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
28.06.2021, 13:18
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
Я все таки, если это возможно, прошу вас объяснить что не так с моим кодом
неинтересно заходить по обсуждению на второй круг. выше уже объяснял что не так:
Цитата Сообщение от Yetty Посмотреть сообщение
прежде всего не нужен второй массив
как делается удаление Вам уже показал
0
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
05.07.2021, 21:24  [ТС]
спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2021, 21:24
Помогаю со студенческими работами здесь

Удаление элемента из динамического массива
Создать и заполнить динамический массив генератором случайных чисел от - 30 до 30. Оформить как функцию все это дело. Вывести данный...

Удаление элемента динамического массива
Привет ребят , пришел я с плюсов , так получилось что срочно надо набыдлокодить проект на Си. Вообще нифига не могу найти , нет ни...

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

Удаление элемента из динамического массива
Как из динамического массива удалить нужный элемент????

Добавление и удаление элемента динамического массива
Подскажите какие существую способы добавления и удалеия элемента одномерного динамического массива(переопределяя размер массива)....


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru