| Код |
#include <iostream> #include <math.h> #include <conio.h> #include <fstream> #include <stdio.h> #include <iomanip> #include <windows.h> #include <iostream> using namespace std; int det(long double**, int);
void zapolnenie1(long double **a, int n) { cout << "Исходная матрица:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = rand() % 30; // Каждый элемент случайному числу от 0 до 9 cout << a[i][j] << " "; // Вывести элементы на консольку } cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли } } void zapolnenie2(long double **a, int n) { cout << "Исходная матрица:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << "a[" << i << "][" << j << "]: "; cin >> a[i][j]; // Каждый элемент случайному числу от 0 до 9 } cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли } } void zapolnenie3(long double **a, int n) { for (int i = 0; i < n; i++) { for (int j = n; j < n * 2; j++) { if (i == j - n) a[i][j] = 1; // Каждый элемент случайному числу от 0 до 9 else a[i][j] = 0; } cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли }
} long double** minor(int z, int x, int n, long double **a) { long double **C = new long double*[n - 1]; for (int i = 0; i < n - 1; i++) { C[i] = new long double[n - 1]; } for (int h = 0, i = 0; i < n - 1; i++, h++) { if (i == z) h++; for (int k = 0, j = 0; j < n - 1; j++, k++) { if (k == x) k++; C[i][j] = a[h][k]; } } return C; } long double det(int n, long double **a) { long double sum = 0; if (n != 2) for (int i = 0; i < n; i++) sum += pow((-1), (i + 2))*a[0][i] * det(n - 1, minor(0, i, n, a)); else sum = a[0][0] * a[n - 1][n - 1] - a[n - 1][0] * a[0][n - 1]; return sum; } void ggg(long double **a, int n) { int ii = 0, d, i, j, g, q, r; cout << endl; long double gg; for (int i = 0; i < n - 1; i++) {
if (a[i][ii] == 0) for (d = 0; d < n * 2; d++) { g = (int)a[i][d]; a[i][d] = a[i + 1][d]; a[i + 1][d] = g; } ii++; }
if (a[n - 1][n - 1] == 0) { for (r = 0; r < n; r++) if (a[r][r] != 0 && a[r][n - 1] != 0) break; for (d = 0; d < n * 2; d++) { g = (int)a[d][r]; a[d][r] = a[d][n - 1]; a[d][n - 1] = g; } }
for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { gg = a[i][j]; for (q = j; q < n * 2; q++) { a[i][q] = a[i][q] / gg; }
if (i != n - 1) { for (d = i + 1; d < n; d++) { gg = a[d][j]; for (g = j; g < n * 2; g++) {
a[d][g] = a[d][g] - a[i][g] * gg; }
} }
}
} } for (int f = n; f < n; f++) a[n - 1][f] = a[n - 1][f] / a[n - 1][n - 1]; a[n - 1][n - 1] = 1; for (i = n - 1; i >= 0; i--) { for (j = n - 1; j >= 0; j--) { if (i == j) {
if (i != 0) { for (d = i - 1; d >= 0; d--) { gg = a[d][j]; for (g = 2 * n - 1; g > i - 1; g--) { a[d][g] = a[d][g] - a[i][g] * gg; }
} }
} } }
} void vivod(long double **a, int n) { cout << "Обратная матрица:" << endl; int i, j; for (i = 0; i < n; i++) { for (j = n; j < n * 2; j++) { cout << a[i][j] << "\t"; } cout << endl; } cout << endl; }
int mnozim(int n, long double **a, long double **b){ long double **D = new long double *[n]; for (int i = 0; i < n; i++) { D[i] = new long double[n]; }
cout << endl << "Умножаем матрицы:" << endl; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { D[i][j] = 0; for (int r = 0; r < n; r++) { D[i][j] += b[i][r] * a[r][j]; if (r == n - 1) { cout << b[i][r] * a[r][j] << " = "; } else { cout << b[i][r] * a[r][j] << " + "; } } cout << D[i][j] << "\t"; } cout << endl; }
cout << endl << "Конечный результат:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << D[i][j] << "\t"; } cout << endl; } return 0; } int main() { srand((unsigned int)time(NULL)); // Инициализируем генератор случайных чисел. setlocale(0, "rus"); int n = 0, h, i = 0, k; cout << "Введи размер матрицы" << endl; cin >> n; // Считываем с клавиатуры n long double **a = new long double*[n]; // Создаем массив указателей for (int i = 0; i < n; i++) { a[i] = new long double[2 * n]; // Создаем элементы }
long double **b = new long double*[n]; // Создаем массив указателей for (int i = 0; i < n; i++) { b[i] = new long double[n]; // Создаем элементы }
cout << "Нажми: 1 - случайное заполнение числами, 2 - ввод матрицы с клавиатуры" << endl; cin >> h;
if (h == 1) zapolnenie1(a, n); if (h == 2) zapolnenie2(a, n);
cout << endl << "Исходная матрица:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { b[i][j] = a[i][j]; cout << b[i][j] << "\t"; } cout << endl; }
zapolnenie3(a, n); k = (int)det(n, a); minor(0, i, n, a); if (k == 0) { exit(0); } ggg(a, n); vivod(a, n);
for (i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = a[i][j + n]; } }
i = mnozim(n, a, b);
system("pause"); }
|
Ребят, срочно нужна помощь, почему после нахождения обратной матрицы и проверки (должна получиться 1 выводит не 0 а непонятные значения) |