Під видаленням елемента з масиву будемо розуміти:
Це стандартний алгоритм, для якого зробимо функцію.
Напишіть функцію з прототипом 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--; // Зменшення кількості елементів
}
Знаходить індекс першого парного елемента:
Видаляє елемент з масиву за індексом:
Введіть початок інтервалу a: 1
Введіть кінець інтервалу b: 10
Введіть кількість елементів масиву n: 5
Початковий масив: 3 8 5 2 7
Масив після видалення: 3 5 2 7
Введіть початок інтервалу a: 1
Введіть кінець інтервалу b: 9
Введіть кількість елементів масиву n: 4
Початковий масив: 3 7 5 9
error: парні елементи відсутні
Введіть початок інтервалу a: 2
Введіть кінець інтервалу b: 10
Введіть кількість елементів масиву n: 3
Початковий масив: 3 4 8
Масив після видалення: 3 8
Ця програма демонструє роботу з масивом, пошук конкретних елементів та їх видалення. Особливістю реалізації є логічне видалення елемента шляхом зсуву наступних елементів та зменшення лічильника розміру масиву.
Якщо з масиву видаляється два елемента, то спочатку потрібно видалити елемент з більшим індексом, а потім елемент з меншим індексом.
Якщо з масиву видаляється багато елементів (функція видалення використовується у циклі), то для видалення масив потрібно переглядати починаючи з останнього елемента. Інакше, з двох елементів, що потребують видалення та стоять поряд буде видалено лише один.
Напишіть програму, яка:
#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--; // Зменшення кількості елементів
}
Заповнює масив випадковими числами в заданому діапазоні [a, b].
Виводить елементи масиву на екран.
Видаляє елемент з масиву за індексом:
Введіть початок інтервалу a: 1
Введіть кінець інтервалу b: 10
Введіть кількість елементів масиву n: 6
Початковий масив: 3 8 5 2 7 4
Масив після видалення парних елементів: 3 5 7
Введіть початок інтервалу a: 1
Введіть кінець інтервалу b: 9
Введіть кількість елементів масиву n: 5
Початковий масив: 3 7 5 9 1
Масив після видалення парних елементів: 3 7 5 9 1
Введіть початок інтервалу a: 2
Введіть кінець інтервалу b: 10
Введіть кількість елементів масиву n: 4
Початковий масив: 4 6 8 2
Масив після видалення парних елементів:
Ця програма демонструє видалення всіх парних елементів з масиву. Особливістю реалізації є перегляд масиву з кінця, що дозволяє коректно видаляти елементи без порушення порядку ітерації. Програма коректно обробляє випадки, коли парних елементів немає або коли вони становлять весь масив.
Помилковий код та результат роботи, якщо масив переглядається починаючи з першого елементу:


Зі скріншота видно, що з двох, розташованих поруч парних чисел 92 і 44 видалено тільки число 92. Це зрозуміло, так як після його видалення число 44 зміститься вліво і вже не буде перевірятися. Аналогічно для чисел 88 та 66.
Одновимірний масив заповнювати випадковими числами за допомогою функції RandArr та виводити на екран за допомогою функції PrintArr.
Видаляти елемент за допомогою функції DelArr.
Якщо за умови завдання вказується, використовувати функції пошуку.