Удалить из квадратной матрицы главную диагональ, при этом элементы верхнего треугольника сместить влево - C (СИ)
Формулировка задачи:
void removeDiagT (Matrix *a);
Удаляет из квадратной матрицы a главную диагональ, при этом элементы верхнего треугольника смещаются влево.
Пример. Исходная матрица:
1 2 3
4 5 6
7 8 9
Вызов:
2 3
4 6
7 8
Не работает. Что не так с free?
#include <stdio.h> #include <stdlib.h> void* myrealloc(void *ptr, size_t size); void* mymalloc(size_t size); typedef struct Matrix { int *data; int m, n; } Matrix; Matrix* newMatrix(int m, int n); Matrix* copyMatrix(const Matrix *matrix); void destroyMatrix(Matrix *matrix); void removeDiagT(Matrix *a); void printMatrix(const Matrix *matrix); int main() { printf("Введите размер матрицы:\n"); printf("n = "); int n; if (scanf("%d", &n) != 1) { printf("Ошибка ввода"); exit(EXIT_FAILURE); } printf("m = "); int m; if (scanf("%d", &m) != 1) { printf("Ошибка ввода"); exit(EXIT_FAILURE); } printf("Введите элементы матрицы:\n"); Matrix * matrix = newMatrix(n, m); for (int i = 0; i < (matrix -> m * matrix -> n); i++) { if (scanf("%d", &matrix -> data[i]) != 1) { printf("Ошибка ввода"); exit(EXIT_FAILURE); } } printMatrix(matrix); printf("\n"); removeDiagT(matrix); printMatrix(matrix); printf("\n"); destroyMatrix(matrix); system("pause"); return 0; } void removeDiagT(Matrix *a) { if (a -> m != a -> n) { printf("Ошибка ввода"); exit(EXIT_FAILURE); } Matrix * temp = newMatrix(a -> m, a -> n-1); int index = 0; for (int i = 0; i < a -> m; i++) { for (int j = 0; j < a -> n; j++) { if (i != j) { temp -> data[index] = a -> data[i * a -> m + j]; int b = a -> data[i * a -> m + j]; ++index; } } } myrealloc(a -> data, sizeof(int)*a -> m * (a -> n - 1)); a -> n = a -> n - 1; index = 0; for (int i = 0; i < a -> n; i++) { for (int j = 0; j < a -> n; j++) { a -> data[i * a -> n + j] = temp -> data[index]; int a = temp -> data[index]; ++index; } } destroyMatrix(temp); } void *mymalloc(size_t size) { void *result = malloc(size); if (result == NULL) { fprintf(stderr, "mymalloc: не удалось выделить %zd байт\n", size); exit(EXIT_FAILURE); } return result; } void* myrealloc(void *ptr, size_t size) { void *res = realloc(ptr, size); if (res == NULL && size != 0) { fprintf(stderr, "myrealloc: не удалось выделить %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; } void printMatrix(const Matrix *matrix) { int m = matrix -> m, n = matrix -> n; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%d", matrix -> data[i * n + j]); } printf("\n"); } }
Решение задачи: «Удалить из квадратной матрицы главную диагональ, при этом элементы верхнего треугольника сместить влево»
textual
Листинг программы
п»ї#include <stdio.h> #include <stdlib.h> void* myrealloc(void *ptr, size_t size); void* mymalloc(size_t size); typedef struct Matrix { int *data; int m, n; } Matrix; Matrix* newMatrix(int m, int n); Matrix* copyMatrix(const Matrix *matrix); void destroyMatrix(Matrix *matrix); void removeDiagT(Matrix *a); void printMatrix(const Matrix *matrix); int main() { printf("Введите размер матрицы:\n"); printf("n = "); int n; if (scanf("%d", &n) != 1) { printf("Ошибка ввода"); exit(EXIT_FAILURE); } printf("m = "); int m; if (scanf("%d", &m) != 1) { printf("Ошибка ввода"); exit(EXIT_FAILURE); } printf("Введите элементы матрицы:\n"); Matrix * matrix = newMatrix(n, m); for (int i = 0; i < (matrix -> m * matrix -> n); i++) { if (scanf("%d", &matrix -> data[i]) != 1) { printf("Ошибка ввода"); exit(EXIT_FAILURE); } } printMatrix(matrix); printf("\n"); removeDiagT(matrix); printMatrix(matrix); printf("\n"); destroyMatrix(matrix); system("pause"); return 0; } void removeDiagT(Matrix *a) { if (a -> m != a -> n) { printf("Ошибка ввода"); exit(EXIT_FAILURE); } Matrix * temp = newMatrix(a -> m, a -> n-1); int index = 0; for (int i = 0; i < a -> m; i++) { for (int j = 0; j < a -> n; j++) { if (i != j) { temp -> data[index] = a -> data[i * a -> m + j]; int b = a -> data[i * a -> m + j]; ++index; } } } myrealloc(a -> data, sizeof(int)*a -> m * (a -> n - 1)); a -> n = a -> n - 1; index = 0; for (int i = 0; i < a -> n; i++) { for (int j = 0; j < a -> n; j++) { a -> data[i * a -> n + j] = temp -> data[index]; int a = temp -> data[index]; ++index; } } destroyMatrix(temp); } void *mymalloc(size_t size) { void *result = malloc(size); if (result == NULL) { fprintf(stderr, "mymalloc: не удалось выделить %zd байт\n", size); exit(EXIT_FAILURE); } return result; } void* myrealloc(void *ptr, size_t size) { void *res = realloc(ptr, size); if (res == NULL && size != 0) { fprintf(stderr, "myrealloc: не удалось выделить %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); } void printMatrix(const Matrix *matrix) { int m = matrix -> m, n = matrix -> n; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%d", matrix -> data[i * n + j]); } printf("\n"); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д