Загрузка данных


Задание 1
#include <stdio.h>
#include <stdlib.h>

int input_array(int *array, int n);
void sort_array(int *array, int n);
void output_array(int *array, int n);

int main(void) {
    int n;
    int *array = NULL;

    if (scanf("%d", &n) != 1 || n <= 0) {
        printf("n/a");
    } else {
        array = malloc(n * sizeof(int));
        if (array == NULL || input_array(array, n) == 0) {
            printf("n/a");
        } else {
            sort_array(array, n);
            output_array(array, n);
        }
    }

    free(array);
    return 0;
}

int input_array(int *array, int n) {
    int result = 1;

    for (int i = 0; i < n; i++) {
        if (scanf("%d", &array[i]) != 1) {
            result = 0;
        }
    }

    return result;
}

void sort_array(int *array, int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

void output_array(int *array, int n) {
    for (int i = 0; i < n; i++) {
        if (i > 0) {
            printf(" ");
        }
        printf("%d", array[i]);
    }
}
Зажние 2
#include <stdio.h>
#include <stdlib.h>

int input_array(int *array, int n);
void sort_array(int *array, int n);
void output_array(int *array, int n);

int main(void) {
    int n;
    int *array = NULL;

    if (scanf("%d", &n) != 1 || n <= 0) {
        printf("n/a");
    } else {
        array = malloc(n * sizeof(int));
        if (array == NULL || input_array(array, n) == 0) {
            printf("n/a");
        } else {
            sort_array(array, n);
            output_array(array, n);
        }
    }

    free(array);
    return 0;
}

int input_array(int *array, int n) {
    int result = 1;

    for (int i = 0; i < n; i++) {
        if (scanf("%d", &array[i]) != 1) {
            result = 0;
        }
    }

    return result;
}

void sort_array(int *array, int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

void output_array(int *array, int n) {
    for (int i = 0; i < n; i++) {
        if (i > 0) {
            printf(" ");
        }
        printf("%d", array[i]);
    }
}
Задние 3
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

int input_size(int *n, int *m);
int input_matrix(int **matrix, int n, int m);
void output_matrix(int **matrix, int n, int m);
int allocate_matrix(int ***matrix, int **data, int method, int n, int m);
void free_matrix(int **matrix, int *data, int method, int n);

int main(void) {
    int method;
    int n;
    int m;
    int **matrix = NULL;
    int *data = NULL;
    int static_data[MAX_SIZE][MAX_SIZE];
    int *static_rows[MAX_SIZE];
    int error = 0;

    if (scanf("%d", &method) != 1 || method < 1 || method > 4 || input_size(&n, &m) == 0) {
        error = 1;
    } else if (method == 1) {
        if (n > MAX_SIZE || m > MAX_SIZE) {
            error = 1;
        } else {
            for (int i = 0; i < n; i++) {
                static_rows[i] = static_data[i];
            }
            matrix = static_rows;
        }
    } else if (allocate_matrix(&matrix, &data, method, n, m) == 0) {
        error = 1;
    }

    if (error == 0 && input_matrix(matrix, n, m) == 0) {
        error = 1;
    }

    if (error == 1) {
        printf("n/a");
    } else {
        output_matrix(matrix, n, m);
    }

    if (method >= 2 && method <= 4) {
        free_matrix(matrix, data, method, n);
    }

    return 0;
}

int input_size(int *n, int *m) {
    int result = 1;

    if (scanf("%d %d", n, m) != 2 || *n <= 0 || *m <= 0) {
        result = 0;
    }

    return result;
}

int input_matrix(int **matrix, int n, int m) {
    int result = 1;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (scanf("%d", &matrix[i][j]) != 1) {
                result = 0;
            }
        }
    }

    return result;
}

void output_matrix(int **matrix, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (j > 0) {
                printf(" ");
            }
            printf("%d", matrix[i][j]);
        }
        if (i < n - 1) {
            printf("\n");
        }
    }
}

