Удаление нулевых строк/ столбцов из матрицы - C (СИ)

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

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

Добрый день! помогите написать код, желательно на С Тема: многомерные массивы Выделить память под многомерный массив, заполнить его произвольным образом, передать обрабатывающей функции и получить её результат ( входная матрица остаётся неизменной, на выходе должно быть новое число или массив) Задание: Удалить из матрицы все нулевые строки и столбцы ( в этом и заключается вся проблема)

Решение задачи: «Удаление нулевых строк/ столбцов из матрицы»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. int** matrix_input(FILE* _in, int* N, int* M);
  4. void  matrix_remzero(int** mat, int* N, int* M);
  5. void  matrix_free(int** mat, int N);
  6.  
  7.  
  8. int main(void){
  9.     int  i, j, N, M, **mat;
  10.  
  11. /*  ввод из файла
  12.     FILE* fp = fopen("file.txt", "rt");
  13.     mat = matrix_input(fp, &N, &M);
  14.     fclose(fp);
  15. */
  16.     //ввод с консоли
  17.     mat = matrix_input(stdin, &N, &M);
  18.     if(mat == NULL){
  19.         puts("error");
  20.         return 1;
  21.     }
  22.  
  23.     //удалить 0
  24.     matrix_remzero(mat, &N, &M);
  25.  
  26.     for(i = 0; i < N; ++i){
  27.         for(j = 0; j < M; ++j)
  28.             printf("%d ", mat[i][j]);
  29.         putchar('\n');
  30.     }
  31.     matrix_free(mat, N);
  32.     getchar();
  33.     return 0;
  34. }
  35.  
  36. //удаление нулевых строк/столбцов
  37. void matrix_remzero(int** mat, int* N, int* M){
  38.     int i, j, k, n = *N, m = *M;
  39.  
  40.     //удаляем нулевые столбцы
  41.     for(j = 0; j < m; ++j){
  42.         i = 0;
  43.         while((i < n) && (mat[i][j] == 0))
  44.             ++i;
  45.         if(i == n)
  46.             break;
  47.     }
  48.  
  49.     for(i = j; j < *M; ){
  50.         k = 0;
  51.         while((k < n) && (mat[k][j] == 0))
  52.             ++k;
  53.  
  54.         if(k < n)
  55.             ++i;
  56.         else
  57.             --m;
  58.  
  59.         if(++j >= *M)
  60.             break;
  61.  
  62.         for(k = 0; k < n; ++k)
  63.             mat[k][i] = mat[k][j];
  64.     }
  65.     *M = m;
  66.  
  67.     //удаляем нулевые строки
  68.     for(i = 0; i < n; ++i){
  69.         j = 0;
  70.         while((j < m) && (mat[i][j] == 0))
  71.             ++j;
  72.         if(j == m)
  73.             break;
  74.     }
  75.  
  76.     for(j = i; j < *N; ){
  77.         k = 0;
  78.         while((k < m) && (mat[j][k] == 0))
  79.             ++k;
  80.  
  81.         if(k < m)
  82.             ++i;
  83.         else
  84.             --n;
  85.  
  86.         if(++j >= *N)
  87.             break;
  88.  
  89.         for(k = 0; k < m; ++k)
  90.             mat[i][k] = mat[j][k];
  91.     }
  92.  
  93.     //удалить лишние строки
  94.     for(i = n; i < *N; ++i)
  95.         free(mat[i]);
  96.     *N = n;
  97. }
  98.  
  99. /* ввод матрицы из консоли/файла, пример:
  100.    3 5
  101.    1 2 0 4 0
  102.    0 0 0 0 0
  103.    6 7 0 4 0   */
  104. int** matrix_input(FILE* _in, int* N, int* M){
  105.     int** mat, n, m, i, j;
  106.  
  107.     if((_in == NULL) || (fscanf(_in, "%d %d", &n, &m) != 2) || (n <= 0) || (m <= 0))
  108.         return NULL;
  109.  
  110.     mat = (int**)malloc(sizeof(int*) * n);
  111.     if(mat == NULL)
  112.         return NULL;
  113.  
  114.     for(i = 0; i < n; ++i){
  115.         mat[i] = (int*)malloc(sizeof(int) * m);
  116.         if(mat[i] == NULL){
  117.             n = i;
  118.             goto err;
  119.         }
  120.  
  121.         for(j = 0; j < m; ++j){
  122.             if((fscanf(_in, "%d", &mat[i][j]) != 1) || (ferror(_in) != 0)){
  123.                 n = i;
  124.                 goto err;
  125.             }
  126.         }
  127.     }
  128.     *N = n;
  129.     *M = m;
  130.     return mat;
  131. err:
  132.     matrix_free(mat, n);
  133.     return NULL;
  134. }
  135.  
  136. //освобождение памяти из под матрицы
  137. void matrix_free(int** mat, int N){
  138.     int i;
  139.     for(i = 0; i < N; ++i){
  140.         if(mat[i] != NULL){
  141.             free(mat[i]);
  142.             mat[i] = NULL;
  143.         }
  144.     }
  145.     if(mat != NULL)
  146.         free(mat);
  147. }

Объяснение кода листинга программы

В данном коде реализована функция matrix_remzero, которая удаляет нулевые строки и столбцы из матрицы, представленная в виде двумерного массива mat размером N на M.

  1. Сначала определяется размер матрицы N и M.
  2. Затем в цикле перебираются все элементы матрицы. Если элемент равен нулю, то его позиция помечается как свободная.
  3. После этого происходит удаление нулевых строк и столбцов.
  4. Если в процессе удаления обнаруживается, что матрица стала пустой, то возвращается значение ошибки.
  5. В конце функция возвращает указатель на матрицу. Функция matrix_input используется для ввода матрицы из файла или с консоли. В случае ввода с консоли или ошибки ввода, матрица считается пустой и возвращается значение ошибки. Функция matrix_free освобождает память, выделенную под матрицу. В основной функции происходит следующее:
  6. Ввод матрицы с помощью функции matrix_input.
  7. Вызов функции matrix_remzero для удаления нулевых строк и столбцов.
  8. Вывод матрицы на экран с помощью цикла for.
  9. Освобождение памяти с помощью функции matrix_free.
  10. Ввод символа с помощью getchar() для обработки остального ввода.
  11. Возврат значения 0, указывающего на успешное выполнение программы.

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


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

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

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы