8.3 Наследование и полиморфизм

8.3.1 Правила тревоги

Условие

Объявите абстрактный класс AlarmRule с публичным виртуальным деструктором и чисто виртуальным методом bool is_alarm(int value) const. Создайте два производных класса: AboveThreshold, для которого тревога возникает при value ≥ threshold, и OutsideRange, для которого тревога возникает при value < lower или value > upper. Границы и порог задаются конструкторами и хранятся в закрытых полях. Переопределённые методы пометьте override.

Реализуйте функцию int count_alarms(const int values[], int count, const AlarmRule &rule). Она подсчитывает тревожные значения, вызывая виртуальный метод правила. Внутри функции не проверяйте конкретный тип правила.

В main прочитайте значения и настройки, создайте оба правила и вызовите одну и ту же функцию сначала для порогового правила, затем для диапазонного.

Ограничения

Время: 2 секунды. Память: 64 МиБ. Вывод: до 2 МиБ. Язык: C++17.

Входные данные

В первой строке вводится N, во второй — N целых значений. В третьей строке вводятся threshold lower upper. Ограничения: 1 ≤ N ≤ 1000, все значения и настройки находятся в диапазоне от −10000 до 10000, lower ≤ upper.

Выходные данные

Два целых числа через пробел — количество тревог для AboveThreshold и для OutsideRange соответственно.

Примеры

Вход 1
5
10 20 30 40 50
30 20 40
Ожидаемый выход
3 2
Вход 2
3
5 5 5
5 5 5
Ожидаемый выход
3 0
Вход 3
4
-10 0 10 20
100 -10 20
Ожидаемый выход
0 0

Пробный запуск

Код берётся из редактора. Запуск не создаёт посылку и не влияет на баллы.

Выберите пример или введите свои данные и нажмите «Запустить».

Текущая попытка

Отправьте решение. Этапы и результат появятся здесь автоматически.

Все попытки

Войдите, чтобы видеть свои попытки.

Редактор

Один файл до 64 КиБ · Tab / Shift+Tab — отступ · Esc — выход из редактора · черновик сохраняется для этого аккаунта, задачи и языка.