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. Составить статистику за месяц: средняя общая стоимость телефонной связи, среднее количество минут телефонных разговоров, общее количество абонентов.
  3. Написать программу, моделирующую работу автобусного парка.

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

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

    1. Добавить новый маршрут/автобус.
    2. Удалить автобус по номеру.
    3. Удалить маршрут по номеру: принадлежащие ему автобусы должны быть перенесены пользователем на другие маршруты с возможностью выбора состояния.
    4. Сменить состояние автобуса.
    5. Переместить автобус между маршрутами.
    6. Отобразить список простаивающих/работающих/ремонтирующихся автобусов для маршрута.
    7. Проверить достаточность/избыточность работающих автобусов на маршруте.
    8. По фамилии водителя найти, на каком маршруте он сейчас работает.
    9. Составить статистику расхода бензина для маршрутов.
  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. По данному слову из списка выбрать значение и вывести все его возможные переводы.

      Например: 1) коса (причёска) 2) коса (инструмент). Если пользователь выбирает 1), вывести: tail, braid.

    6. Вывести список слов, для которых не известен ни один перевод.
    7. По буквосочетанию вывести все подходящие слова.
    8. Для двух заданных слов выяснить, не являются ли они «транзитивными омонимами»: их переводы омонимичны.

      Например, «рука» и «оружие» переводятся как «arm», поэтому они «транзитивные омонимы».

  10. Написать программу, моделирующую процесс обмена квартир.

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

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

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

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

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

    1. Добавить/удалить знакомого.
    2. Изменить адрес, телефон, статус.
    3. По заданной дате вывести на экран список ближайших дней рождения.
    4. По указанному пользователем статусу и событию сформировать список приглашенных лиц (вывести в отдельный файл с заданным пользователем названием), для каждого создать отдельный файл с соответствующим названием (например, IvanovBirthday.txt, PetrovBirthday.txt), содержащий внутри: обращение и текст приглашения.
  12. Написать программу, моделирующую работу с вкладами в банке.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Анонимный форум представляет из себя набор тематических обсуждений и сообщений.

    Каждое сообщение содержит порядковый номер, временную отметку, текст.

    Каждое обсуждение содержит название и список оставленных в нём сообщений (должно быть как минимум одно).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. Добавить/удалить тему.
    2. Обновить информацию о теме.
    3. Добавить/удалить событие в тему.
    4. Обновить информацию о событии.
    5. Вывести на экран календарь событий по запросу:
      • на текущий месяц;
      • на заданный месяц.
    6. Вывести список всех тем.
    7. Вывести список всех событий в теме.
    8. Вывести все события для данной темы в виде календаря.