Назад Зміст Вперед

Функція видалення елементу з масиву

Видалення одного елементу

Під видаленням елемента з масиву будемо розуміти:

  1. Видалення цього елемента з масиву шляхом зміщення всіх наступних елементів вліво на одну позицію;
  2. Зменшення кількості елементів масиву на 1, причому фізично пам'ять не звільняється, бо масив не динамічний.

Це стандартний алгоритм, для якого зробимо функцію.

Приклад 1

Напишіть функцію з прототипом void DelArr(int* arr, int& n, int k), яка видаляє елемент з індексом k з масиву arr. Функція зменшує n - кількість елементів масиву на 1.

Напишіть програму, яка:

Повний код програми

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void RandArr(int* arr, int n, int a, int b);
void PrintArr(int* arr, int n);
int FindFirst(int* arr, int n);
void DelArr(int* arr, int& n, int k);

int main() {
    srand(time(0));  // Ініціалізація генератора випадкових чисел
    
    int a, b, n;
    cout << "Введіть початок інтервалу a: ";
    cin >> a;
    cout << "Введіть кінець інтервалу b: ";
    cin >> b;
    cout << "Введіть кількість елементів масиву n: ";
    cin >> n;
    
    int mass[n];  // Оголошення масиву
    
    RandArr(mass, n, a, b);  // Заповнення масиву
    cout << "Початковий масив: ";
    PrintArr(mass, n);       // Виведення масиву
    
    int index = FindFirst(mass, n);  // Пошук першого парного елемента
    
    if (index == -1) {
        cout << "error: парні елементи відсутні";
    } else {
        DelArr(mass, n, index);  // Видалення елемента
        cout << "Масив після видалення: ";
        PrintArr(mass, n);
    }
    
    return 0;
}

void RandArr(int* arr, int n, int a, int b) {
    for (int i = 0; i < n; i++) {
        arr[i] = a + rand() % (b - a + 1);
    }
}

