[Turbo C++ 3.0] Пишу элементарнейшую прогу. Работа с матрицами (плюс, умножение, транспонирование). В процедуре транспонирования, которая выдает неверный результат, проявляется странный баг. Когда изменяешь один элемент матрицы (2*2), изменяются сразу два эл-та. Например: было | должно стать | но получилось 3 0 3 0 1 0 3 0 1 0 1 0 Или еще такой баг: ввел матрицу в созданный объект класса Matrica, потом скопировал её в другой объект (operator =), потом вывожу, а выводится ахинея. Не просто ахинея, а похожая, на то, что вводилось. Исходник: | Код | #include <iostream.h> #include <string.h> #include <conio.h>
class Matrica { private: public: int **m; int size;
Matrica() {}; Matrica(const int); ~Matrica();
void SetSize(int);
void operator=(const Matrica &);
void Print() const; };
void Plus(Matrica &C, const Matrica A, const Matrica B) { for (int i = 0; i < C.size; i++) for (int j = 0; j < C.size; j++) C.m[i][j] = A.m[i][j] + B.m[i][j];
}
void Multiply(Matrica &C, const Matrica A, const Matrica B) { int r; for (int i = 0; i < C.size; i++) for (int j = 0; j < C.size; j++) { r = 0; for (int k = 0; k < C.size; k++) r = r + A.m[i][k] * B.m[k][j]; C.m[i][j] = r; } } /* const Matrica Transpose(const Matrica C) { Matrica t(C.size); for (int i = 0; i < C.size; i++) for (int j = 0; j < C.size; j++) t.m[i][j] = C.m[j][i]; return t; } */
void Transpose(Matrica &C) { Matrica t(C.size); for (int i = 0; i < C.size; i++) for (int j = 0; j < C.size; j++) { t.m[i][j] = C.m[j][i]; } for (i = 0; i < C.size; i++) for (j = 0; j < C.size; j++) { C.m[i][j] = t.m[i][j]; } }
Matrica::Matrica(const int sz) { size = sz; m = new int*[size];
for (int i = 0; i < size; i++) m[i] = new int[size]; };
Matrica::~Matrica() { for (int i = 0; i < size; i++) delete [] m[i];
delete [] m; };
void Matrica::SetSize(int ns) { size = ns; m = new int*[size];
for (int i = 0; i < size; i++) m[i] = new int[size]; }
void Matrica::operator=(const Matrica &M) { for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) m[i][j] = M.m[i][j]; }
void Matrica::Print() const { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) cout << m[i][j] << " "; cout << "\n"; } }
int k, n; Matrica m[6];
void main() { clrscr(); cout << "Enter number of matrices (1-6) k = "; cin >> k; cout << "Enter matrix size (2-4) n = "; cin >> n;
for (int f = 0; f < k; f++) { m[f].SetSize(n); cout << "\nEnter " << f << "-nth matrix:\n"; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << "[" << j+1 << ", " << i+1 << "] = "; cin >> m[f].m[i][j]; } } }
Matrica r(n), t(n), tmp(n), tmp2(n); t = m[0]; cout << "m(0) = \n"; t.Print(); Transpose(t); cout << "m(0)t = \n"; t.Print(); Multiply(r, m[0], t); cout << "m(0)*m(0)t = \n"; r.Print();
for (f = 1; f < k; f++) { t = m[f]; cout << "m(" << f << ") = \n"; t.Print();
Transpose(t); cout << "m(" << f << ")t = \n"; t.Print();
Multiply(tmp, m[f], t); cout << "m(" << f << ")*m(" << f << ")t = \n"; t.Print();
tmp2 = r; Plus(r, tmp2, tmp); cout << "r = \n"; r.Print(); }
cout << "\nResult:\n"; r.Print();
cin >> f;
} |
|