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

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

Войти
Регистрация
Восстановить пароль
 
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
#1

Класс для двумерного динамического массива - C++

13.01.2014, 23:11. Просмотров 377. Ответов 5
Метки нет (Все метки)

Вот написал код для двумерного динамического массива с перегруженым оператором= и +.
Собственно код работает в MS VS 2010, но меня смущает правильность выделения и освобождения памяти, а также конструктор копирования. За написания кода сильно не ругайте)
Профессионалы подскажите что не так, что не хватает.
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class Dinamic_matrix
{
private:
    int **matrix;
    int m;
    int n;
    bool isZero;//выделена ли память для матрици?
public:
    //Конструкторы, деструкторы
    Dinamic_matrix(int x = 3){
        if(x == 0)
        {
            m = n = 0;
            isZero = true;
        }
        else
        {
            m = n = x;
            matrix = new int* [m];
 
            for(int i=0;i<m;i++)
                matrix[i] = new int [n]();// Обнуляется каждая строка в процессе создания
 
            isZero = false;
        }
 
    }
    Dinamic_matrix(int m, int n)
    {
        this->m = m;
        this->n = n;
        isZero = false;
 
        matrix = new int* [m];
 
        for(int i=0;i<m;i++)
            matrix[i] = new int [n]();// Обнуляется каждая строка в процессе создания
    }
    Dinamic_matrix (const Dinamic_matrix &copy){
        this->m = copy.m;
        this->n = copy.n;
        this->isZero = copy.isZero;
 
        matrix = new int* [m];
 
        for(int i=0;i<m;i++)
            matrix[i] = new int [n];
    
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                matrix[i][j] = copy.matrix[i][j];
            }
    }
    ~Dinamic_matrix(){
        for(int i=0;i<m;i++)
            delete [] matrix[i];
        //delete [] matrix; так компилятор ругается
    }
    //Методы класса
    void PrintMatrix(); //Вывод матрици
    int SetMatrix();    //Заполнение матрици
    //Перегруженые операторы
    Dinamic_matrix operator+(const Dinamic_matrix &plus)
    {
        if(this->n == plus.n && this->m == plus.m)//если размеры матриц совпадают
        {
            Dinamic_matrix tmp(this->m,this->n);
            for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                    tmp.matrix[i][j] = this->matrix[i][j] + plus.matrix[i][j];
            return tmp;
        }
 
        else
        if(plus.isZero)//если прибавляем к пустой матрице
        {
            return *this;
        }
 
        else            //если прибавляем пустую матрицу
            if(this->isZero) return plus;
 
        else            //если размеры не совпадают
        {
            Dinamic_matrix rezult(max(this->m,plus.m),max(this->n,plus.n));//создаем матрицу с наибольшими полями из обеих матриц
            int res = 0;
            //****Пример прибавления матриц********
            //  1 2 3       1 2      2 4 3
            //  4 5 6   +   3 4   =  7 9 6 
            //  1 2 3       5 6      6 8 3 
            //              7 8      7 8 0
            //*************************************
 
            for(int i=0;i<rezult.m;i++)
                for(int j=0;j<rezult.n;j++)
                {
                    if(i < this->m && j < this->n)
                    {
                        res = matrix[i][j];
                        if(i < plus.m && j < plus.n)
                            res += plus.matrix[i][j];
                    }
                    else
                    {
                        if(i < plus.m && j < plus.n)
                            res = plus.matrix[i][j];
                        else res = 0;
                    }
                    rezult.matrix[i][j] = res;
                }
            return rezult;
        }
    }
    //**********
    Dinamic_matrix operator=(const Dinamic_matrix &assign)
    {
        if(this == &assign)
            return *this;
 
        if(this->isZero)//если присваиваем пустой матрице
        {
            this->m = assign.m;
            this->n = assign.n;
            this->isZero = false;
 
            matrix = new int* [m];//резервируем новую память
 
            for(int i=0;i<m;i++)
                matrix[i] = new int [n]();
 
 
            for(int i=0;i<this->m;i++)
                for(int j=0;j<this->n;j++)
                    this->matrix[i][j] = assign.matrix[i][j];
            
            return *this;
        }
 
        else
        if(this->m == assign.m && this->n == assign.n)//если размеры матриц совпадают
        {
            for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                    this->matrix[i][j] = assign.matrix[i][j];
            return *this;
        }
 
        else                            //если размеры матриц не совпадают
        {
            for(int i=0;i<this->m;i++)    //освобождаем старую память
                delete [] this->matrix[i];
 
            this->m = assign.m;
            this->n = assign.n;
 
            this->matrix = new int* [m];//резервируем новую память
            for(int i=0;i<m;i++)
                this->matrix[i] = new int [n]();
 
            for(int i=0;i<m;i++)        //присваиваем значения новой матрице
                for(int j=0;j<n;j++)
                    this->matrix[i][j] = assign.matrix[i][j];
 
            return *this;
        }
    }
};
 
