Сжать массив, удалив из него все элементы, кратные заданному числу 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;
}

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

  1. В функции remove_multipled происходит удаление всех элементов массива, кратных заданному числу multipler.
  2. В функции main создаются 4 массива с разными значениями для проверки работы функции remove_multipled.
  3. Функция dump используется для вывода содержимого массивов перед и после удаления элементов.
  4. В функции remove_multipled происходит смещение элементов массива, начиная с первого не кратного multipler элемента, на позицию следующего не кратного multipler элемента. Таким образом, все элементы, кратные multipler, удаляются.
  5. В конце функции remove_multipled все оставшиеся элементы массива, начиная с последнего не кратного multipler элемента, обнуляются для освобождения памяти.
  6. Функция main вызывает функцию remove_multipled для каждого из созданных массивов и выводит результат на экран.

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


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

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

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