1. Написать программу, моделирующую работу туристической фирмы.

    Сведения о каждом туре: название страны, название города, список достопримечательностей, количество дней, вид проезда (автобус, поезд, самолет, теплоход), стоимость, максимальное количество туристов в группе.

    Сведения о каждом туристе: фамилия, имя, отчество, пожелания (страна, обязательная достопримечательность, вид проезда, диапазон количества дней, диапазон приемлемой стоимости). Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить тур или туриста.
    2. Разделить всех туристов на туристические группы с общими пожеланиями по стране и виду проезда.
    3. Для заданного туриста вывести на экран все подходящие туры.
    4. Отправить группу в тур: для заданного тура вывести на экран список всех подходящих туристов; предложить пользователю выбрать туристов, контролируя общее количество туристов в группе; выбранных туристов вывести списком в отдельный файл (название запросить у пользователя) и удалить из базы.
    5. Составить статистику: для каждой страны вывести на экран
      • количество туров,
      • количество городов для посещения,
      • количество достопримечательностей,
      • среднее количество дней,
      • самый распространённый вид транспорта,
      • средняя стоимость,
      • количество желающих туристов,
      • самый распространённый вид транспорта среди желающих поехать в эту страну туристов.
    6. Найти потенциально неприбыльный тур: вывести на экран тур, для которого на данный момент потенциальная прибыль (стоимость * количество подходящих туристов) наименьшая.
  2. Написать программу, моделирующую работу отделения телекоммуникационной компании, обслуживающей домашние телефоны.

    Сведения об абоненте: фамилия, имя, шестизначный номер телефона, тарифный план, общее количество минут телефонных разговоров за последний месяц.

    • Безлимитный тариф
      • Объём минут: не ограничен
      • Ежемесячная плата, руб.: 420,00
      • Стоимость минуты сверх объёма, руб.: 0,00
    • Комбинированный
      • Объём минут: 350
      • Ежемесячная плата, руб.: 300,00
      • Стоимость минуты сверх объёма, руб.: 0,34
    • Повременный
      • Объём минут: 0
      • Ежемесячная плата, руб.: 180,00
      • Стоимость минуты сверх объёма, руб.: 0,38

    Начальное формирование данных осуществляется из файла (или файлов). С помощью меню необходимо обеспечить следующие функции:

    1. Добавить абонента с предоставлением ему уникального, ещё не занятого индивидуального номера.
    2. Удалить абонента.
    3. Найти абонента по номеру телефона или фамилии.
    4. Вывести список всех абонентов, сгруппированный по тарифному плану и отсортированный по фамилии.
    5. Для заданного тарифного плана вывести на экран список всех его абонентов с расчётом оплаты за последний месяц.
    6. Составить статистику за месяц:
      • общее количество абонентов,
      • количество абонентов каждого тарифного плана,
      • средняя общая стоимость телефонной связи за месяц,
      • среднее количество минут телефонных разговоров на безлимитном тарифе,
      • среднее количество минут телефонных разговоров сверх лимита на комбинированном тарифе,
      • среднее количество минут телефонных разговоров на повременном тарифе.
    7. Найти абонентов, которые используют невыгодный тариф. Для каждого такого абонента вывести на экран:
      • фамилию, номер телефона,
      • количество минут телефонных разговоров,
      • текущий тариф и размер оплаты за месяц,
      • тариф, на котором размер оплаты был бы ниже, и размер оплаты при этом тарифе.
  3. Написать программу, моделирующую работу автобусного парка.

    Сведения о каждом маршруте: номер, количество остановок, длина маршрута (в километрах), количество автобусов, необходимых для обеспечения движения по маршруту.

    Сведения о каждом автобусе: номер автобуса, расход бензина (в литрах на километр), фамилия и имя водителя, номер маршрута, состояние (работает, простаивает, на ремонте).

    Данные об автобусах и маршрутах загружаются из файла (или из двух файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить новый маршрут/автобус.
    2. Удалить автобус по номеру.
    3. Удалить маршрут по номеру: принадлежащие ему автобусы должны сменить состояние на «простаивает» и номер маршрута на «свободен»
    4. Распределить свободные автобусы на маршруты.
    5. Сменить состояние автобуса.
    6. Переместить автобус между маршрутами.
    7. Отобразить список простаивающих/работающих/ремонтирующихся автобусов для маршрута.
    8. Проверить достаточность/избыточность работающих автобусов на маршруте.
    9. По фамилии водителя найти, на каком маршруте он сейчас работает.
    10. Составить статистику расхода бензина для маршрутов, учитывать только работающие автобусы.
  4. Написать программу, моделирующую работу биржи труда.

    Сведения о каждой вакансии: компания, название должности, отдел, оклад, требования к должности (интервал возраста, образование), количество рабочих мест.

    Сведения о каждом человеке: фамилия, имя, отчество, дата рождения, образование, специальность, желаемая зарплата, список названий нежелательных компаний. Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить вакансию/соискателя.
    2. Вывести на экран список уникальных названий должностей.
    3. Для заданной должности составить статистику: количество предложений, средний оклад, количество уникальных компаний, перечень требующегося образования.
    4. Для заданного возраста составить статистику: средний возможный оклад, средняя желательная зарплата.
    5. Найти работу: для заданного соискателя вывести список всех подходящих вакансий. Выбранную пользователем вакансию вывести в файл, пользователя удалить, количество рабочих мест в вакансии уменьшить.
    6. Найти почти работу мечты: для заданного соискателя вывести список всех почти подходящих вакансий, у которых оклад максимум на 10% ниже желательной зарплаты или у которых требующийся возраст не больше чем на год отличается от возраста соискателя.
  5. Написать программу, моделирующую обработку заявок на авиабилеты.

    Сведения о каждом рейсе: номер, пункт отправления, пункт назначения, дату и время вылета, дата и время прибытия, тип самолета, стоимость билета.

    Сведения о каждой заявке: идентификатор, пункт отправления, пункт назначения, дату и время вылета, фамилию и имя пассажира.

    Данные о рейсах и заявках загружаются из файла (или из двух файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить рейс.
    2. Добавить/удалить заявку.
    3. Удалить все заявки по заданному пункту отправления/назначения.
    4. Вывести все рейсы по заданным пунктам отправления и назначения и дню вылета.
    5. Вывести все заявки по заданным дате и времени вылета.
    6. Для заявки вывести все рейсы с соответствующими пунктами отправления и назначения и отличающиеся по дате вылета не больше, чем на двое суток.
    7. Для заявки вывести все пары рейсов, позволяющие добраться из пункта отправления в пункт назначения ровно с одной пересадкой в промежуточном пункте длительностью не более суток.
  6. Написать программу, моделирующую информационную систему на железнодорожном вокзале.

    Сведения о каждом поезде: номер, пункт отправления, пункт назначения, время отправления, дата и время прибытия, стоимость билета. Программа должна создавать список поездов. Начальное формирование данных осуществляется из файла.

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить поезд.
    2. Вывести все поезда по пункту отправления и дате отправления, принадлежащей введённому пользователем интервалу дат.
    3. Вывести все поезда по заданным пунктам отправления и назначения, дню отправления и ограничению по стоимости.
    4. Вывести список всех городов, в которые можно приехать поездом, но невозможно уехать.
    5. Вывести список всех городов с железнодорожным сообщением.
    6. По названию города и дате выяснить, какое максимальное число одновременно работающих путей необходимо в этот день, если перед отправлением и после прибытия поезда стоят ровно полчаса.
  7. Написать программу, моделирующую учет книг в библиотеке.

    Сведения о каждой книге: фамилия и инициалы автора, название, инвентаризационный номер, жанр, возрастной рейтинг, количество книг в библиотеке, количество книг на руках.

    Сведения о каждом читателе: фамилия, имя, отчество, дата рождения, список всех взятых книг с указанием даты возврата.

    Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить книгу/читателя.
    2. Удалить читателя. Считать взятые им книги утерянными, для каждой уменьшить «количество книг на руках».
    3. Удалить книгу из базы, проконтролировав её удаление из списков соответствующих читателей.
    4. Подобрать книги для заданного читателя по выбранному из списка жанру или автору (с учетом возраста читателя).
    5. Выдать книгу читателю на руки с учётом оставшихся в библиотеке экземпляров.
    6. Вернуть книгу и по заданной фактической дате возврата рассчитать штраф (1 рубль за каждый день просрочки).
    7. Вывести список книг заданного жанра, отсортированный по фамилии автора и названию.
    8. Вывести все книги без повторения, которые на заданную дату имеют просроченные не сданные экземпляры.
  8. Написать программу, моделирующую процесс купли-продажи квартир.

    Сведения о каждой доступной квартире: метраж, количество комнат, адрес (район, улица, дом), этаж, вид дома (панельный, кирпичный), количество этажей, стоимость.

    Сведения о каждой заявке на покупку квартиры: количество комнат, район, вид дома.

    Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить квартиру/заявку.
    2. Вывести на экран все заявки заданного района, отсортированные по количеству комнат.
    3. Вывести на экран все квартиры, сгруппированные по району и отсортированные по метражу.
    4. Вывести на экран все квартиры по заданному диапазону стоимости.
    5. Для заданной заявки вывести на экран список подходящих и «почти подходящих» квартир: с количеством комнат, отличающимся не более, чем на 1.
    6. Выполнить заявку: для заявки из списка «почти подходящих» квартир выбрать одну. В результате и заявка, и выбранная квартира удаляются.
    7. Вывести статистику по каждому району: количество предложений продажи, средний метраж, средняя стоимость, количество заявок на покупку, потенциальный процент покрытия заявок (сколько заявок на покупку относительно общего числа заявок в этом районе имеют хотя бы одну полностью подходящую квартиру).
  9. Написать программу, моделирующую процесс обмена квартир.

    Сведения о каждой квартире: метраж, количество комнат, адрес (район, улицу, дом), этаж, вид дома (панельный, кирпичный) и количество этажей, стоимость, параметры обмена: интервал метража, интервал количества комнат, список районов, список подходящих этажей, интервал стоимости.

    Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить квартиру.
    2. Вывести на экран все квартиры, отсортированные по районам/стоимости/метражу.
    3. Вывести все варианты обмена для заданной квартиры (при которых предложения удовлетворяют все требования друг друга) с расчётом доплаты. Выбранный пользователем вариант записать в файл и удалить из базы.
    4. Для заданной квартиры найти всех соседей: предложения для обмена на той же улице.
    5. Для каждого района составить статистику: количество предложений для обмена, средняя стоимость за метр, количество предложений, желающих обменяться на квартиру в этом районе.
    6. Проверить корректность базы: дома по одинаковому адресу должны иметь равное количество этажей и вид дома. Вывести на экран все несовпадения.
  10. Написать программу, играющую роль записной книжки.

    Сведения о каждой записи: имя, фамилия, отчество человека, его сотовый и домашний телефоны, адрес, дата рождения, пол, статус (друг, коллега по работе, парикмахер и т.п.). Отчество, домашний телефон и адрес могут отсутствовать, все остальные поля обязательные.

    Начальное формирование данных осуществляется из файла (или файлов). С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить знакомого.
    2. Изменить адрес, телефон, статус.
    3. Вывести список всех дней рождения, сгруппированный по месяцам.
    4. Отобразить список всех имеющихся статусов. По выбранному из списка статусу и событию сформировать список приглашенных лиц (вывести в отдельный файл с заданным пользователем названием), для каждого создать отдельный файл с соответствующим названием (например, IvanovBirthday.txt, PetrovBirthday.txt), содержащий внутри: обращение и текст приглашения.
    5. Составить статистику знакомых:
      • общее количество контактов,
      • количество контактов мужского и женского пола,
      • количество контактов младше 20 лет на данный момент,
      • количество контактов от 20 до 30 лет на данный момент,
      • количество контактов от 30 до 40 лет на данный момент,
      • количество контактов старше 40 лет на данный момент,
      • количество контактов каждого статуса,
      • количество контактов с указанным домашним номером,
      • количество контактов с указанным адресом.
  11. Написать программу, моделирующую работу с вкладами в банке.

    Сведения о каждом виде вклада: название, годовой процент, возможность пополнения счета.

    Сведения о каждом вкладчике: фамилия, имя, отчество, номер счета, вид вклада, сумма, дата открытия, ключевое слово, последняя дата начисления процентов.

    Начальное формирование данных осуществляется из файла (или файлов).

    При начислении процента к текущей сумме вклада добавляется (вклад * годовой процент * количество пройденных дней от последней даты зачисления до текущей даты / дней в году)

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить вклад/вкладчика.
    2. Удалить выбранный вид вклада, если у него нет вкладчиков.
    3. Закрыть счёт с заданной датой с выплатой процентов: вывести в файл (запросить название и путь у пользователя) всю информацию о вкладчике и общую сумму, удалить запись из базы.
    4. Пополнить счёт, если это возможно, по номеру счета. Для подтверждения запрашивать ключевое слово.
    5. Вывести на экран список уникальных вкладчиков, отсортированных по фамилии.
    6. Вывести на экран название наиболее популярного вида вклада, его среднюю сумму и последнюю дату открытия.
    7. Для заданной даты начислить проценты по всем счетам, у которых с последней даты начисления процентов прошло не менее месяца, и обновить дату начисления процентов.
  12. Написать программу, моделирующую работу с коммунальными платежами.

    Сведения о каждом счёте: фамилия, имя, отчество, адрес, месяц платежа, общая сумма для оплаты, внесенная сумма оплаты, вид счёта (квартплата, плата за электроэнергию, плата за телефон). Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить счёт. При добавлении нового счёта внесённая сумма оплаты обязательно равна нулю.
    2. Оплатить счёт: для выбранного пользователем счёта вывести на экран подробный запрос на оплату, считать «внесённую» пользователем сумму и добавить её к внесённой сумме оплаты.
    3. Вывести на экран все счета заданного человека.
    4. Для выбранного пользователя вывести на экран сгруппированный по виду счёта список имеющихся денег на счету или недостающей суммы.
    5. Вывести на экран отсортированный по фамилии список должников (людей, у которых общая внесённая сумма оплаты по виду счёта превосходит внесённую сумму оплаты), с указанием вида счёта.
    6. Совместить все счета в один: для заданного человека и вида счёта создать один общий счёт с единой суммой для оплаты и единой внесённой суммой оплаты, все остальные счета удалить. В качестве месяца указать последний.
    7. Запросить статистику: вывести на экран количество уникальных людей, среднюю сумму для оплаты, среднюю внесённую сумму, самый распространённый вид счёта, среднюю сумму платежа по самому распространённому виду счёта.
    8. Сформировать список людей, которым для указанного месяца не были выставлены счета по определённому виду счёта.
  13. Написать программу, моделирующую работу с расписанием занятий студентов.

    Сведения о каждом элементе расписания: день недели (понедельник - суббота), номер пары (максимум 6), название предмета, имя преподавателя, номер аудитории, название группы студентов. Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить элемент расписания, с проверкой корректности:
      1. в любой момент времени группа должна быть максимум на одном занятии;
      2. в любой момент времени преподаватель должен вести максимум один предмет, максимум в одном месте, у любого количества групп студентов. Общее число предметов у преподавателя не должно превышать 8 штук;
      3. в любой момент времени в аудитории может преподаваться максимум один предмет, максимум одним преподавателем, любому числу групп студентов.
    2. Удалить элемент расписания.
    3. Переместить элемент расписания: изменить день, номер пары и номер аудитории выбранного пользователем занятия с проверкой корректности.
    4. Для заданной группы, преподавателя или аудитории отобразить расписание на неделю.
    5. Вывести на экран всё расписание, сгруппированное по дням и номеру пары, отсортированное по номеру аудитории.
    6. Выбрать день для пересдачи: для заданного преподавателя и заданного списка групп студентов найти любые две подряд идущие пары, во время которых преподаватель и студенты свободны, и знакомую для преподавателя (в которой преподаватель ведёт хотя бы одно занятие), свободную в это время аудиторию. Если это невозможно, вывести соответствующее сообщение.
    7. Проверить нагрузку: для заданного преподавателя вывести на экран общее количество занятий в неделю, список уникальных предметов, количество различных групп студентов.
  14. Написать программу, моделирующую работу книжного магазина.

    Сведения о каждой книге: фамилия автора, название, жанр, цена, количество книг в магазине.

    Кроме книг в магазине продаются канцелярские товары. Информация о каждом канцелярском товаре следующая: название, цена, количество единиц товара в магазине.

    Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить книгу или канцелярскую принадлежность.
    2. По заданному названию или жанру вывести на экран список подходящих книг.
    3. Сформировать списки покупок:
      1. Создать/удалить список покупок.
      2. Добавить/удалить книгу или канцелярскую принадлежность в заданный список покупок.
      3. Вывести заданный список покупок на экран с подсчётом общей стоимости.
      4. Отобразить все имеющиеся списки покупок.
      5. Оплатить список покупок: товары записать в файл с заданным пользователем названием, список очистить, количество соответствующих товаров в магазине уменьшить, все остальные списки пересчитать в соответствии с текущим количеством товаров в магазине.
    4. Вывести на экран сгруппированную по жанрам статистику: количество книг, средняя стоимость, суммарное количество экземпляров, процент количества экземпляров относительно общего числа товаров в магазине.
  15. Написать программу, моделирующую работу оператора системы оповещений клиентов банка.

    Сведения о каждом клиенте: ФИО, номер телефона, сумма долга, история звонков.

    Сведения о каждом телефонном звонке: клиент, номер телефона, время звонка, длительность, удалось ли дозвониться, комментарий.

    Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить клиента.
    2. Обновить информацию о клиенте.
    3. Поиск клиента по номеру телефона или ФИО.
    4. Добавить/удалить информацию о звонке.
    5. Вывести на экран список клиентов:
      • в лексикографическом порядке
      • в порядке убывания/возрастания долга
      • по дате последнего звонка
    6. Вывести на экран статистику звонков:
      • количество звонков для каждого статуса дозвона
      • средняя длительность звонка
      • общая длительность всех звонков
  16. Написать программу, моделирующую работу анонимного форума. Анонимный форум представляет из себя набор тематических обсуждений и сообщений.

    Каждое сообщение в обсуждении содержит временную отметку, имя пользователя (возможно пустое), текст.

    Каждое обсуждение содержит название, список тэгов, дату создания и список оставленных в нём сообщений.

    Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Создать тематическое обсуждение.
    2. Отобразить список обсуждений, отсортированный на выбор пользователя:
      • по дате создания
      • по дате последнего сообщения
      • по количеству уникальных имён пользователей
    3. Просмотреть список сообщений в обсуждении, упорядоченный по дате и времени добавления сообщения.
    4. Добавить новое сообщение в обсуждение.
    5. Поиск обсуждений по тэгу, выбранному пользователем из списках всех имеющихся тэгов
    6. Цензура: заменить во всех названиях обсуждения, именах пользователя и текстах сообщений введённый пользователем текст на звёздочку. Вывести пользователю количество совершённых замен.
  17. Написать программу, моделирующую работу агрегатора вакансий.

    Сведения о каждой вакансии: название должности, описание, требования к образованию, оклад, город, возможность работать удалённо, работодатель, время открытия вакансии.

    Сведения о каждой компании: название, описание, контакты.

    Начальное формирование данных осуществляется из файла (или файлов). С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить работодателя. При удалении работодателя все его вакансии должны также удаляться
    2. Обновить информацию о работодателе.
    3. Добавить/удалить вакансию у конкретного работодателя.
    4. Обновить информацию о вакансии.
    5. Поиск работы по одному или нескольким критериям:
      • по ключевым словам,
      • по нижней границе оклада,
      • по городу,
      • по возможности работать удалённо.
    6. Статистика:
      • общее количество компаний и общее количество вакансий,
      • количество компаний, у которых есть вакансии с возможностью работать удалённо,
      • количество уникальных должностей,
      • средний оклад по каждому городу.
  18. Написать программу, моделирующую работу кинотеки.

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

    Сведения о каждом отзыве: имя пользователя, дата, оценка (необязательно), текст отзыва.

    Начальное формирование данных осуществляется из файла (или файлов).

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить фильм.
    2. Обновить информацию о фильме.
    3. Вывести список фильмов, упорядоченный:
      • по названию;
      • по средней оценке;
      • по количеству отзывов
      • по дате последнего отзыва.
    4. Вывести все отзывы на данный фильм, сгруппировав их по оценке и упорядочив по убыванию даты добавления.
    5. Добавить/редактировать/удалить отзыв на фильм и пересчитать среднюю оценку.
    6. Вывести список из трёх самых продуктивных пользователей (можно считать имя пользователя его уникальным идентификатором) и количество их отзывов. Учитываться должны только отзывы, содержащие не менее 50 символов.
    7. Составить статистику кинотеки по месяцам. Для каждого месяца, по которому есть информация, указать:
      • количество отзывов;
      • количество отрецензированных в этом месяце фильмов;
      • количество уникальных пользователей, которые в этом месяце оценивали или рецензировали фильмы.
  19. Написать программу, моделирующую информационную футбольную базу.

    Сведения о каждом футболисте: имя, фамилия, дата рождения, текущий клуб (возможно, «без клуба»), история контрактов с клубами (возможно, пустая), статистика забитых голов.

    Сведения о каждом клубе: название, дата основания, статус клуба (действующий или не действующий), очки в чемпионате.

    Начальное формирование данных осуществляется из файла (или файлов). Запрещается считать название клуба его уникальным идентификатором и хранить историю контрактов футболистов исключительно названием. Разрешается считать начальный файл корректным и при инициализации не проводить дополнительной проверки на существование клубов из истории контрактов в списке клубов.

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить футболиста.
    2. Обновить информацию о футболисте (имя, фамилия, дата рождения, статистика голов).
    3. Обновить текущий клуб (предыдущий текущий клуб должен добавиться последним пунктом в историю контрактов).
    4. Добавить новый клуб.
    5. Обновить основную информацию клуба (название, дата основания, очки в чемпионате).
    6. Закрыть клуб: изменить статус клуба на «не действующий» и для всех футболистов с соответствующим текущим клубом сменить текущий клуб на «без клуба», перенеся запись о закрывшемся клубе в историю контрактов.
    7. Вывести список футболистов, упорядоченный по фамилии.
    8. Вывести историю контрактов футболиста с указанием статуса каждого клуба.
    9. Вывести список действующих клубов, упорядоченный по дате основания.
    10. Для заданного клуба вывести список всех футболистов, которые сейчас свободны, но раньше играли в данном клубе.
  20. Написать программу, моделирующую календарь событий с темами.

    Сведения о каждом событии: название, описание, дата и время начала, дата и время окончания.

    Сведения о каждой теме: название, описание темы, приоритет, дата последнего обновления, список событий.

    Начальное формирование данных осуществляется из файла (или файлов). Дата последнего обновления темы должна обязательно обновляться при создании темы, её редактировании и удалении дубликата. Обновление даты при действиях с принадлежащими теме событиями - желательно. Должна существовать тема «без темы» с минимальным приоритетом, которую пользователю запрещено редактировать и удалять.

    С помощью меню необходимо обеспечить следующие функции:

    1. Добавить/удалить тему. При удалении все принадлежащие теме события должны перейти в тему «без темы».
    2. Обновить информацию о теме.
    3. Добавить/удалить событие в тему.
    4. Обновить информацию о событии.
    5. Вывести список всех тем, упорядоченный по убыванию приоритета.
    6. Для выбранной пользователем темы вывести список всех событий в теме, упорядоченный по убыванию времени окончания и возрастанию времени начала.
    7. Вывести на экран список событий, которые завершаются в заданную пользователем дату.
    8. Объединить две темы. Для выбранных пользователем основной темы и темы-дубликата приложение должно перенести все события из дубликата в основную тему. Если у основной темы отсутствовало описание, приложение должно запросить у пользователя, сохранить ли описание темы-дубликата. Приоритет основной темы должен принять максимальное значение из двух вариантов.