void PrintArr(int* arr, int n) {
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

int FindFirst(int* arr, int n) {
    for (int i = 0; i < n; i++) {
        if (arr[i] % 2 == 0) {  // Перевірка на парність
            return i;
        }
    }
    return -1;  // Якщо парних елементів немає
}

void DelArr(int* arr, int& n, int k) {
    if (k < 0 || k >= n) return;  // Перевірка коректності індексу
    
    // Зсув елементів ліворуч, починаючи з k+1
    for (int i = k; i < n - 1; i++) {
        arr[i] = arr[i + 1];
    }
    
    n--;  // Зменшення кількості елементів
}

Пояснення функцій

FindFirst

Знаходить індекс першого парного елемента:

DelArr

Видаляє елемент з масиву за індексом:

Тестування роботи програми

Тест 1 (є парні елементи):

Введіть початок інтервалу a: 1
Введіть кінець інтервалу b: 10
Введіть кількість елементів масиву n: 5
Початковий масив: 3 8 5 2 7 
Масив після видалення: 3 5 2 7

Тест 2 (немає парних елементів):

Введіть початок інтервалу a: 1
Введіть кінець інтервалу b: 9
Введіть кількість елементів масиву n: 4
Початковий масив: 3 7 5 9 
error: парні елементи відсутні

Тест 3 (видалення останнього елемента):

Введіть початок інтервалу a: 2
Введіть кінець інтервалу b: 10
Введіть кількість елементів масиву n: 3
Початковий масив: 3 4 8 
Масив після видалення: 3 8

Ця програма демонструє роботу з масивом, пошук конкретних елементів та їх видалення. Особливістю реалізації є логічне видалення елемента шляхом зсуву наступних елементів та зменшення лічильника розміру масиву.

Видалення декількох елементів

Якщо з масиву видаляється два елемента, то спочатку потрібно видалити елемент з більшим індексом, а потім елемент з меншим індексом.

Якщо з масиву видаляється багато елементів (функція видалення використовується у циклі), то для видалення масив потрібно переглядати починаючи з останнього елемента. Інакше, з двох елементів, що потребують видалення та стоять поряд буде видалено лише один.

Приклад 2

Напишіть програму, яка:

Повний код програми

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void RandArr(int* arr, int n, int a, int b);
void PrintArr(int* arr, int n);
void DelArr(int* arr, int& n, int k);

int main() {
    srand(time(0));  // Ініціалізація генератора випадкових чисел
    
    int a, b, n;
    cout << "Введіть початок інтервалу a: ";
    cin >> a;
    cout << "Введіть кінець інтервалу b: ";
    cin >> b;
    cout << "Введіть кількість елементів масиву n: ";
    cin >> n;
    
    int mass[n];  // Оголошення масиву
    
    RandArr(mass, n, a, b);  // Заповнення масиву
    cout << "Початковий масив: ";
    PrintArr(mass, n);       // Виведення масиву
    
    // Перегляд масиву з кінця та видалення парних елементів
    for(int i = n - 1; i >= 0; i--) {
        if(mass[i] % 2 == 0) {  // Перевірка на парність
            DelArr(mass, n, i);
        }
    }
    
    cout << "Масив після видалення парних елементів: ";
    PrintArr(mass, n);
    
    return 0;
}

void RandArr(int* arr, int n, int a, int b) {
    for (int i = 0; i < n; i++) {
        arr[i] = a + rand() % (b - a + 1);
    }
}

void PrintArr(int* arr, int n) {
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

void DelArr(int* arr, int& n, int k) {
    if (k < 0 || k >= n) return;  // Перевірка коректності індексу
    
    // Зсув елементів ліворуч, починаючи з k+1
    for (int i = k; i < n - 1; i++) {
        arr[i] = arr[i + 1];
    }
    
    n--;  // Зменшення кількості елементів
}

Пояснення функцій

RandArr

Заповнює масив випадковими числами в заданому діапазоні [a, b].

PrintArr

Виводить елементи масиву на екран.

DelArr

Видаляє елемент з масиву за індексом:

Тестування роботи програми

Тест1 (з парними елементами):

Введіть початок інтервалу a: 1
Введіть кінець інтервалу b: 10
Введіть кількість елементів масиву n: 6
Початковий масив: 3 8 5 2 7 4 
Масив після видалення парних елементів: 3 5 7

Тест 2 (без парних елементів):

Введіть початок інтервалу a: 1
Введіть кінець інтервалу b: 9
Введіть кількість елементів масиву n: 5
Початковий масив: 3 7 5 9 1 
Масив після видалення парних елементів: 3 7 5 9 1

Тест 3 (усі елементи парні):

Введіть початок інтервалу a: 2
Введіть кінець інтервалу b: 10
Введіть кількість елементів масиву n: 4
Початковий масив: 4 6 8 2 
Масив після видалення парних елементів: 

Ця програма демонструє видалення всіх парних елементів з масиву. Особливістю реалізації є перегляд масиву з кінця, що дозволяє коректно видаляти елементи без порушення порядку ітерації. Програма коректно обробляє випадки, коли парних елементів немає або коли вони становлять весь масив.

Помилковий код та результат роботи, якщо масив переглядається починаючи з першого елементу:

Зі скріншота видно, що з двох, розташованих поруч парних чисел 92 і 44 видалено тільки число 92. Це зрозуміло, так як після його видалення число 44 зміститься вліво і вже не буде перевірятися. Аналогічно для чисел 88 та 66.

Варіанти задач

Одновимірний масив заповнювати випадковими числами за допомогою функції RandArr та виводити на екран за допомогою функції PrintArr.

Видаляти елемент за допомогою функції DelArr.

Якщо за умови завдання вказується, використовувати функції пошуку.

Варіант 1

  1. Видалити з масиву перше від’ємне число. Додатково використовувати функцію FindFirst.
  2. Видалити з масиву всі непарні числа.

Варіант 2

  1. Видалити з масиву останнє парне число. Додатково використовувати функцію FindLast.
  2. Видалити з масиву всі від’ємні числа.

Варіант 3

  1. Видалити з масиву перше число, яке закінчується на цифру 0. Додатково використовувати функцію FindFirst.
  2. Видалити з масиву всі числа, які кратні С.

Варіант 4

  1. Видалити з масиву останнє число, яке більше числа 10. Додатково використовувати функцію FindLast.
  2. Видалити з масиву всі числа, які кратні 3 або 5.

Варіант 5

  1. Видалити з масиву перше число, яке кратне 3 або 5. Додатково використовувати функцію FindFirst.
  2. Видалити з масиву всі числа, які меньші числа Х.

Варіант 6

  1. Видалити з масиву перше число, яке кратне своїй останній цифрі. Додатково використовувати функцію FindFirst.
  2. Видалити з масиву всі числа, які кратні числу В і закінчуються на цифру С.

Варіант 7

  1. Видалити з масиву останнє число, яке кратно числу 3 і закінчується на цифру 2. Додатково використовувати функцію FindLast.
  2. Видалити з масиву всі числа, які кратні своїй останній цифрі.

Варіант 8

  1. Видалити з масиву останнє максимальне число. Додатково використовувати функцію IndMax.
  2. Видалити з масиву всі максимальні числа. Додатково використовувати функцію IndMax.

Варіант 9

  1. Видалити з масиву перше мінімальне число. Додатково використовувати функцію IndMin.
  2. Видалити з масиву всі мінімальні числа. Додатково використовувати функцію IndMin.

Варіант 10

  1. Видалити з масиву останнє число, у якого перша цифра парна. Додатково використовувати функції FindLast та FirstDig.
  2. Видалити з масиву всі числа між першим мінімальним і першим максимальним. Додатково використовувати функції IndMin та IndMax.

Варіант 11

  1. Видалити з масиву два числа: перше мінімальне та перше максимальне. Додатково використовувати функції IndMin та IndMax.
  2. Видалити з масиву всі числа, у яких перша цифра парна. Додатково використовувати функцію FirstDig.

Варіант 12

  1. Видалити з масиву останнє число, яке починається на цифру 5. Додатково використовувати функції FindLast та FirstDig.
  2. Видалити з масиву всі числа, в запису яких є цифра 5. Додатково використовувати функцію NumDigCofA.

Варіант 13

  1. Видалити з масиву перше число, в запису якого є цифра 5. Додатково використовувати функції FindFirst та NumDigCofA.
  2. Видалити з масиву всі числа, які починаються на цифру С. Додатково використовувати функцію FirstDig.

Варіант 14

  1. Видалити з масиву останнє число, яке складається з однакових цифр (включаючи однозначні). Додатково використовувати функції FindLast, NumDigCofA та NumDig.
  2. Видалити з масиву всі числа, які починаються та закінчуються однаковими цифрами (окрім однозначних). Додатково використовувати функцію FirstDig.

Варіант 15

  1. Видалити з масиву перше число, яке починається та закінчується однаковими цифрами (окрім однозначних). Додатково використовувати функції FindFirst та FirstDig.
  2. Видалити з масиву всі числа, які складаються з однакових цифр (включаючи однозначні). Додатково використовувати функції NumDigCofA та NumDig.

Варіант 16

  1. Видалити з масиву перше просте число. Додатково використовувати функції FindFirst та IsPrime.
  2. Видалити з масиву всі числа, у яких цифри розташовані за зростанням (137, 49). Додатково написати функцію з прототипом bool IsAsc(int n), яка визначає, чи розташовані цифри числа n за зростанням?

Варіант 17

  1. Видалити з масиву останнє число, у якого цифри розташовані за спаданням (731, 94). Додатково використовувати функцію FindLast та написати функцію з прототипом bool IsDesc(int n), яка визначає, чи розташовані цифри числа n за спаданням?
  2. Видалити з масиву всі прості числа. Додатково використовувати функцію IsPrime.

Назад Зміст Вперед