int allocate_matrix(int ***matrix, int **data, int method, int n, int m) {
    int result = 1;

    if (method == 2) {
        *matrix = malloc(n * sizeof(int *));
        *data = malloc(n * m * sizeof(int));
        if (*matrix == NULL || *data == NULL) {
            result = 0;
        } else {
            for (int i = 0; i < n; i++) {
                (*matrix)[i] = *data + i * m;
            }
        }
    } else if (method == 3) {
        *matrix = malloc(n * sizeof(int *));
        if (*matrix == NULL) {
            result = 0;
        } else {
            for (int i = 0; i < n; i++) {
                (*matrix)[i] = malloc(m * sizeof(int));
                if ((*matrix)[i] == NULL) {
                    result = 0;
                }
            }
        }
    } else if (method == 4) {
        *matrix = malloc(n * sizeof(int *) + n * m * sizeof(int));
        if (*matrix == NULL) {
            result = 0;
        } else {
            *data = (int *)(*matrix + n);
            for (int i = 0; i < n; i++) {
                (*matrix)[i] = *data + i * m;
            }
        }
    }

    if (result == 0) {
        free_matrix(*matrix, *data, method, n);
        *matrix = NULL;
        *data = NULL;
    }

    return result;
}

void free_matrix(int **matrix, int *data, int method, int n) {
    if (method == 2) {
        free(data);
        free(matrix);
    } else if (method == 3) {
        if (matrix != NULL) {
            for (int i = 0; i < n; i++) {
                free(matrix[i]);
            }
            free(matrix);
        }
    } else if (method == 4) {
        free(matrix);
    }
}
Задание 4
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

int input_size(int *n, int *m);
int input_matrix(int **matrix, int n, int m);
void output_matrix(int **matrix, int n, int m);
void output_array(int *array, int n);
int allocate_matrix(int ***matrix, int **data, int method, int n, int m);
void free_matrix(int **matrix, int *data, int method, int n);
void find_row_max(int **matrix, int n, int m, int *row_max);
void find_column_min(int **matrix, int n, int m, int *column_min);

int main(void) {
    int method;
    int n;
    int m;
    int **matrix = NULL;
    int *data = NULL;
    int *row_max = NULL;
    int *column_min = NULL;
    int static_data[MAX_SIZE][MAX_SIZE];
    int *static_rows[MAX_SIZE];
    int error = 0;

    if (scanf("%d", &method) != 1 || method < 1 || method > 4 || input_size(&n, &m) == 0) {
        error = 1;
    } else if (method == 1) {
        if (n > MAX_SIZE || m > MAX_SIZE) {
            error = 1;
        } else {
            for (int i = 0; i < n; i++) {
                static_rows[i] = static_data[i];
            }
            matrix = static_rows;
        }
    } else if (allocate_matrix(&matrix, &data, method, n, m) == 0) {
        error = 1;
    }

    if (error == 0) {
        row_max = malloc(n * sizeof(int));
        column_min = malloc(m * sizeof(int));
        if (row_max == NULL || column_min == NULL || input_matrix(matrix, n, m) == 0) {
            error = 1;
        }
    }

    if (error == 1) {
        printf("n/a");
    } else {
        find_row_max(matrix, n, m, row_max);
        find_column_min(matrix, n, m, column_min);
        output_matrix(matrix, n, m);
        printf("\n");
        output_array(row_max, n);
        printf("\n");
        output_array(column_min, m);
    }

    free(row_max);
    free(column_min);
    if (method >= 2 && method <= 4) {
        free_matrix(matrix, data, method, n);
    }

    return 0;
}

int input_size(int *n, int *m) {
    int result = 1;

    if (scanf("%d %d", n, m) != 2 || *n <= 0 || *m <= 0) {
        result = 0;
    }

    return result;
}

int input_matrix(int **matrix, int n, int m) {
    int result = 1;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (scanf("%d", &matrix[i][j]) != 1) {
                result = 0;
            }
        }
    }

    return result;
}

void output_matrix(int **matrix, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (j > 0) {
                printf(" ");
            }
            printf("%d", matrix[i][j]);
        }
        if (i < n - 1) {
            printf("\n");
        }
    }
}

