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

Динамический массив элементов произвольного типа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
08.01.2014, 12:42     Динамический массив элементов произвольного типа #1
Доброго времени суток. Будьте так добры, если вас не затруднит, помочь "понимающему дубу" с одной назойливой программкой.
Создать программу, реализующую класс «динамический массив элементов произвольного типа» без использования стандартной библиотеки C++. Предусмотреть возможность добавления, удаления элементов в любую часть массива.
С динамическим массивом я разобрался, а вот как записать в него элементы произвольного типа - понятия не имею. Думаю, что с удалением/добавлением у меня трудностей не возникнет, хоть и суть классов я не совсем понял.
Ниже предоставлю код, что я уже написал (без классов и с изменением элементов):
Кликните здесь для просмотра всего текста
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
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <conio.h>
#include <ctime>
#include <iostream>
using namespace std;
int main()
{   setlocale(LC_ALL, "");
    srand(time(0));
    int i, j, row, col, M, N, **Array;
    cout << "Введите размер массива Array[M][N]: " << endl;
    cout << "M = "; cin >> M;
    cout << "N = "; cin >> N;
    Array = new int *[M];
    for (i = 0; i < M; i++)
        Array[i] = new int[N];
    cout << "Array [" << M << "][" << N << "]" << endl; 
    cout << "Array: " << endl;
    for (i = 0; i<M; i++)
    {   for (j = 0; j<N; j++)
        {   Array[i][j] = rand() % 100 - 49;
            printf("%5d", Array[i][j]);
        }   cout << endl;
    }   cout << endl << endl;
    //-------------Меню-------------------
    for (;;)
    {   cout << endl;
        cout << "Нажмите <1> для изменения элемента массива" << endl;
        cout << "Введите <0> для выхода из меню" << endl;
        int num = 0;
        cin >> num;
        if (num == 1)
        {   cout << "Введите элемент Array[row][col], который хотите изменить:" << endl;
            cout << "row = "; cin >> row;
            cout << "col = "; cin >> col;
            cout << "Array[" << row << "][" << col << "] = "; cin >> Array[row - 1][col - 1];
            cout << endl;
            for (i = 0; i < M; i++)
            {   for (j = 0; j < N; j++)
                {   printf("%5d", Array[i][j]);
                }
                cout << endl;
            }
        }   if (num == 0)
        {return 0;}
    }
    //---------------------------------------
    for (i = 0; i < M; i++)
        delete[] Array[i];
    delete[] Array;
    printf("\nPress Any Key To Exit...");
    _getch();
}

Вот как-то так. Прошу знающих откликнуться. Заранее спасибо за хотя бы какое-то толкование (или указание направления).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 13:21     Динамический массив элементов произвольного типа #2
вам нужно написать класс динамического массива. разбирайтесь с классами. напишите хотябы для
одного конкретного типа такой массив. потом уже можно будет с произвольным в шаблон такой
класс переделать. на форуме полно таких вопросов и решений тоже.
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
09.01.2014, 01:10  [ТС]     Динамический массив элементов произвольного типа #3
Цитата Сообщение от DU Посмотреть сообщение
напишите хотябы для одного конкретного типа такой массив.
Спасибо, попробую.

Добавлено через 10 часов 22 минуты
Вот, что у меня получилось:
Кликните здесь для просмотра всего текста
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
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <conio.h>
#include <ctime>
#include <iostream>
using namespace std;
 
class DynamicArray
{
public:
    int i, j, row, col, M, N, **Array;
    void Random();
    void Print();
    void Change();
    void MemFree();
    void Enter();
};
 
int main()
{
    setlocale(LC_ALL, "");
    srand(time(0));
    DynamicArray Arr;
    //-------------Меню-------------------
    for (;;)
    {   
        cout << "------------------------" << endl;
        cout << "Введите <1> для случайного задания массива" << endl;
        cout << "Введите <2> для ручного задания массива" << endl;
        cout << "Введите <3> для изменения элемента массива" << endl;
        cout << "Введите <0> для выхода из меню" << endl;
        cout << "------------------------" << endl;
        int num = 0;
        cin >> num;
        cout << endl;
        if (num == 3)
        {
            Arr.Change();
        }
        if (num == 1)
        {
            Arr.Random();
        }
        if (num == 2)
        {
            Arr.Enter();
        }
        if (num == 0)
        {
            return 0;
        }
    }
    
    //---------------------------------------
 
    Arr.MemFree();
    printf("\nPress Any Key To Exit...");
    _getch();
}
 
