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

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2012, 01:28
Ответы с готовыми решениями:

Добавление чисел Фибоначчи в начало динамического массива
Доброго времени суток, товарищи программисты. В общем, нужно с помощью calloс создать одномерный...

Добавление элемента в конец динамического массива
Не понимаю почему у меня не выходит данный код (еще только учусь) void pushBack(int* arr, int*...

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

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

16
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
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
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.04.2012, 01:31 4
а что массив обязательно должен содержать элементы. Их можно потом добавить
Не в C++;
В С++ для этого есть std::vector<T>, std::list<T> другие контейнеры STL
0
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
03.04.2012, 01:38  [ТС] 5
Цитата Сообщение от Avazart Посмотреть сообщение
Не в C++;
В С++ для этого есть std::vector<T>, std::list<T> другие контейнеры STL

векторые еще не учил, разбираюсь с динамическими массивами. Вы можете подсказать по моему вопросу
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.04.2012, 01:58 6
Размер массива менять нельзя нужно сразу указывать нужное кол-во при объявлении.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.04.2012, 02:53 9
Вообще тут задача не совсем корректна и надо говорить не о прототипе вектора а о прототипе листа(списка) или дека та как добавлять элементы надо в начало, а не в конец.

А копировать элементы из массива в массив каждый раз когда надо добавить новый элемент это как-то не очень...
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
03.04.2012, 03:23 10
Цитата Сообщение от Avazart Посмотреть сообщение
А копировать элементы из массива в массив каждый раз когда надо добавить новый элемент это как-то не очень...
А что поделаешь? Массивы предоставляют уникальную возможность обращаться к любому случайно выбранному элементу за одинаковое минимальное время. А также располагать все элементы друг за другом в одном куске памяти. Согласись, это весьма ценные свойства. Так что всему своё применение: в стандартной библиотеке есть vector, а есть list - и необходимость возникает бывает то в одном, то в другом. Собственно в теме мы обсуждаем самодельный аналог вектора. Чем же он, vector, бесполезен? Ты же на это намекаешь?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.04.2012, 03:59 11
Я намекаю на то что задание не продуманное и совсем не на динамические массивы.
Понятно если бы изучались классы или очереди/стеки, а так это только запутывание студента.
0
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
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
//...
3
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
04.04.2012, 02:32 14
Цитата Сообщение от geka83 Посмотреть сообщение
int *temp=new int[size++];
Размер выделится как и на старый массив. Так как инкремент постфиксный. То есть сначала выделится память под size, а потом только size увеличится на 1. Стоит исправить на ++size.
Ой не увидел последний код автора Там исправлено
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.04.2012, 03:15 15
Цитата Сообщение от Avazart Посмотреть сообщение
// удаляем старый массив
// теперь mas указывает на новое расположение нового массива
Плюсую Avazart, в последнем коде ТС ошибка всё равно присутствовала.
0
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
04.04.2012, 23:20  [ТС] 16
Цитата Сообщение от Avazart Посмотреть сообщение
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
//...
Avazart , попробовал твой вариант, но почему-то после ввода элемента cin>>temp[0]; ничего не происходит. Т.е. и не печатает новый массив и не выдает ни какой ошибки, просто курсор мигает в консоли и все.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.04.2012, 23:32 17
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
using namespace std;
 
void Show (int *arr, int Size)
{
cout<<"New mas: ";
for (int i=0; i<Size; i++) cout<<arr[i]<<" ";
cout<<endl;
}
//---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
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++;
 
delete [] mas; // удаляем старый массив
mas = temp; // теперь mas указывает на новое расположение нового массива
Show (mas, size);
 
delete [] mas;//temp удалять не надо так как это тот же mas
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
У меня нормально работает.
Миниатюры
Добавление элемента в начало динамического массива  
0
04.04.2012, 23:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2012, 23:32
Помогаю со студенческими работами здесь

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

Списки. Инициализация, добавление элемента в начало и после другого элемента. Удаление элемента
uses crt; type list= ^item; item=record data: integer; next:list; end; var l:list;...

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru