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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Построить последовательность действительных чисел a1,..., an по правилу http://www.cyberforum.ru/cpp-beginners/thread1070688.html
Здравствуйте! Помогите пожалуйста! Дана действительная квадратная матрица порядка n. Построить последовательность действительных чисел a1,...,an по правилу : если в i-й строке матрицы элемент, принадлежащий главной диагонали, отрицателен, то ai равно сумме элементов i-й строки, предшествующих первому отрицательному элементу; в противном случае ai равно сумме последних элементов i-й строки,...
C++ Оператор delete в деструкторе Здравствуйте, нужна помощь, есть класс и функция к которую передается этот класс: #include<iostream> using namespace std; class a { public: a(){f = new char (100);} ~a(){delete f;} http://www.cyberforum.ru/cpp-beginners/thread1070663.html
Функции. Рассчитать значение Y C++
Вычисления по известным формулам C++
Составить программу вычисления значения функции y=\frac{{a}^{2}+10}{\sqrt{{a}^{2}+1}} при любом значении а
C++ Выяснить, сколько раз в тексте встречается введенное с клавиатуры слово. http://www.cyberforum.ru/cpp-beginners/thread1070630.html
Имеется текстовый файл, содержащий некоторое количество строк длиной до 80 символов. Выяснить, сколько раз в тексте встречается введенное с клавиатуры слово.
C++ Написать программу, формирующую из одной строки, содержащей фамилию, имя и отчество строку с фамилией и инициалами Написать программу, формирующую из одной строки, содержащей фамилию, имя и отчество строку с фамилией и инициалами подробнее

Показать сообщение отдельно
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99

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

13.01.2014, 23:11. Просмотров 348. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru