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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
#1

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

08.01.2014, 12:42. Просмотров 1255. Ответов 15
Метки нет (Все метки)

Доброго времени суток. Будьте так добры, если вас не затруднит, помочь "понимающему дубу" с одной назойливой программкой.
Создать программу, реализующую класс «динамический массив элементов произвольного типа» без использования стандартной библиотеки 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();
}

Вот как-то так. Прошу знающих откликнуться. Заранее спасибо за хотя бы какое-то толкование (или указание направления).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2014, 12:42     Динамический массив элементов произвольного типа
Посмотрите здесь:
C++ Динамический массив из элементов структурного типа
Динамический массив из элементов структурного типа C++
C++ Сформировать динамический массив из элементов структурного типа
Сформировать динамический массив из элементов структурного типа C++
Динамический массив произвольного размера C++
Динамический массив типа void C++
C++ Трехмерный динамический массив типа char
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 13:21     Динамический массив элементов произвольного типа #2
вам нужно написать класс динамического массива. разбирайтесь с классами. напишите хотябы для
одного конкретного типа такой массив. потом уже можно будет с произвольным в шаблон такой
класс переделать. на форуме полно таких вопросов и решений тоже.
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
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
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
09.01.2014, 01:30     Динамический массив элементов произвольного типа #4
Mehanik511, конструкторы используются для выполнения каких-либо действий при создании объекта. В Вашей программе при создании объекта не выполняется ничего, под него просто выделяется память.
Если размеры известны заранее, то можно написать конструктор с 2 параметрами и в теле конструктора прописать создание массива и заполнение нулями. Это просто пример использования конструктора.
Деструкторы используются для освобождения памяти из под объектов.
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
09.01.2014, 01:53  [ТС]     Динамический массив элементов произвольного типа #5
И еще, не могли бы вы дать линк с понятным объяснением процесса создания шаблонов. Где не почитаю, сначала понятно, а как перехожу к примерам, то становится все хуже...

Добавлено через 2 минуты
Цитата Сообщение от Arkaniy Посмотреть сообщение
Это просто пример.
Если честно, я это понимаю в теории, но на деле что-то не очень.
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
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
Сообщений: 17
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
Сообщений: 17
09.01.2014, 18:57  [ТС]     Динамический массив элементов произвольного типа #9
LuxArt,
Прям магия какая-то... А как так же можно сделать, чтобы пользователь сам вводил элементы массива, как в моем случае?
И еще, что за "0", "1", "2", "3" мы передаем в Print? Номер элемента? Аналогичный вопрос: как сделать, чтобы все это автоматически выбиралось? Т.е. ввел пользователь в массив (а он у меня двумерный) некоторые целые числа, числа с плав.точкой, символы и строки, а потом при вызове функции Print вывелся весь массив, не зависимо от типа элемента.
Я вот больше с этим мучаюсь, нежели с обычным вводом/выводом элементов поочередно. Уже мозг кипит от этого всего.

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

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

Или воспользуйтесь поиском по форуму:
Mehanik511
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
09.01.2014, 23:07  [ТС]     Динамический массив элементов произвольного типа #15
Цитата Сообщение от Arkaniy Посмотреть сообщение
Сделайте так, запрашивайте тип данных и размер. И передавайте их в шаблонную функцию.
Спасибо. Попробую, если получится, то оставлю, а на нет и суда нет, буду говнокодить.
Yandex
Объявления
09.01.2014, 23:07     Динамический массив элементов произвольного типа
Ответ Создать тему
Опции темы

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