Advertisement
Guest User

KIRYA BRAT ONO RABOTAET

a guest
Apr 24th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. /*
  8.  
  9. Определитель матрицы A=[n×n] — это алгебраическая сумма n! слагаемых, составленных следующим образом.
  10.  
  11. */
  12.  
  13.  
  14. double **A, *B;
  15. ifstream devInput("H:/C Projects/Lab13/det_tests.txt", ios_base::binary);
  16. ifstream invInput("H:/C Projects/Lab13/inv_tests.txt", ios_base::binary);
  17.  
  18. double eps = 0.00000001;
  19.  
  20. void determinant(double **a, int n) {
  21.     int i = 0, r = n, p = 1, v, j, z, k;
  22.     double c, X = 1;
  23.     while (i < r) {
  24.         // выбор ведущего элемента
  25.         v = i;  // v - столбец текущего ведущего элемента
  26.         for (j = i + 1; j < n; j++) {
  27.             if (abs(a[j][i]) > abs(a[v][i])) v = j;
  28.         }
  29.         if (abs(a[v][i]) < eps) r = i;
  30.         else {
  31.             // перестановка строк
  32.             if (v != i) {
  33.                 p = -p;
  34.                 swap(a[v], a[i]);
  35.                 /*for (j = i; j <= n; j++) {
  36.                     z = a[i][j];
  37.                     a[i][j] = a[v][j];
  38.                     a[v][j] = z;
  39.                 }*/
  40.             }
  41.             // вычитание строк матрицы
  42.             for (k = i + 1; k < n; k++) {
  43.                 c = a[k][i] / a[i][i];
  44.                 for (j = i; j < n; j++) a[k][j] -= c * a[i][j];
  45.             }
  46.             i++;
  47.         }
  48.     }
  49.     // вычисление определителя
  50.     if (r < n) X = 0;
  51.     else {
  52.         X = p * a[0][0];
  53.         for (i = 1; i < n; i++) X *= a[i][i];
  54.     }
  55.     cout << X;
  56. }
  57.  
  58.  
  59. int main()
  60. {
  61.     devInput.seekg(8);
  62.     int r, c;       //amount of rows and collumns
  63.     devInput >> r;
  64.     c = r;
  65.     // выделение памяти под матрицу
  66.     A = new double*[r]; // задаём указатель на количество строк
  67.     for (int i = 0; i < r; i++) {
  68.         A[i] = new double[c];
  69.     }
  70.  
  71.     // считываем матрицу
  72.     for (int i = 0; i < r; i++) {
  73.         for (int j = 0; j < c; j++) {
  74.             devInput >> A[i][j];
  75.         }
  76.     }
  77.     determinant(A, r);
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement