StoneHaos

lab25.1

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