Удалить из квадратной матрицы главную диагональ, при этом элементы верхнего треугольника сместить влево - C (СИ)

Узнай цену своей работы

Формулировка задачи:

void removeDiagT (Matrix *a); Удаляет из квадратной матрицы a главную диагональ, при этом элементы верхнего треугольника смещаются влево.
#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");
}
}
Пример. Исходная матрица: 1 2 3 4 5 6 7 8 9 Вызов: 2 3 4 6 7 8 Не работает. Что не так с free?

Решение задачи: «Удалить из квадратной матрицы главную диагональ, при этом элементы верхнего треугольника сместить влево»

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");
}
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы