0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
1

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

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

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

Вот как-то так. Прошу знающих откликнуться. Заранее спасибо за хотя бы какое-то толкование (или указание направления).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2014, 12:42
Ответы с готовыми решениями:

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

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

Сформировать динамический массив из элементов структурного типа
1.Сформировать динамический массив из элементов структурного типа. struct реrson { char*name;...

Сформировать динамический массив из элементов структурного типа
struct student { char*name; int kurs; float rating };

15
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 13:21 2
вам нужно написать класс динамического массива. разбирайтесь с классами. напишите хотябы для
одного конкретного типа такой массив. потом уже можно будет с произвольным в шаблон такой
класс переделать. на форуме полно таких вопросов и решений тоже.
1
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;
};

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

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

Добавлено через 1 час 13 минут
Попробовал сейчас сделать не двумерный, а простой массив с шаблонами. Все вроде нормально, но когда пытаюсь сделать из него динамический, то вся работа накрывается. Как можно осуществить создание хотя бы одномерного динамического массива через шаблоны?
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
09.01.2014, 19:00 10
Я так и не понял в чем проблема. Вы хотите чтобы программа сама определяла тип введенных данных и создавала соответствующий массив? Или проблема в самом создании шаблонной функции?
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
09.01.2014, 19:10  [ТС] 11
Цитата Сообщение от Arkaniy Посмотреть сообщение
Вы хотите чтобы программа сама определяла тип введенных данных и создавала соответствующий массив?
Да. Проблема скорее в этом, чем в моей криворукости.
Пользователь ввел что-то. Программа определила что это. Подставила необходимый тип. Создался массив (хотя бы одномерный).
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
09.01.2014, 19:16 12
Я сам над этим долго бился, но до конца так и не решил. Нужно записать в стринг, а потом разобрать по элементам и проверить тип каждого. Этот метод полностью охватывает поставленную задачу. Как сделать такой разбор я так и не придумал и оставил только int и doublе, что в моей программе вполне достаточно. Вот как-то так.
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
09.01.2014, 19:36  [ТС] 13
Так как мне тогда лучше поступить? Допустим, взять одномерный массив, тогда придется в вашу прогу добавить только создание динамического массива, чтоб юзер вводил размер... Хотя тоже как-то не клеется.
А может поговнокодить и запилить выбор для каждого из типов? Кода будет в 4 раза больше... И за такое по голове не погладят.
Возникает вопрос: Что делать в данной ситуации?
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
09.01.2014, 21:25 14
Можно сделать так, чтобы пользователь предварительно вводил тип данных. Но это тоже не торт.
Лучший вариант - это конечно, вариант с разбором строки.
Сделайте так, запрашивайте тип данных и размер. И передавайте их в шаблонную функцию. Писать для каждого типа отдельно - это...ну вы знаете)
1
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
09.01.2014, 23:07  [ТС] 15
Цитата Сообщение от Arkaniy Посмотреть сообщение
Сделайте так, запрашивайте тип данных и размер. И передавайте их в шаблонную функцию.
Спасибо. Попробую, если получится, то оставлю, а на нет и суда нет, буду говнокодить.
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 17
13.01.2014, 15:59  [ТС] 16
В общем, "понимающий дуб" растерял все свои "желуди". Ничего у меня не вышло, пришлось наговнокодить 416 строк (9 страниц в Ворде 12 шрифтом Калибри)... Надеюсь, хотя бы тройку поставят, а не заставят переделать. Вот было бы больше времени, может чего и наколдовал бы...
Вот линк на всю работу, может кому-нибудь понадобится и он, не пиная болты, перепишет программу:
http://yadi.sk/d/MapuC_oXFxR7B
Всем спасибо, все свободны
0
13.01.2014, 15:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2014, 15:59
Помогаю со студенческими работами здесь

Динамический массив произвольного размера
динамический массив заданного размера: int *massiv = new int а как организовать произвольного...

Динамический массив типа void
Объявлен двумерный массив в глобальных: void **buf; Размер как и тип определяются в рантайме.....

Двумерный динамический массив типа char
Как создать двумерный динамический массив типа char, в который будут записываться слова разной...

Динамический массив из n чисел типа int.
БИЛЕТ №22 3. Напишите программу, которая выполняет следующие действия: 1) определяет...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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