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

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

Войти
Регистрация
Восстановить пароль
 
Ocean1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 27
#1

Сделать массив расширяемым - C++

03.07.2015, 23:18. Просмотров 241. Ответов 7
Метки нет (Все метки)

Никак не получается сделать динамический массив расширяемым , помогите пожалуйста, где,что не так?
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include<iostream>
using namespace std;
 
class myVector
{
 int *arr, size,var,count;
public:
    myVector(int s=5):var(0), size(s), count(0)
    {
        arr=new int[size];
        
        }
    ~myVector()
    {
        if (arr) delete[]arr;
    }
    void addEnd(int x);
    void addFirst(int x);
    void addIndex(int x, int pos);
    void show();
};
void myVector::addEnd(int x)
{
 
    if (count>=size)
    {
        int *temp=new int[size];
        for(int i=0;i<=count;i++)
            temp[i]=arr[i];
        delete []arr;
        size=2*size;
        arr=new int[size];
        for (int i=0;i<=count;i++)
            arr[i]=temp[i];
        arr[count+1]=x;
        count ++;
        delete []temp;
}
    else 
    {
        arr[count+1]=x;
count ++;
    }
}
void myVector::addFirst(int x)
{
    if (count<size)
    {
        int *temp=new int[size];
        temp[0]=x;
        for (int i=0;i<=count;i++)
            temp[i+1]=arr[i];
        
        for (int i=0;i<=count+1;i++)
            arr[i]=temp[i];
        count++;
        delete []temp;
    }
    else
    {
        size=size*2;
        int *temp=new int[size];
        temp[0]=x;
        for(int i=0;i<=count;i++)
        temp[i+1]=arr[i];
        delete []arr;
        arr=new int[size];
        for(int i=0;i<=count+1;i++)
            arr[i]=temp[i];
        count++;
        delete []temp;
 
 
    }
}
void myVector::addIndex(int x, int pos)
{
    if (count<size)
    {
        int *temp=new int[size];
        for (int i=0;i<pos;i++)
            temp[i]=arr[i];
        
        for(int i=pos;i<=count;i++)
            temp[i+1]=arr[i];
        temp[pos]=x;
        for (int i=0;i<=count+1;i++)
            arr[i]=temp[i];
        count++;
        delete []temp;
        }
    else
    {
        size=2*size;
        int *temp=new int[size];
        temp [pos]=x;
        for (int i=0;i<pos;i++)
            temp[i]=arr[i];
        for(int i=pos;i<=count;i++)
            temp[i+1]=arr[i];
        delete []arr;
        arr=new int[size];
        for (int i=0;i<=count+1;i++)
            arr[i]=temp[i];
        count++;
        delete []temp;
 
    }
}
void myVector::show()
{
    for(int i=1; i<=count;i++)
    {
        cout<<arr[i]<<" ";
 
    }
    cout<<endl;
}
 
