Сжать массив, удалив из него все элементы, кратные заданному числу k. - C (СИ)
Формулировка задачи:
Дан массив A[n]. Сжать массив, удалив из него все элементы, кратные заданному числу k. Освободившиеся в конце массива элементы заполнить нулями. Напишите программу желательно на Си. Заранее благодарен
Решение задачи: «Сжать массив, удалив из него все элементы, кратные заданному числу k.»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#define SIZE 10
#define MULTIPLER 3
void dump(const int * arr, size_t size) {
while ( size-- )
printf("%d%c", *arr++, ( size ) ? ' ' : '\n');
}
int * remove_multipled(int * arr, size_t size, int multipler) {
size_t left = size;
int * ptr = arr;
while ( left-- ) {
if ( *ptr % multipler )
++ptr;
else
memmove(ptr, ptr + 1, sizeof(int) * left);
}
memset(ptr, 0, sizeof(int) * ( size - ( ptr - arr ) ));
return arr;
}
int main(void) {
int arr1[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[SIZE] = { 3, 2, 1, 6, 4, 5, 10, 7, 8, 9 };
int arr3[SIZE] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int arr4[SIZE] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 };
printf("ARRAY #1 Before:\n");
dump(arr1, SIZE);
remove_multipled(arr1, SIZE, MULTIPLER);
printf("After:\n");
dump(arr1, SIZE);
printf("\n");
printf("ARRAY #2 Before:\n");
dump(arr2, SIZE);
remove_multipled(arr2, SIZE, MULTIPLER);
printf("After:\n");
dump(arr2, SIZE);
printf("\n");
printf("ARRAY #3 Before:\n");
dump(arr3, SIZE);
remove_multipled(arr3, SIZE, MULTIPLER);
printf("After:\n");
dump(arr3, SIZE);
printf("\n");
printf("ARRAY #4 Before:\n");
dump(arr4, SIZE);
remove_multipled(arr4, SIZE, MULTIPLER);
printf("After:\n");
dump(arr4, SIZE);
printf("\n");
return 0;
}
Объяснение кода листинга программы
- В функции
remove_multipledпроисходит удаление всех элементов массива, кратных заданному числуmultipler. - В функции
mainсоздаются 4 массива с разными значениями для проверки работы функцииremove_multipled. - Функция
dumpиспользуется для вывода содержимого массивов перед и после удаления элементов. - В функции
remove_multipledпроисходит смещение элементов массива, начиная с первого не кратногоmultiplerэлемента, на позицию следующего не кратногоmultiplerэлемента. Таким образом, все элементы, кратныеmultipler, удаляются. - В конце функции
remove_multipledвсе оставшиеся элементы массива, начиная с последнего не кратногоmultiplerэлемента, обнуляются для освобождения памяти. - Функция
mainвызывает функциюremove_multipledдля каждого из созданных массивов и выводит результат на экран.