void DynamicArray::Print()
{
    cout << "Массив: " << endl;
    for (i = 0; i < M; i++)
    {
        for (j = 0; j < N; j++)
        {
            printf("%5d", Array[i][j]);
        }
        cout << endl;
    }
    cout << endl;
};
 
void DynamicArray::Random()
{
    cout << "Введите размер массива Array[M][N]: " << endl;
    cout << "M = "; cin >> M;
    cout << "N = "; cin >> N;
    Array = new int *[M];
    for (i = 0; i < M; i++)
        Array[i] = new int[N];
    cout << "Array[" << M << "][" << N << "]" << endl;
    for (i = 0; i < M; i++)
    {
        for (j = 0; j < N; j++)
        {
            Array[i][j] = rand() % 100 - 49;
        }
    }
    cout << endl;
    DynamicArray::Print();
};
 
void DynamicArray::Change()
{
    cout << "Введите элемент Array[row][col], который хотите изменить:" << endl;
    cout << "row = "; cin >> row;
    cout << "col = "; cin >> col;
    cout << "Array[" << row << "][" << col << "] = "; cin >> Array[row - 1][col - 1];
    cout << endl;
    DynamicArray::Print();
};
 
void DynamicArray::Enter()
{
    cout << "Введите размер массива Array[M][N]: " << endl;
    cout << "M = "; cin >> M;
    cout << "N = "; cin >> N;
    Array = new int *[M];
    for (i = 0; i < M; i++)
        Array[i] = new int[N];
    cout << "Array[" << M << "][" << N << "]" << endl << endl;
    cout << "Введите элементы массива: " << endl;
    for (i = 0; i<M; i++)
    {
        for (j = 0; j<N; j++)
        {
            cout << "Array[" << i+1 << "][" << j+1 << "] = ";
            cin >> Array[i][j];
        }
        cout << endl;
    }
    DynamicArray::Print();
};
 
void DynamicArray::MemFree()
{
    for (i = 0; i < M; i++)
        delete[] Array[i];
    delete[] Array;
};

Я не совсем понял, зачем использовать конструкторы и деструкторы, если они создаются автоматом при компиляции.
Так вот, просьба подсказать, что необходимо сделать дальше. И вообще, правильно ли я сделал эту часть. Если нет, то объясните, пожалуйста, что именно нужно изменить.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
09.01.2014, 01:30     Динамический массив элементов произвольного типа #4
Mehanik511, конструкторы используются для выполнения каких-либо действий при создании объекта. В Вашей программе при создании объекта не выполняется ничего, под него просто выделяется память.
Если размеры известны заранее, то можно написать конструктор с 2 параметрами и в теле конструктора прописать создание массива и заполнение нулями. Это просто пример использования конструктора.
Деструкторы используются для освобождения памяти из под объектов.
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
09.01.2014, 01:53  [ТС]     Динамический массив элементов произвольного типа #5
И еще, не могли бы вы дать линк с понятным объяснением процесса создания шаблонов. Где не почитаю, сначала понятно, а как перехожу к примерам, то становится все хуже...

Добавлено через 2 минуты
Цитата Сообщение от Arkaniy Посмотреть сообщение
Это просто пример.
Если честно, я это понимаю в теории, но на деле что-то не очень.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
09.01.2014, 02:55     Динамический массив элементов произвольного типа #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
class A
{
public:
    int i;
    A() {}
    A(int param)
    {
        i=param;
    }
};
int main()
{
    A a(15);
    A b;
    cout<<a.i<<endl<<b.i<<endl;
    system("pause");
}
Вот пример класса с двумя конструкторами. Первый объект создается через конструктор с параметром, второй -без. Скопируй и посмотри, что выведет на экран.
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
09.01.2014, 16:35  [ТС]     Динамический массив элементов произвольного типа #7
Неужели нет никого, кто дал бы пояснение по использованию шаблона в моей программе?
LuxArt
33 / 20 / 2
Регистрация: 14.11.2013
Сообщений: 85
09.01.2014, 17:22     Динамический массив элементов произвольного типа #8
Mehanik511,

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
#include <iostream>
#include <stdlib.h>
 
class DynamicArray
{
private:
    void *arr[10];
    static int s1;
 
public:
    template<typename T>
    void Add(T value)
    {
        arr[s1++] = new T(value);
    }
 
    template<typename T>
    void Print(int i)
    {
        std::cout << *((T *)(arr[i])) << ' ';
    }
};
 
int DynamicArray::s1 = 0;
 
