Удалить столбцы, в которых есть хотя бы 1 нулевой элемент - C (СИ)
Формулировка задачи:
удалить столбцы, в которых есть хотя бы 1 нулевой элемент. В чем ошибка. Ниже привел только функцию
int udalstolb(int n, int m, int (*a)[20])
{int *i,*j,*u;
for(j=*a;j<*a+20*n;j++)
{
for(i=j;i<j+20*n;i+=20)
if(*i==0)
break;
if (i==j+n*20) continue;
for(u=j;u<*a+m-1;u++)
for(i=u;i<u+20*n;i+=20)
*i=*(i+1);
m--;
j--;
}
return m;
}Решение задачи: «Удалить столбцы, в которых есть хотя бы 1 нулевой элемент»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9
#define M 18
void del_col(int*, int, int, int, int);
int main()
{
int i, j, A[N][M], count = 0;
srand(time(NULL));
for(i = 0; i < N; i++, putchar('\n'))
for(j = 0; j < M; j++)
printf("%3d", A[i][j] = rand() % 18);
for(i = 0; i < N; i++)
for(j = 0; j < M - count; j++)
if(A[i][j] == 0){
del_col(A[0], N, M, count, j);
count++;
j--;
}
puts("Reduced array:");
for(i = 0; i < N; i++, putchar('\n'))
for(j = 0; j < M - count; j++)
printf("%3d", A[i][j]);
putchar('\n');
return 0;
}
void del_col(int* arr, int nRow, int nCol, int count, int k)
{
for(int i = 0; i < nRow; i++)
for(int j = k; j < nCol - count - 1; j++)
*(arr + i * nCol + j) = *(arr + i * nCol + j + 1);
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем функцию
del_col, которая будет удалять столбцы с нулевыми элементами - Задаем размер массива
NиM - Инициализируем массив
Aслучайными значениями от 0 до 18 - Считаем количество нулевых элементов в массиве и сохраняем их позиции в отдельный массив
count - Используя два вложенных цикла, удаляем нулевые столбцы, вызывая функцию
del_col - Выводим уменьшенный массив на экран
- Возвращаем 0, чтобы указать, что программа успешно завершилась
- В функции
del_colиспользуем два вложенных цикла для перебора элементов массива - Заменяем нулевые элементы на следующие элементы в столбце, начиная с элемента с индексом
k - Возвращаем 0, чтобы указать, что функция успешно завершилась