int main()
{
    setlocale( LC_ALL,"Russian" );
    myVector arr;
    int pos, c,x;
    
    while(true)
    {
    cout<<"выберите действие"<<endl<<"1.добавить элемент в конец"<<endl<<"2.добавить элемент в начало"<<endl<<"3.добавить элемент в середину с указанием индекса"<<endl;
    cout<<"0.вывести на экран"<<endl;
    cin>>c;
    switch(c)
    {
    case 1:
        {
            cout<<"введите добавляемый элемент"<<endl;
                cin>>x;
            arr.addEnd(x);
            break;
        }
    case 2:
        {
            cout<<"введите добавляемый элемент"<<endl;
            cin>>x;
            arr.addFirst(x);
            break;
        }
    case 3:
        {
            cout<<"укажите позицию добавляемого элемента"<<endl;
            cin>>pos;
            cout<<"введите добавляемый элемент"<<endl;
            cin>>x;
            arr.addIndex(x,pos);
            break;
        }
    case 0:
        {
            arr.show();
            break;
        }
    default:
        exit(1);
    }
    }
 
 
system("pause");
return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 23:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сделать массив расширяемым (C++):

Есть массив одинаковых элементов, сделать функцию делающую массив различных - C++
Дан одномерный массив, среди элементов которого есть совпадающие. Разработать функцию, создающую массив из различных элементов.

Файлы и массив (сделать так, чтобы массив заполнялся значениями из этого же файла) - C++
Здравствуйте.Помогите пожалуйста с задачкой.Я сделал так что бы массив выводился в файл.Каждый элемент массива выводится на новую строку в...

Дан массив из прототипов функций или указателей на функцию, сделать функцию, возвращающую этот массив - C++
Не охота создавать лишнею тему извиняюсь заранее Вопрос такой Можете подсказать есть массив из прототипов функций или...

пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки. - C++
В файле input.txt находится неизвестное количество вещественных чисел в интервале . Выцапарать их оттуда, отсортировать по убыванию модуля...

из строки сделать массив - C++
Как можно мою строку превратить в массив символов и работать с ней дальше? void main() { int i.m; char a = 12234; // как из нее...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,080
Завершенные тесты: 2
04.07.2015, 00:02 #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
#include <string> // Обязательно для подключения
 
int main()
{
    int lenght = 0;
    
    int* arr = new int[lenght];
 
    lenght = 10;
 
    for (int i = 0; i < lenght; i ++)
    {
        arr[i] = 3;
    }
 
    lenght = 15;
 
    for (int i = lenght - 5; i < lenght; i ++)
    {
        arr[i] = 10;
    }
 
    for (int i = 0; i < lenght; i ++)
    {
        printf("%d", arr[i]);
    }
 
    return 0;
}
0
Ocean1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 27
04.07.2015, 00:12  [ТС] #3
спасибо конечно,но это не то
0
Etien
21 / 21 / 0
Регистрация: 26.01.2014
Сообщений: 182
04.07.2015, 00:28 #4
Извини, у тебя там почти 200 строк текста. Осилить не просто.
Но когда-то доводилось формировать массивы по количеству принимаемых чисел. Ничего лучшего не придумал, как заказать динамический массив в один байт, прочитать в него число. Если следующее чтение снова давало число, то заказываю массив в два байта, копирую старый массив в новый, освобождаю старый, а в последной элемент нового загоняю новое прочитанное число. Так продолжаю пока идут данные. Как только финиш - подсчитываю размер получившегося массива и пользуюсь им.
Естественно, если ты получаешь свои данные не побайтно, то и массив запрашиваешь такой, какой тебе нужно. И шаг наращивания тоже.
Всегда твой - Etien
0
ThePlague
101 / 101 / 61
Регистрация: 30.06.2015
Сообщений: 272
04.07.2015, 00:48 #5
Ocean1, мельком глянул ваш код, у вас должна вылетать ошибка памяти "хип-баффера" после 5го элемента. Так как вы резервируете баффер под 5 элементов.

C++
1
myVector(int s=5):var(0), size(s), count(0)
Добавлено через 9 минут
Мой совет вызывать стандартный конструктор так:

C++
1
myVector(): var(0), count(0), arr(NULL), size(0){}
А уже патом не посредственно в функциях определять объекту нужный размер!
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
04.07.2015, 00:56 #6
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
class my_vector
{
public:
    ~my_vector(){free(_data);}
 
    int capacity()const{return _capacity;}
    int size()const{return _size;}
    int*data(){return _data;}
    const int*data()const{return _data;}
 
    void push_back(int value){insert(size(),value);}
    void push_front(int value){insert(0,value);}
    void insert(int pos,int value);
private:
    int _capacity=0,_size=0;
    int*_data=0;
};
 
void my_vector::insert(int pos,int value)
{
    if(size()==capacity())
    {
        _capacity=_capacity?_capacity*2:2;
        _data=(int*)realloc(_data,sizeof(int)*_capacity);
    }
    memmove(data()+pos+1,data()+pos,sizeof(int)*(size()-pos));
    data()[pos]=value;
    ++_size;
}
0
Ocean1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 27
04.07.2015, 00:59  [ТС] #7
да, я понимаю, что когда элементов больше 5 ,то вылетает с ошибкой, но по сути в функции добавления у меня реализовано увеличение размера массива в 2 раза: если элементов становится больше,чем сам размер, то создаю временный массив в него копирую текущий, удаляю текущий, увеличиваю размер в два раза, определяю текущий с новым размером, копирую элементы временного туда + новый элемент, временный удаляю, но почему этого не происходит не могу понять почему... каким тогда задать изначальный размер в конструкторе?
0
ThePlague
101 / 101 / 61
Регистрация: 30.06.2015
Сообщений: 272
04.07.2015, 01:41 #8
В стандартном конструкторе как я уже написал выше.
Если хотите при создании объекта иметь возможность указывать величину массива, тогда напишите еще один конструктор с передаваемым параметром размера!

Примерно так:

C++
1
2
3
4
5
myVector(int size)
{
this->size = size;
this->arr = new int[size];
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2015, 01:41
Привет! Вот еще темы с ответами:

Как сделать массив классов? - C++
Привет, помогите разобраться, что здесь не так, в чём ошибка? Можно ли делать массив классов, и можно ли пример его роботы, буду...

Как сделать двумерный массив - C++
Доброго времени суток. Допустим с клавиатуры вводятся 25 значений. Как их записать в двумерный массив(чтоб матрица образовалась?. Помогите...

Как массив сделать динамическим? - C++
нужно массив char street сделать динамическим.помогите пожалуйста( #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Как сделать указатель на массив - C++
Здрасти. Как мне сделать указатель на массив: string stud= {{&quot;49000&quot;, &quot;Eddy&quot;, &quot;Vedder&quot;, &quot;dzienne&quot;, &quot;19&quot;}, {&quot;49001&quot;, &quot;Roger&quot;,...


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

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

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