void output_array(int *array, int n) {
    for (int i = 0; i < n; i++) {
        if (i > 0) {
            printf(" ");
        }
        printf("%d", array[i]);
    }
}

int allocate_matrix(int ***matrix, int **data, int method, int n, int m) {
    int result = 1;

    if (method == 2) {
        *matrix = malloc(n * sizeof(int *));
        *data = malloc(n * m * sizeof(int));
        if (*matrix == NULL || *data == NULL) {
            result = 0;
        } else {
            for (int i = 0; i < n; i++) {
                (*matrix)[i] = *data + i * m;
            }
        }
    } else if (method == 3) {
        *matrix = malloc(n * sizeof(int *));
        if (*matrix == NULL) {
            result = 0;
        } else {
            for (int i = 0; i < n; i++) {
                (*matrix)[i] = malloc(m * sizeof(int));
                if ((*matrix)[i] == NULL) {
                    result = 0;
                }
            }
        }
    } else if (method == 4) {
        *matrix = malloc(n * sizeof(int *) + n * m * sizeof(int));
        if (*matrix == NULL) {
            result = 0;
        } else {
            *data = (int *)(*matrix + n);
            for (int i = 0; i < n; i++) {
                (*matrix)[i] = *data + i * m;
            }
        }
    }

    if (result == 0) {
        free_matrix(*matrix, *data, method, n);
        *matrix = NULL;
        *data = NULL;
    }

    return result;
}

void free_matrix(int **matrix, int *data, int method, int n) {
    if (method == 2) {
        free(data);
        free(matrix);
    } else if (method == 3) {
        if (matrix != NULL) {
            for (int i = 0; i < n; i++) {
                free(matrix[i]);
            }
            free(matrix);
        }
    } else if (method == 4) {
        free(matrix);
    }
}

void find_row_max(int **matrix, int n, int m, int *row_max) {
    for (int i = 0; i < n; i++) {
        row_max[i] = matrix[i][0];
        for (int j = 1; j < m; j++) {
            if (matrix[i][j] > row_max[i]) {
                row_max[i] = matrix[i][j];
            }
        }
    }
}

void find_column_min(int **matrix, int n, int m, int *column_min) {
    for (int j = 0; j < m; j++) {
        column_min[j] = matrix[0][j];
        for (int i = 1; i < n; i++) {
            if (matrix[i][j] < column_min[j]) {
                column_min[j] = matrix[i][j];
            }
        }
    }
}
Задние 5
#include <stdio.h>

#define N 15
#define M 13

void transform(int *buf, int **matr, int n, int m);
void make_picture(int **picture, int n, int m);
void reset_picture(int **picture, int n, int m);
void output_picture(int **picture, int n, int m);

int main(void) {
    int picture_data[N][M];
    int *picture[N];

    transform((int *)picture_data, picture, N, M);
    make_picture(picture, N, M);
    output_picture(picture, N, M);

    return 0;
}

void make_picture(int **picture, int n, int m) {
    int frame_w[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    int frame_h[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    int tree_trunk[] = {7, 7, 7, 7};
    int tree_foliage[] = {3, 3, 3, 3};
    int sun_data[6][5] = {{0, 6, 6, 6, 6},
                          {0, 0, 6, 6, 6},
                          {0, 0, 6, 6, 6},
                          {0, 6, 0, 0, 6},
                          {0, 0, 0, 0, 0},
                          {0, 0, 0, 0, 0}};

    reset_picture(picture, n, m);

    for (int j = 0; j < m; j++) {
        picture[0][j] = frame_w[j];
        picture[7][j] = frame_w[j];
        picture[n - 1][j] = frame_w[j];
    }

    for (int i = 0; i < n; i++) {
        picture[i][0] = frame_h[i];
        picture[i][6] = frame_h[i];
        picture[i][m - 1] = frame_h[i];
    }

    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 5; j++) {
            picture[i + 1][j + 7] = sun_data[i][j];
        }
    }

    for (int j = 0; j < 2; j++) {
        picture[2][j + 3] = tree_foliage[j];
        picture[5][j + 3] = tree_foliage[j];
    }

    for (int j = 0; j < 4; j++) {
        picture[3][j + 2] = tree_foliage[j];
        picture[4][j + 2] = tree_foliage[j];
        picture[10][j + 2] = tree_trunk[j];
    }

    for (int j = 0; j < 2; j++) {
        picture[6][j + 3] = tree_trunk[j];
        picture[8][j + 3] = tree_trunk[j];
        picture[9][j + 3] = tree_trunk[j];
    }
}