int main(int argc, char *argv[])
{
    DynamicArray arr1;
 
    arr1.Add(10);
    arr1.Add(3.14);
    arr1.Add('a');
    arr1.Add("String");
 
    arr1.Print<int>(0);
    arr1.Print<double>(1);
    arr1.Print<char>(2);
    arr1.Print<char*>(3);
 
    system("pause");
    return 0;
}
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
09.01.2014, 18:57  [ТС]     Динамический массив элементов произвольного типа #9
LuxArt,
Прям магия какая-то... А как так же можно сделать, чтобы пользователь сам вводил элементы массива, как в моем случае?
И еще, что за "0", "1", "2", "3" мы передаем в Print? Номер элемента? Аналогичный вопрос: как сделать, чтобы все это автоматически выбиралось? Т.е. ввел пользователь в массив (а он у меня двумерный) некоторые целые числа, числа с плав.точкой, символы и строки, а потом при вызове функции Print вывелся весь массив, не зависимо от типа элемента.
Я вот больше с этим мучаюсь, нежели с обычным вводом/выводом элементов поочередно. Уже мозг кипит от этого всего.

Добавлено через 1 час 13 минут
Попробовал сейчас сделать не двумерный, а простой массив с шаблонами. Все вроде нормально, но когда пытаюсь сделать из него динамический, то вся работа накрывается. Как можно осуществить создание хотя бы одномерного динамического массива через шаблоны?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
09.01.2014, 19:00     Динамический массив элементов произвольного типа #10
Я так и не понял в чем проблема. Вы хотите чтобы программа сама определяла тип введенных данных и создавала соответствующий массив? Или проблема в самом создании шаблонной функции?
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
09.01.2014, 19:10  [ТС]     Динамический массив элементов произвольного типа #11
Цитата Сообщение от Arkaniy Посмотреть сообщение
Вы хотите чтобы программа сама определяла тип введенных данных и создавала соответствующий массив?
Да. Проблема скорее в этом, чем в моей криворукости.
Пользователь ввел что-то. Программа определила что это. Подставила необходимый тип. Создался массив (хотя бы одномерный).
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
09.01.2014, 19:16     Динамический массив элементов произвольного типа #12
Я сам над этим долго бился, но до конца так и не решил. Нужно записать в стринг, а потом разобрать по элементам и проверить тип каждого. Этот метод полностью охватывает поставленную задачу. Как сделать такой разбор я так и не придумал и оставил только int и doublе, что в моей программе вполне достаточно. Вот как-то так.
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
09.01.2014, 19:36  [ТС]     Динамический массив элементов произвольного типа #13
Так как мне тогда лучше поступить? Допустим, взять одномерный массив, тогда придется в вашу прогу добавить только создание динамического массива, чтоб юзер вводил размер... Хотя тоже как-то не клеется.
А может поговнокодить и запилить выбор для каждого из типов? Кода будет в 4 раза больше... И за такое по голове не погладят.
Возникает вопрос: Что делать в данной ситуации?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
09.01.2014, 21:25     Динамический массив элементов произвольного типа #14
Можно сделать так, чтобы пользователь предварительно вводил тип данных. Но это тоже не торт.
Лучший вариант - это конечно, вариант с разбором строки.
Сделайте так, запрашивайте тип данных и размер. И передавайте их в шаблонную функцию. Писать для каждого типа отдельно - это...ну вы знаете)
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
09.01.2014, 23:07  [ТС]     Динамический массив элементов произвольного типа #15
Цитата Сообщение от Arkaniy Посмотреть сообщение
Сделайте так, запрашивайте тип данных и размер. И передавайте их в шаблонную функцию.
Спасибо. Попробую, если получится, то оставлю, а на нет и суда нет, буду говнокодить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2014, 15:59     Динамический массив элементов произвольного типа
Еще ссылки по теме:

C++ Динамический массив из элементов структурного типа
C++ Сформировать динамический массив из элементов структурного типа
Создать динамический массив целого типа C++

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

Или воспользуйтесь поиском по форуму:
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
13.01.2014, 15:59  [ТС]     Динамический массив элементов произвольного типа #16
В общем, "понимающий дуб" растерял все свои "желуди". Ничего у меня не вышло, пришлось наговнокодить 416 строк (9 страниц в Ворде 12 шрифтом Калибри)... Надеюсь, хотя бы тройку поставят, а не заставят переделать. Вот было бы больше времени, может чего и наколдовал бы...
Вот линк на всю работу, может кому-нибудь понадобится и он, не пиная болты, перепишет программу:
http://yadi.sk/d/MapuC_oXFxR7B
Всем спасибо, все свободны
Yandex
Объявления
13.01.2014, 15:59     Динамический массив элементов произвольного типа
Ответ Создать тему
Опции темы

Текущее время: 02:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru