Нужна помощь, уже сломал мозг, требуется ввод матрицы клавиатуры, затем она должна считать обратную, затем умножить обратную на исходную и получить единичную, помогите убрать так называемые "читы" - нужно когда на главной диагонале 0 убрать его (проблема когда 0 в самом конце), и посчитать нормально единичную матрицу, я тупо вывожу ее
Код |
#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(double**,int );
void zapolnenie1 (double **a,int n) { cout << "Исходная матрица:"<< endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = rand() % 10; // Каждый элемент случайному числу от 0 до 9 cout << a[i][j] << " "; // Вывести элементы на консольку } cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли } } void zapolnenie2 (double **a,int n) { cout <<"Исходная матрица:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> a[i][j]; // Каждый элемент случайному числу от 0 до 9 cout << a[i][j] << " "; // Вывести элементы на консольку } cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли } } void zapolnenie3 (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; // Двумерный массив. Строка кончилась, переводим строку и на консоли }
}
double** minor(int z,int x,int n,double **a) { double **C=new double*[n-1]; for(int i=0;i<n-1;i++) { C[i]=new 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; }
double det(int n,double **a) { 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 (double **a,int n) {int ii=0,d, i, j, g, q; cout << endl; double gg; for (int i = 0; i< n-1; i++) { if ( a[i][ii]==0) for(d = 0; d < n*2; d++) { g = a[i][d]; a[i][d]=a[i+1][d]; a[i+1][d] = g; } ii++; }
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 (double **a, int n) { cout << "Обратная матрица:"<< endl; int i, j; int s = (79 - (n - 1)) / n; for (i = 0; i < n; i++) { for (j = n; j < n*2; j++) { if(a[i][j]>=0) cout<<" "<< scientific << setprecision(6) << a[i][j]; else cout<< scientific << setprecision(6) << a[i][j]; } cout << endl; } cout << endl;
}
int main() { srand(time(NULL)); // Инициализируем генератор случайных чисел. setlocale(0, "rus"); int n = 0, h, i=0, k; cout << "Введи размер матрицы"<< endl; cin >> n; // Считываем с клавиатуры n double **a = new double* [n]; // Создаем массив указателей for (int i = 0; i < n; i++) { a[i] = new double [2*n]; // Создаем элементы } double **b = new double* [n]; // Создаем массив указателей for (int i = 0; i < n; i++) { b[i] = new double [n]; // Создаем элементы }
for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { b[i][j]= a[i][j]; // Каждый элемент случайному числу от 0 до 9 } }
cout << "Нажми: 1 - случайное заполнение числами, 2 - ввод матрицы с клавиатуры"<< endl; cin >> h; if (h==1) zapolnenie1 (a, n); if (h==2) zapolnenie2 (a, n);
zapolnenie3 (a, n);
k = det (n , a); minor (0, i , n, a); if (k==0) { exit(0); } ggg (a, n); vivod(a,n); system("pause"); }
|
|