Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <cstdarg>
- class Matrix {
- public:
- Matrix(int order, double **m) {
- this->order = order;
- this->m = m;
- }
- Matrix getMinor(int mi, int mj) {
- int order = this->order;
- double **table = create_table(order - 1);
- for (int i = 0, ti = 0; i < order; ++ i) {
- if (i != mi) {
- for (int j = 0, tj = 0; j < order; ++ j) {
- if (j != mj) {
- table[ti][tj] = this->m[i][j];
- ++ tj;
- }
- }
- ++ ti;
- }
- }
- return Matrix(order - 1, table);
- }
- double** getMatrix() {
- return this->m;
- }
- double getDet() {
- if (this->order != 2) {
- double a = 0;
- for (int i = 0; i < this->order; ++ i) {
- //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]);
- a += this->m[i][0] * this->getMinor(i, 0).getDet() * ((i % 2 != 0) ? -1 : 1);
- }
- return a;
- }
- else
- return this->m[0][0] * this->m[1][1] - this->m[0][1] * this->m[1][0];
- }
- static double** create_table(int n) {
- double **table, *row;
- table = (double**)malloc(n * sizeof(double*));
- for (int i = 0; i < n; ++ i) {
- row = (double*)malloc(n * sizeof(double));
- table[i] = row;
- }
- return table;
- }
- static void copy_table(double **a, double **b, int n) { // a <- b
- for (int i = 0; i < n; ++ i)
- for (int j = 0; j < n; ++ j)
- a[i][j] = b[i][j];
- }
- static void change_column(double **a, int n, double *b, int column) {
- for (int i = 0; i < n; ++ i)
- a[i][column] = b[i];
- }
- private:
- int order;
- double **m;
- };
- /*
- void set_val(double **f, int n, ...) {
- va_list elem;
- va_start(elem, n);
- for (int i = 0; i < n; ++ i) {
- for (int j = 0; j < n; ++ j) {
- f[i][j] = va_arg(elem, double);
- }
- }
- va_end(elem);
- }
- */
- int main(void) {
- int n;
- printf("Введите количество линейных уравнений в системе> ");
- scanf("%d", &n);
- double **table = Matrix::create_table(n), **backup = Matrix::create_table(n);
- printf("Вводите коэффициэнты при каждой из переменных:\n");
- for (int i = 0; i < n; ++ i)
- for (int j = 0; j < n; ++ j)
- scanf("%lf", &table[i][j]);
- Matrix::copy_table(backup, table, n);
- printf("Вводите результаты уравнений:\n");
- double ans[n];
- for (int i = 0; i < n; ++ i)
- scanf("%lf", ans + i);
- Matrix m = Matrix(n, table);
- double det = m.getDet(), det_dop;
- if (det == 0) {
- printf("Главный определитель равен 0\n");
- return 0;
- }
- printf("Корни:\n");
- for (int i = 0; i < n; ++ i) {
- Matrix::change_column(table, n, ans, i);
- det_dop = m.getDet();
- printf("%f\n", det_dop / det);
- Matrix::copy_table(table, backup, n);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement