Изменить размеры матрицы - C (СИ)
Формулировка задачи:
Решение задачи: «Изменить размеры матрицы»
#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Matrix { int *data; int m, n; } Matrix; void* mymalloc (size_t size); void* myrealloc (void *ptr, size_t size); Matrix* newMatrix (int m, int n); Matrix* copyMatrix (const Matrix *matrix); void destroyMatrix (Matrix *matrix); Matrix* readMatrix (const char *str); void pprintMatrix (const Matrix *matrix); void* myrealloc (void *ptr, size_t size) { void *res = realloc(ptr, size); if (res == NULL && size != 0) { fprintf(stderr, " \n", size); exit(EXIT_FAILURE); } return res; } void* mymalloc (size_t size) { void *res = malloc(size); if (res == NULL) { fprintf(stderr, "mymalloc: неспособен выделять %zd байты\n ", size); exit(EXIT_FAILURE); } return res; } Matrix* newMatrix(int m, int n) { Matrix * new_matrix = (Matrix *)mymalloc(sizeof(Matrix)); new_matrix -> m = m; new_matrix -> n = n; new_matrix -> data = (int *)mymalloc(n*m*sizeof(int)); return new_matrix; } Matrix* copyMatrix(const Matrix *matrix) { Matrix* copy = newMatrix(matrix -> m, matrix -> n); for (int i = 0; i < matrix -> m * matrix -> n; i++) { copy -> data[i] = matrix -> data[i]; } return copy; } void destroyMatrix (Matrix *matrix){ free(matrix->data); free(matrix); } Matrix* readMatrix (const char *str) { Matrix *matrix = NULL; int m, n; printf("Введите количество столбцов и строк для %s через пробел: ", str); if (scanf("%d %d", &m, &n) != 2 || m < 0 || n < 0) goto fail; matrix = newMatrix(m, n); int *data = matrix->data; int len = m * n; for (int i = 0; i < len; i++) { if (scanf("%d", data + i) != 1) goto fail; } return matrix; fail: fprintf(stderr, "readMatrix: ошибка при чтениии %s\n", str); destroyMatrix(matrix); return NULL; } void pprintMatrix (const Matrix *matrix) { int *data = matrix->data; int m = matrix->m, n = matrix->n; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf(" %4d", *data); data++; } printf("\n"); } }
Объяснение кода листинга программы
Код начинается с объявления структуры Matrix, которая содержит указатель на массив данных и два поля для хранения размеров матрицы. Затем определены две функции-обработчика: mymalloc и myrealloc, которые являются обертками для функций malloc и realloc соответственно. Эти функции обеспечивают дополнительную обработку ошибок. Далее определены функции newMatrix и copyMatrix для работы с матрицами. Функция newMatrix создает новую матрицу заданного размера, а функция copyMatrix создает копию существующей матрицы. Функция destroyMatrix освобождает память, выделенную под матрицу и её данные. Функция readMatrix считывает размеры матрицы и её данные из стандартного ввода. Если ввод некорректен, выводится сообщение об ошибке и матрица уничтожается. Функция pprintMatrix выводит матрицу на стандартный вывод в удобочитаемом формате. В конце кода приведен пример использования этих функций для создания, заполнения и вывода матрицы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д