void reset_picture(int **picture, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            picture[i][j] = 0;
        }
    }
}

void transform(int *buf, int **matr, int n, int m) {
    for (int i = 0; i < n; i++) {
        matr[i] = buf + i * m;
    }
}

void output_picture(int **picture, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (j > 0) {
                printf(" ");
            }
            printf("%d", picture[i][j]);
        }
        if (i < n - 1) {
            printf("\n");
        }
    }
}
Задание 6
#include <stdio.h>
#include <stdlib.h>

int input_matrix(int ***matrix, int *n, int *m);
void output_matrix(int **matrix, int n, int m);
int **allocate_matrix(int n, int m);
void free_matrix(int **matrix);
int sum(int **first, int n_first, int m_first, int **second, int n_second, int m_second,
        int ***result, int *n_result, int *m_result);
int mul(int **first, int n_first, int m_first, int **second, int n_second, int m_second,
        int ***result, int *n_result, int *m_result);
int transpose(int **matrix, int n, int m, int ***result, int *n_result, int *m_result);

int main(void) {
    int operation;
    int **first = NULL;
    int **second = NULL;
    int **result = NULL;
    int n_first;
    int m_first;
    int n_second;
    int m_second;
    int n_result;
    int m_result;
    int error = 0;

    if (scanf("%d", &operation) != 1 || operation < 1 || operation > 3) {
        error = 1;
    } else if (input_matrix(&first, &n_first, &m_first) == 0) {
        error = 1;
    } else if (operation == 1 || operation == 2) {
        if (input_matrix(&second, &n_second, &m_second) == 0) {
            error = 1;
        }
    }

    if (error == 0) {
        if (operation == 1) {
            error = !sum(first, n_first, m_first, second, n_second, m_second, &result, &n_result,
                         &m_result);
        } else if (operation == 2) {
            error = !mul(first, n_first, m_first, second, n_second, m_second, &result, &n_result,
                         &m_result);
        } else {
            error = !transpose(first, n_first, m_first, &result, &n_result, &m_result);
        }
    }

    if (error == 1) {
        printf("n/a");
    } else {
        output_matrix(result, n_result, m_result);
    }

    free_matrix(first);
    free_matrix(second);
    free_matrix(result);

    return 0;
}

int input_matrix(int ***matrix, int *n, int *m) {
    int result = 1;

    if (scanf("%d %d", n, m) != 2 || *n <= 0 || *m <= 0) {
        result = 0;
    } else {
        *matrix = allocate_matrix(*n, *m);
        if (*matrix == NULL) {
            result = 0;
        } else {
            for (int i = 0; i < *n; i++) {
                for (int j = 0; j < *m; j++) {
                    if (scanf("%d", &(*matrix)[i][j]) != 1) {
                        result = 0;
                    }
                }
            }
        }
    }

    return result;
}

void output_matrix(int **matrix, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (j > 0) {
                printf(" ");
            }
            printf("%d", matrix[i][j]);
        }
        if (i < n - 1) {
            printf("\n");
        }
    }
}

int **allocate_matrix(int n, int m) {
    int **matrix = malloc(n * sizeof(int *) + n * m * sizeof(int));

    if (matrix != NULL) {
        int *data = (int *)(matrix + n);
        for (int i = 0; i < n; i++) {
            matrix[i] = data + i * m;
        }
    }

    return matrix;
}

void free_matrix(int **matrix) {
    free(matrix);
}

int sum(int **first, int n_first, int m_first, int **second, int n_second, int m_second,
        int ***result, int *n_result, int *m_result) {
    int success = 1;

    if (n_first != n_second || m_first != m_second) {
        success = 0;
    } else {
        *n_result = n_first;
        *m_result = m_first;
        *result = allocate_matrix(*n_result, *m_result);
        if (*result == NULL) {
            success = 0;
        } else {
            for (int i = 0; i < *n_result; i++) {
                for (int j = 0; j < *m_result; j++) {
                    (*result)[i][j] = first[i][j] + second[i][j];
                }
            }
        }
    }

    return success;
}

int mul(int **first, int n_first, int m_first, int **second, int n_second, int m_second,
        int ***result, int *n_result, int *m_result) {
    int success = 1;

    if (m_first != n_second) {
        success = 0;
    } else {
        *n_result = n_first;
        *m_result = m_second;
        *result = allocate_matrix(*n_result, *m_result);
        if (*result == NULL) {
            success = 0;
        } else {
            for (int i = 0; i < *n_result; i++) {
                for (int j = 0; j < *m_result; j++) {
                    (*result)[i][j] = 0;
                    for (int k = 0; k < m_first; k++) {
                        (*result)[i][j] += first[i][k] * second[k][j];
                    }
                }
            }
        }
    }

    return success;
}

int transpose(int **matrix, int n, int m, int ***result, int *n_result, int *m_result) {
    int success = 1;

    *n_result = m;
    *m_result = n;
    *result = allocate_matrix(*n_result, *m_result);
    if (*result == NULL) {
        success = 0;
    } else {
        for (int i = 0; i < *n_result; i++) {
            for (int j = 0; j < *m_result; j++) {
                (*result)[i][j] = matrix[j][i];
            }
        }
    }

    return success;
}
Задние 7
#include <stdio.h>
#include <stdlib.h>

#define EPS 0.0000001

double det(double **matrix, int n);
int input(double ***matrix, int *n, int *m);
void output(double value);
double **allocate_matrix(int n, int m);
void free_matrix(double **matrix);
double abs_double(double value);
void swap_rows(double **matrix, int first, int second);

int main(void) {
    double **matrix = NULL;
    int n;
    int m;

    if (input(&matrix, &n, &m) == 0 || n != m) {
        printf("n/a");
    } else {
        output(det(matrix, n));
    }

    free_matrix(matrix);
    return 0;
}

double det(double **matrix, int n) {
    double result = 1.0;
    int sign = 1;

    for (int i = 0; i < n; i++) {
        int pivot = i;
        for (int j = i + 1; j < n; j++) {
            if (abs_double(matrix[j][i]) > abs_double(matrix[pivot][i])) {
                pivot = j;
            }
        }

        if (abs_double(matrix[pivot][i]) < EPS) {
            result = 0.0;
        } else {
            if (pivot != i) {
                swap_rows(matrix, pivot, i);
                sign *= -1;
            }

            for (int j = i + 1; j < n; j++) {
                double factor = matrix[j][i] / matrix[i][i];
                for (int k = i; k < n; k++) {
                    matrix[j][k] -= factor * matrix[i][k];
                }
            }
        }
    }

    if (abs_double(result) >= EPS) {
        for (int i = 0; i < n; i++) {
            result *= matrix[i][i];
        }
        result *= sign;
    }

    if (abs_double(result) < EPS) {
        result = 0.0;
    }

    return result;
}

int input(double ***matrix, int *n, int *m) {
    int success = 1;

    if (scanf("%d %d", n, m) != 2 || *n <= 0 || *m <= 0) {
        success = 0;
    } else {
        *matrix = allocate_matrix(*n, *m);
        if (*matrix == NULL) {
            success = 0;
        } else {
            for (int i = 0; i < *n; i++) {
                for (int j = 0; j < *m; j++) {
                    if (scanf("%lf", &(*matrix)[i][j]) != 1) {
                        success = 0;
                    }
                }
            }
        }
    }

    return success;
}

void output(double value) {
    printf("%.6lf", value);
}

double **allocate_matrix(int n, int m) {
    double **matrix = malloc(n * sizeof(double *) + n * m * sizeof(double));

    if (matrix != NULL) {
        double *data = (double *)(matrix + n);
        for (int i = 0; i < n; i++) {
            matrix[i] = data + i * m;
        }
    }

    return matrix;
}

void free_matrix(double **matrix) {
    free(matrix);
}

double abs_double(double value) {
    if (value < 0.0) {
        value = -value;
    }
    return value;
}

void swap_rows(double **matrix, int first, int second) {
    double *temp = matrix[first];
    matrix[first] = matrix[second];
    matrix[second] = temp;
}
Задание 8
#include <stdio.h>
#include <stdlib.h>

#define EPS 0.0000001

int invert(double **matrix, int n, double **result);
int input(double ***matrix, int *n, int *m);
void output(double **matrix, int n, int m);
double **allocate_matrix(int n, int m);
void free_matrix(double **matrix);
double abs_double(double value);
void swap_rows(double **matrix, int first, int second);

int main(void) {
    double **matrix = NULL;
    double **result = NULL;
    int n;
    int m;
    int error = 0;

    if (input(&matrix, &n, &m) == 0 || n != m) {
        error = 1;
    } else {
        result = allocate_matrix(n, n);
        if (result == NULL || invert(matrix, n, result) == 0) {
            error = 1;
        }
    }

    if (error == 1) {
        printf("n/a");
    } else {
        output(result, n, n);
    }

    free_matrix(matrix);
    free_matrix(result);
    return 0;
}

int invert(double **matrix, int n, double **result) {
    int success = 1;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            result[i][j] = 0.0;
        }
        result[i][i] = 1.0;
    }

    for (int i = 0; i < n && success == 1; i++) {
        int pivot = i;
        for (int j = i + 1; j < n; j++) {
            if (abs_double(matrix[j][i]) > abs_double(matrix[pivot][i])) {
                pivot = j;
            }
        }

        if (abs_double(matrix[pivot][i]) < EPS) {
            success = 0;
        } else {
            if (pivot != i) {
                swap_rows(matrix, pivot, i);
                swap_rows(result, pivot, i);
            }

            double divider = matrix[i][i];
            for (int j = 0; j < n; j++) {
                matrix[i][j] /= divider;
                result[i][j] /= divider;
            }

            for (int row = 0; row < n; row++) {
                if (row != i) {
                    double factor = matrix[row][i];
                    for (int col = 0; col < n; col++) {
                        matrix[row][col] -= factor * matrix[i][col];
                        result[row][col] -= factor * result[i][col];
                    }
                }
            }
        }
    }

    return success;
}

int input(double ***matrix, int *n, int *m) {
    int success = 1;

    if (scanf("%d %d", n, m) != 2 || *n <= 0 || *m <= 0) {
        success = 0;
    } else {
        *matrix = allocate_matrix(*n, *m);
        if (*matrix == NULL) {
            success = 0;
        } else {
            for (int i = 0; i < *n; i++) {
                for (int j = 0; j < *m; j++) {
                    if (scanf("%lf", &(*matrix)[i][j]) != 1) {
                        success = 0;
                    }
                }
            }
        }
    }

    return success;
}

void output(double **matrix, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (j > 0) {
                printf(" ");
            }
            if (abs_double(matrix[i][j]) < EPS) {
                matrix[i][j] = 0.0;
            }
            printf("%.6lf", matrix[i][j]);
        }
        if (i < n - 1) {
            printf("\n");
        }
    }
}

double **allocate_matrix(int n, int m) {
    double **matrix = malloc(n * sizeof(double *) + n * m * sizeof(double));

    if (matrix != NULL) {
        double *data = (double *)(matrix + n);
        for (int i = 0; i < n; i++) {
            matrix[i] = data + i * m;
        }
    }

    return matrix;
}

void free_matrix(double **matrix) {
    free(matrix);
}

double abs_double(double value) {
    if (value < 0.0) {
        value = -value;
    }
    return value;
}

void swap_rows(double **matrix, int first, int second) {
    double *temp = matrix[first];
    matrix[first] = matrix[second];
    matrix[second] = temp;
}