Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 73, средняя оценка - 4.79
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
#1

Добавление элемента в начало динамического массива - C++

02.04.2012, 01:28. Просмотров 9946. Ответов 16
Метки нет (Все метки)

Господа подскажите пожалуйста ошибку в коде. Не верно работает добавление нового элемента в начало динамического массива. Не могу допетрить как это сделать. Вот код

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// выводится меню -  добавть, удалить, вывести.
// работает с дин мас.
// открывается доп меню - добавть в конец, в начало, в середину
//
 
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
void Show (int *arr, int Size)
{
    cout<<"New mas: ";
    for (int i=0; i<Size; i++)
    {
        cout<<arr[i]<<" ";
    }
    getch();
}
 
void main ()
{
 
    int size=0;
    int *mas=new int[size];
    if (size==0)
    {
        cout<<"Mas  empty\n";
        cout<<"Enter first element of mas: ";
        cin>>mas[0];
        size++;
    }
    system("cls");
 
    int n;
 
    do
    {
        system("cls");
        cout<<"Show mas             - 1\n";
        cout<<"Add elem to mas      - 2\n";
        cout<<"Delete elem from mas - 3\n";
        cout<<"Exit mas             - 0\n";
        cin>>n;
 
        switch(n)
        {
        case 1:
                Show (mas, size);
            break;
        case 2:
            cout<<endl;
            cout<<"Add elem to end of mas    - 1\n";
            cout<<"Add elem to begin of mas  - 2\n";
            cout<<"Add elem to middle of mas - 3\n";
            cin>>n;
 
            if (n==1)
            {
                cout<<endl;
                cout<<"Enter element: ";
                cin>>mas[size++];
                Show (mas, size);
            }
// добавление элемента в динамический массив
            if(n==2)
            {
                int *temp=new int[size++];
                for (int i=0; i<size; i++)
                {
                    temp[i+1]=mas[i];
                }
                
                cout<<"Enter element: ";
                cin>>temp[0];
                mas=temp;
                
                Show (mas, size);                           
            }
        
            if(n==3)
            {
 
            }
            break;
        case 3:
            delete [] mas;
            exit(0); 
            break;
        default:
            cout<<"Sorry, error!!! Try agan\n";
            getch();
        }
 
    }
    while(n!=0);
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2012, 01:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Добавление элемента в начало динамического массива (C++):

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

Добавление элемента в конец динамического массива! - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;malloc.h&gt; using namespace std; int main() { int i, key, n, amountRem,...

Добавление элемента в начало массива - C++
Есть два массива, например (1,2,3,4,5) и (0,0,5,5,5), нужно превратить их в (0,1,2,3,4,5) и в (0,0,0,5,5,5), не знаю как реализовать. ...

Добавление динамического элемента в статический массив - C++
в продолжение этой темы. если создам статический массив ECM a; мне нужно в него добавить седьмой элемент, нужна подсказка.

Добавить элементы в начало динамического массива - C++
Доброго дня,мне нужна помощь с задачей по динамичным массивам. Суть задания:для начала нужно сформировать динамичный массив и заполнить...

Добавление элемента в начало списка - C++
Проблема в том, что выводит 100, 9. Почему не выводит промежуточные значения - не понятно. Вроде бы не должен. #include &lt;stdio.h&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,667
Записей в блоге: 17
02.04.2012, 02:05 #2
C++
1
2
3
4
5
6
7
8
int size=0;
int *mas=new int[size];
if (size==0)
    {
        cout<<"Mas  empty\n";
        cout<<"Enter first element of mas: ";
        cin>>mas[0]; // !!!
//...
А почему размер массива равен нулю? Че эт за массив без элементов?
0
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
03.04.2012, 01:29  [ТС] #3
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int size=0;
int *mas=new int[size];
if (size==0)
    {
        cout<<"Mas  empty\n";
        cout<<"Enter first element of mas: ";
        cin>>mas[0]; // !!!
//...
А почему размер массива равен нулю? Че эт за массив без элементов?
а что массив обязательно должен содержать элементы. Их можно потом добавить

Добавлено через 1 минуту
Ребята, а кто-нибудь может подсказать по поводу добавления элементов в начало динамического массива и что в моем коде не верно? Зарание спасибо
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,667
Записей в блоге: 17
03.04.2012, 01:31 #4
а что массив обязательно должен содержать элементы. Их можно потом добавить
Не в C++;
В С++ для этого есть std::vector<T>, std::list<T> другие контейнеры STL
0
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
03.04.2012, 01:38  [ТС] #5
Цитата Сообщение от Avazart Посмотреть сообщение
Не в C++;
В С++ для этого есть std::vector<T>, std::list<T> другие контейнеры STL

векторые еще не учил, разбираюсь с динамическими массивами. Вы можете подсказать по моему вопросу
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,667
Записей в блоге: 17
03.04.2012, 01:58 #6
Размер массива менять нельзя нужно сразу указывать нужное кол-во при объявлении.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
03.04.2012, 02:07 #7
Если хочешь сделать самостоятельно динамический массив с добавлениями, это вполне хорошее упражнение и, конечно имеет право на существование. Всё-таки не очень честно использовать вектора, не разобравшись как выделяется/удаляется память в простых динамических массивах. Так что не слушай советчиков. Контроль памяти это одна из важнейших вещей при программировании на C

Так вот эта память у тебя течёт. У тебя в коде это однозначно вызывает утечку
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *temp=new int[size++];
                for (int i=0; i<size; i++)
                {
                    temp[i+1]=mas[i];
                }
               //сохранил старый mas в расширенном новом куске памяти, массиве
                // А после копирования данных в этот кусок
//ОБЯЗАТЕЛЬНО  освободи её из старого
                  delete[] mas;//!!!!!
                cout<<"Enter element: ";
                cin>>temp[0];
                mas=temp;
А вообще продвинутые менеджеры памяти выделяют кусок не по одному элементу, а с большим запасом на N элементов. Подумай над этим.
например
C++
1
2
3
const int CHUNK_SIZE=50;
size+=CHUNK_SIZE;
int *temp=new int[size];
Я где-то слышал, что стандартные вектора используют какой-то хитрый алгоритм определения размера добавляемого куска. Они то ли с каждым разом в два раза больше добавляют, то ли ещё что
1
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
03.04.2012, 02:19  [ТС] #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Если хочешь сделать самостоятельно динамический массив с добавлениями, это вполне хорошее упражнение и, конечно имеет право на существование. Всё-таки не очень честно использовать вектора, не разобравшись как выделяется/удаляется память в простых динамических массивах. Так что не слушай советчиков. Контроль памяти это одна из важнейших вещей при программировании на C

Так вот эта память у тебя течёт. У тебя в коде это однозначно вызывает утечку
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *temp=new int[size++];
                for (int i=0; i<size; i++)
                {
                    temp[i+1]=mas[i];
                }
               //сохранил старый mas в расширенном новом куске памяти, массиве
                // А после копирования данных в этот кусок
//ОБЯЗАТЕЛЬНО  освободи её из старого
                  delete[] mas;//!!!!!
                cout<<"Enter element: ";
                cin>>temp[0];
                mas=temp;
А вообще продвинутые менеджеры памяти выделяют кусок не по одному элементу, а с большим запасом на N элементов. Подумай над этим.
например
C++
1
2
3
const int CHUNK_SIZE=50;
size+=CHUNK_SIZE;
int *temp=new int[size];
Я где-то слышал, что стандартные вектора используют какой-то хитрый алгоритм определения размера добавляемого куска. Они то ли с каждым разом в два раза больше добавляют, то ли ещё что
Спасибо, буду разбираться
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,667
Записей в блоге: 17
03.04.2012, 02:53 #9
Вообще тут задача не совсем корректна и надо говорить не о прототипе вектора а о прототипе листа(списка) или дека та как добавлять элементы надо в начало, а не в конец.

А копировать элементы из массива в массив каждый раз когда надо добавить новый элемент это как-то не очень...
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
03.04.2012, 03:23 #10
Цитата Сообщение от Avazart Посмотреть сообщение
А копировать элементы из массива в массив каждый раз когда надо добавить новый элемент это как-то не очень...
А что поделаешь? Массивы предоставляют уникальную возможность обращаться к любому случайно выбранному элементу за одинаковое минимальное время. А также располагать все элементы друг за другом в одном куске памяти. Согласись, это весьма ценные свойства. Так что всему своё применение: в стандартной библиотеке есть vector, а есть list - и необходимость возникает бывает то в одном, то в другом. Собственно в теме мы обсуждаем самодельный аналог вектора. Чем же он, vector, бесполезен? Ты же на это намекаешь?
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,667
Записей в блоге: 17
03.04.2012, 03:59 #11
Я намекаю на то что задание не продуманное и совсем не на динамические массивы.
Понятно если бы изучались классы или очереди/стеки, а так это только запутывание студента.
0
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
04.04.2012, 01:32  [ТС] #12
Ребята я допетрил как добавить элемент в начало динамического массива и у меня заработало (решение ниже). Правда это у меня получилось через грамоздко: через поэлеметную перезапись из одного массива в другой. А задача стояла чтобы это сделать через смену указателей Кто-то может подсказать как это можно сделать
Всем спасибо, кто проникся моим вопросом и не оставил без внимания

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
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
void Show (int *arr, int Size)
{
    cout<<"New mas: ";
    for (int i=0; i<Size; i++)
    {
        cout<<arr[i]<<" ";
    }
    getch();
}
 
void main ()
{
 
    int size=0;
    int *mas=new int[size];
    if (size==0)
    {
        cout<<"Mas  empty\n";
        cout<<"Enter first element of mas: ";
        size++;
        cin>>mas[0];
 
    }
                int *temp=new int[size+1];
 
                cout<<"Enter element: ";
                cin>>temp[0];
 
                for (int i=0; i<size; i++)
                {
                    temp[i+1]=mas[i];
                }
                size++;
                for (int i=0; i<size; i++)
                {
                    mas[i]=temp[i];
                }
                Show (mas, size);  
                delete [] temp;
            
 
    delete [] mas;
}
Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Я намекаю на то что задание не продуманное и совсем не на динамические массивы.
Понятно если бы изучались классы или очереди/стеки, а так это только запутывание студента.
Задание конечно до конца не продумано. Но суть зад аниянаучиться работать с динамической памятью и указателями
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,667
Записей в блоге: 17
04.04.2012, 02:28 #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//...
cout<<"Enter element: ";
cin>>temp[0];
 
for (int i=0; i<size; i++)
  {
  temp[i+1]=mas[i];
  }
size++;
 
delete [] mas; // удаляем старый массив
mas = temp // теперь mas указывает на новое расположение нового массива
Show (mas, size);
                          
delete [] mas;//temp удалять не надо так как это тот же mas
//...
2
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.04.2012, 02:32 #14
Цитата Сообщение от geka83 Посмотреть сообщение
int *temp=new int[size++];
Размер выделится как и на старый массив. Так как инкремент постфиксный. То есть сначала выделится память под size, а потом только size увеличится на 1. Стоит исправить на ++size.
Ой не увидел последний код автора Там исправлено
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
04.04.2012, 03:15 #15
Цитата Сообщение от Avazart Посмотреть сообщение
// удаляем старый массив
// теперь mas указывает на новое расположение нового массива
Плюсую Avazart, в последнем коде ТС ошибка всё равно присутствовала.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2012, 03:15
Привет! Вот еще темы с ответами:

Добавление элемента в начало односвязного списка - C++
Здравствуйте, я не где не могу найти функцию по добавлению элемента в начало односвязного списка. Пожалуйста подскажите ее.

Реализовать функционал работы с одномерным динамическим массивом (добавление одного элемента в начало) - C++
Реализовать функционал работы с одномерным динамическим массивом. Возникла проблема с добавлением элемента. Буду признательна за...

Добавление элементов в начало массива - C++
Нужно добавить некоторое количество элементов в начало массива. Проблема заключается в том, что в результате лезет мусор. Я так...

добавление К элементов в начало массива - C++
Есть такой код #include &lt;vcl.h&gt; #pragma hdrstop #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream.h&gt; #define MSIZE...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.04.2012, 03:15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru