Удаление нулевых строк/ столбцов из матрицы - C (СИ)
Формулировка задачи:
Добрый день! помогите написать код, желательно на С
Тема: многомерные массивы
Выделить память под многомерный массив, заполнить его произвольным образом, передать обрабатывающей функции и получить её результат ( входная матрица остаётся неизменной, на выходе должно быть новое число или массив)
Задание:
Удалить из матрицы все нулевые строки и столбцы ( в этом и заключается вся проблема)
Решение задачи: «Удаление нулевых строк/ столбцов из матрицы»
textual
Листинг программы
- #include <stdio.h>
- #include <malloc.h>
- int** matrix_input(FILE* _in, int* N, int* M);
- void matrix_remzero(int** mat, int* N, int* M);
- void matrix_free(int** mat, int N);
- int main(void){
- int i, j, N, M, **mat;
- /* ввод из файла
- FILE* fp = fopen("file.txt", "rt");
- mat = matrix_input(fp, &N, &M);
- fclose(fp);
- */
- //ввод с консоли
- mat = matrix_input(stdin, &N, &M);
- if(mat == NULL){
- puts("error");
- return 1;
- }
- //удалить 0
- matrix_remzero(mat, &N, &M);
- for(i = 0; i < N; ++i){
- for(j = 0; j < M; ++j)
- printf("%d ", mat[i][j]);
- putchar('\n');
- }
- matrix_free(mat, N);
- getchar();
- return 0;
- }
- //удаление нулевых строк/столбцов
- void matrix_remzero(int** mat, int* N, int* M){
- int i, j, k, n = *N, m = *M;
- //удаляем нулевые столбцы
- for(j = 0; j < m; ++j){
- i = 0;
- while((i < n) && (mat[i][j] == 0))
- ++i;
- if(i == n)
- break;
- }
- for(i = j; j < *M; ){
- k = 0;
- while((k < n) && (mat[k][j] == 0))
- ++k;
- if(k < n)
- ++i;
- else
- --m;
- if(++j >= *M)
- break;
- for(k = 0; k < n; ++k)
- mat[k][i] = mat[k][j];
- }
- *M = m;
- //удаляем нулевые строки
- for(i = 0; i < n; ++i){
- j = 0;
- while((j < m) && (mat[i][j] == 0))
- ++j;
- if(j == m)
- break;
- }
- for(j = i; j < *N; ){
- k = 0;
- while((k < m) && (mat[j][k] == 0))
- ++k;
- if(k < m)
- ++i;
- else
- --n;
- if(++j >= *N)
- break;
- for(k = 0; k < m; ++k)
- mat[i][k] = mat[j][k];
- }
- //удалить лишние строки
- for(i = n; i < *N; ++i)
- free(mat[i]);
- *N = n;
- }
- /* ввод матрицы из консоли/файла, пример:
- 3 5
- 1 2 0 4 0
- 0 0 0 0 0
- 6 7 0 4 0 */
- int** matrix_input(FILE* _in, int* N, int* M){
- int** mat, n, m, i, j;
- if((_in == NULL) || (fscanf(_in, "%d %d", &n, &m) != 2) || (n <= 0) || (m <= 0))
- return NULL;
- mat = (int**)malloc(sizeof(int*) * n);
- if(mat == NULL)
- return NULL;
- for(i = 0; i < n; ++i){
- mat[i] = (int*)malloc(sizeof(int) * m);
- if(mat[i] == NULL){
- n = i;
- goto err;
- }
- for(j = 0; j < m; ++j){
- if((fscanf(_in, "%d", &mat[i][j]) != 1) || (ferror(_in) != 0)){
- n = i;
- goto err;
- }
- }
- }
- *N = n;
- *M = m;
- return mat;
- err:
- matrix_free(mat, n);
- return NULL;
- }
- //освобождение памяти из под матрицы
- void matrix_free(int** mat, int N){
- int i;
- for(i = 0; i < N; ++i){
- if(mat[i] != NULL){
- free(mat[i]);
- mat[i] = NULL;
- }
- }
- if(mat != NULL)
- free(mat);
- }
Объяснение кода листинга программы
В данном коде реализована функция matrix_remzero
, которая удаляет нулевые строки и столбцы из матрицы, представленная в виде двумерного массива mat
размером N
на M
.
- Сначала определяется размер матрицы
N
иM
. - Затем в цикле перебираются все элементы матрицы. Если элемент равен нулю, то его позиция помечается как свободная.
- После этого происходит удаление нулевых строк и столбцов.
- Если в процессе удаления обнаруживается, что матрица стала пустой, то возвращается значение ошибки.
- В конце функция возвращает указатель на матрицу.
Функция
matrix_input
используется для ввода матрицы из файла или с консоли. В случае ввода с консоли или ошибки ввода, матрица считается пустой и возвращается значение ошибки. Функцияmatrix_free
освобождает память, выделенную под матрицу. В основной функции происходит следующее: - Ввод матрицы с помощью функции
matrix_input
. - Вызов функции
matrix_remzero
для удаления нулевых строк и столбцов. - Вывод матрицы на экран с помощью цикла
for
. - Освобождение памяти с помощью функции
matrix_free
. - Ввод символа с помощью
getchar()
для обработки остального ввода. - Возврат значения 0, указывающего на успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д