StoneHaos

lab25

Nov 14th, 2019
161
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cmath>
  4. #include <cstdarg>
  5.  
  6.  
  7. class Matrix {
  8. public:
  9.     Matrix(int order, double **m) {
  10.         this->order = order;
  11.         this->m = m;
  12.     }
  13.     Matrix getMinor(int mi, int mj) {
  14.         int order = this->order;
  15.         double **table = create_table(order - 1);
  16.         for (int i = 0, ti = 0; i < order; ++ i) {
  17.             if (i != mi) {
  18.                 for (int j = 0, tj = 0; j < order; ++ j) {
  19.                     if (j != mj) {
  20.                         table[ti][tj] = this->m[i][j];
  21.                         ++ tj;
  22.                     }
  23.                 }
  24.                 ++ ti;
  25.             }
  26.         }
  27.         return Matrix(order - 1, table);
  28.     }
  29.     double** getMatrix() {
  30.         return this->m;
  31.     }
  32.     double getDet() {
  33.         if (this->order != 2) {
  34.             double a = 0;
  35.             for (int i = 0; i < this->order; ++ i) {
  36.                 //printf("%f, m[%d][0] = %f\n", this->m[i][0] * this->getMinor(i, 0).getDet() * ((i % 2 != 0) ? -1 : 1), i, this->m[i][0]);
  37.                 a += this->m[i][0] * this->getMinor(i, 0).getDet() * ((i % 2 != 0) ? -1 : 1);
  38.             }
  39.             return a;
  40.         }
  41.         else
  42.             return this->m[0][0] * this->m[1][1] - this->m[0][1] * this->m[1][0];
  43.     }
  44.     static double** create_table(int n) {
  45.         double **table, *row;
  46.         table = (double**)malloc(n * sizeof(double*));
  47.         for (int i = 0; i < n; ++ i) {
  48.             row = (double*)malloc(n * sizeof(double));
  49.             table[i] = row;
  50.         }
  51.         return table;
  52.     }
  53.  
  54.     static void copy_table(double **a, double **b, int n) { // a <- b
  55.         for (int i = 0; i < n; ++ i)
  56.             for (int j = 0; j < n; ++ j)
  57.                 a[i][j] = b[i][j];
  58.     }
  59.  
  60.     static void change_column(double **a, int n, double *b, int column) {
  61.         for (int i = 0; i < n; ++ i)
  62.             a[i][column] = b[i];
  63.     }
  64.  
  65. private:
  66.     int order;
  67.     double **m;
  68. };
  69.  
  70. /*
  71. void set_val(double **f, int n, ...) {
  72.     va_list elem;
  73.     va_start(elem, n);
  74.     for (int i = 0; i < n; ++ i) {
  75.         for (int j = 0; j < n; ++ j) {
  76.             f[i][j] = va_arg(elem, double);
  77.         }
  78.     }
  79.     va_end(elem);
  80. }
  81. */
  82.  
  83. int main(void) {
  84.     int n;
  85.     printf("Введите количество линейных уравнений в системе> ");
  86.     scanf("%d", &n);
  87.     double **table = Matrix::create_table(n), **backup = Matrix::create_table(n);
  88.     printf("Вводите коэффициэнты при каждой из переменных:\n");
  89.     for (int i = 0; i < n; ++ i)
  90.         for (int j = 0; j < n; ++ j)
  91.             scanf("%lf", &table[i][j]);
  92.     Matrix::copy_table(backup, table, n);
  93.     printf("Вводите результаты уравнений:\n");
  94.     double ans[n];
  95.     for (int i = 0; i < n; ++ i)
  96.         scanf("%lf", ans + i);
  97.  
  98.     Matrix m = Matrix(n, table);
  99.     double det = m.getDet(), det_dop;
  100.     if (det == 0) {
  101.         printf("Главный определитель равен 0\n");
  102.         return 0;
  103.     }
  104.     printf("Корни:\n");
  105.     for (int i = 0; i < n; ++ i) {
  106.         Matrix::change_column(table, n, ans, i);
  107.         det_dop = m.getDet();
  108.         printf("%f\n", det_dop / det);
  109.         Matrix::copy_table(table, backup, n);
  110.     }
  111.     return 0;
  112. }
RAW Paste Data