void Dinamic_matrix::PrintMatrix()
{
    if(isZero) cout<<"Error! Check your array!\n";
    else
    {
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
                cout<<matrix[i][j]<<" ";
        cout<<endl;
        }
        cout<<endl;
    }
}
 
int Dinamic_matrix::SetMatrix()
{
    if(isZero) 
    {
            cout<<"You cant set zero matrix!\n"; 
            return 1;
    }
    else
    {
        int c=1;
        cout<<"Enter element of matrix "<<m<<" x "<<n<<endl;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                cout<<"Element "<<c<<": ";
                cin>>matrix[i][j];
                c++;
            }
            return 0;
    }
}
 
 
int main()
{
    Dinamic_matrix matrix(3,3), matrix2(4,2), result(2,2);
    matrix.SetMatrix();
    matrix2.SetMatrix();
    result = matrix2 + matrix;
    matrix.PrintMatrix();
    matrix2.PrintMatrix();
    result.PrintMatrix();
 
    getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2014, 23:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс для двумерного динамического массива (C++):

Метод-член класса для создания одномерного массива из отрицательных элементов двумерного динамического массива - C++
Помогите, пожалуйста, нужно разработать метод-член класса для создания одномерного массива из отрицательных элементов двумерного...

Создать класс для реализации динамического массива - C++
Доброго времени суток! Помогите создать класс который реализует динамический массив(с динамическим выделением памяти и перевыделением),...

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

Описать класс для реализации двумерного массива - C++
Хочу сделать класс, который будет описывать поле размером 5х3. Для этого использую вложенные друг в друга векторы. Но при реализации...

Написать класс для динамического массива с проверкой границ (что подразумевают под инициализацией?) - C++
Привет, народ, есть такое задание: 2. написать класс для динамического массива с проверкой границ( аналог std::vector ) +должны...

Поворот динамического двумерного массива - C++
Доброго времени суток. Столкнулся с такой проблемой что не могу развернуть динамический двумерный массив. Результат выводит плачевный: ...

5
AnDrew_LP
160 / 160 / 9
Регистрация: 29.05.2010
Сообщений: 435
13.01.2014, 23:25 #2
C++
1
       //delete [] matrix; так компилятор ругается
Почему ругается? Не должен. Все правильно будет, если добавить эту строку
1
newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 555
13.01.2014, 23:40 #3
Цитата Сообщение от AnDrew_LP Посмотреть сообщение
C++
1
       //delete [] matrix; так компилятор ругается
Почему ругается? Не должен. Все правильно будет, если добавить эту строку
Не ругается

Добавлено через 2 минуты
vozup, хз что вы там в плюсе определяете но википедия подсказывает
Сложение матриц[править | править исходный текст]

Складывать можно только матрицы одинакового размера.

Сложение матриц A+B есть операция нахождения матрицы C , все элементы которой равны попарной сумме всех соответствующих элементов матриц A и B, то есть каждый элемент матрицы C равен
Cij=Aij+Bij;
1
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
13.01.2014, 23:52  [ТС] #4
newb_programmer, это я знаю. Просто для себя сделал такое сложение
0
egor2116
342 / 373 / 42
Регистрация: 20.01.2013
Сообщений: 1,132
14.01.2014, 00:29 #5
А какой будет результат, если
C++
1
2
dinamic_matrix m3(matrix);
m3.PrintMatrix();
0
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
14.01.2014, 21:30  [ТС] #6
egor2116, нужно перегрузить конструктор типа
C++
1
Dinamic_matrix (Dinamic_matrix m);
???
0
14.01.2014, 21:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 21:30
Привет! Вот еще темы с ответами:

Использование динамического двумерного массива - C++
Вот есть такой заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H template&lt;typename TT&gt; ...

Заполнение двумерного динамического массива - C++
Доброго времени суток! Уважаемые коллеги! Второй день пытаюсь разобраться с вводом в char** символов, точнее строки символов. Создал...

Заполнение двумерного динамического массива - C++
int **Create(int size1, int size2) { int **Arr = new int*; for (int i = 0; i &lt; size1; i++) Arr = new int; return Arr; } ...

Заполнение двумерного динамического массива - C++
Объявить и заполнить двумерный динамический массив случайными числами от 10 до 50. Показать его на экран. Для заполнения и показа на экран...


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

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

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