Варианты индивидуальных заданий

Требования и рекомендации

  • программа должна быть удобна и приятна в использовании: с консоли можно протестировать все ее возможности; в классах есть много удобных и полезных полей и методов (проявите фантазию! - не ограничивайтесь тем минимумом, который указан в задании); сразу после запуска - программа уже "заполнена" небольшим количеством реальных данных (фамилии реальных людей, названия реальных городов с правдивой информацией про них и т.п. (а не jkjkl 123!));
  • классы должны быть спроектированы с упором на универсальность - так, чтобы их можно было без изменения повторно использовать в новой, коммерческой он-лайн (и мобильной:) версии вашей программы;
  • избегайте дублирования кода: когда надо поменять логику какой-то одной операции, это не должно требовать синхронных изменений в нескольких отдельных местах в коде;
  • помещайте отдельные классы в отдельные файлы;
  • в заданиях на 8 и 12 баллов обязательно должен быть полиморфизм, в заданиях на 5 - наследование;
  • в заданиях на 8 и 12 баллов можно получить 2 дополнительных балла за продуманную реализацию обработки исключений;
  • если формулировка задания вводит вас в ступор, и у вас не появляется ни одной идеи, как это можно было бы реализовать - попросите преподавателя нарисовать вам диаграмму классов, от которой вам "плясать" дальше.

На 12 баллов

1 Блекджек

Реализовать консольную версию карточной игры блекджек (или очко).

Правила можно реализовать любые на ваше усмотрение, хоть самые простые: от двойки до десятки = от 2 до 10 очков, туз = 10 или 1 очко, любая "картинка" = 10 очков, игра до 21 очка игрок против дилера, дилер берет карты последним, при равенстве очков - "ничья", без сплитов, даблов и прочих дополнительных опций. Вероятности выпадения карт одинаковые и не меняются со временем ("бесконечная" колода). Правила должны быть реальными - в том смысле, что по ним действительно имеет смысл играть.

Реализовать возможность игры как "человек против компьютера", так и "человек против человека" и "компьютер против компьютера" (тут как раз появится полиморфизм).

На правах подсказки: классы, которые (вероятно) могут вам понадобиться (но окончательное решение за вами!):

  • карта;
  • игрок и два его наследника: компьютер и человек;
  • игра;
  • вспомогательные классы для вывода информации на экран.

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

2 Матрица

Реализовать набор классов для работы с матрицами и векторами.

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

В целях тестирования сделать консольную программу, которая позволяет записывать матрицы в "переменные" (т.е. давать им имена) и тестировать все реализованные операции. Например, так:

>a = 1 0

>0 2

>

>b = 1 2

>3 4


>c = a * b

>c
1 2
6 8

В этом примере в переменную "a" записывается матрица {{1, 0}, {0, 2}}, в переменную "b" - матрица {{1, 2}, {3, 4}}, в "c" - их произведение. Последние две строки - это вывод на экран матрицы c. Также надо как-то предусмотреть задание типа хранения матрицы (плотная или разреженная) и выбор одного из конструкторов при ее создании. Конкретные команды могут не совпадать с приведенными в примере.

Интерфейс программы можно сделать как на основе команд, так и на основе меню. Реализовывать вычисление сложных формул (вроде a+b*c-d*(k+f)) - не требуется.

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

На интерес:

3 Little Alchemy

Реализовать текстовую версию игры http://littlealchemy.com/

По сути, нужно реализовать две операции: соединение элементов и показ имеющихся элементов. Также не забудьте добавить в свою программу десяток-другой элементов из оригинала игры - чтобы было интересно играть. Пример игровой сессии:

Welcome to... bla-bla-bla! Use 'list' command to see your elements and '+' command to add them up. Note that a+b not always equals to b+a!

>list

air

earth

fire

water

>air+air

nothing...

>air+fire

energy

>list

air

earth

fire

water

energy

Интерфейс программы можно сделать как на основе команд, так и на основе меню. Состав команд можно придумать свой.

Для удобства игры элементы, может быть, имеет смысл нумеровать - чтобы затем вводить 3+4 вместо fire+water (на ваше усмотрение).

На правах подсказки: классы, которые (вероятно) могут вам понадобиться (но окончательное решение за вами!):

  • элемент и его наследники (отсюда и полиморфизм);
  • игра (также возможен отдельный класс для хранения списка имеющихся элементов);
  • класс "правила комбинирования";
  • классы для реализации консольного интерфейса.

Помните, что классы должны быть спроектированы так, чтобы их можно было без изменений использовать в не-консольной версии программы.

На интерес: подумайте как реализовать данную игру без полиморфизма. Но сделайте - все равно с полиморфизмом!

4 Статистический агрегатор

В программе для управления оценками студентов по ООП требуется реализовать подсчет статистики успеваемости всего курса по итогам семестра.

Для этого вы разрабатываете специальный класс "агрегатор оценок". "На вход" ему подают оценки отдельных студентов по 100-балльной шкале (1 студент - 1 оценка), а "на выходе" - получают следующую информацию:

  • общее количество оценок;
  • количество A-шек, B-шек и т.д.
  • средний балл;
  • количество и средний балл тех, кто "сдал" (т.е. имеет оценку E или выше).

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

Также у вас нет уверенности, что применяемая система оценивания всегда будет оставаться постоянной - может быть, 100-балльную систему сменит 5-балльная, а может вместо оценок A,B,C,D станут применяться A++, A+, A, B++, B+, B, C++, C+, C - причем с другой  разбивкой по диапазонам баллов. Нужно предусмотреть легкую замену системы оценивания.

На правах подсказки: классы, которые (вероятно) могут вам понадобиться (но окончательное решение за вами!):

  • собственно, агрегатор (который умеет агрегировать как отдельные оценки - так и другие агрегаторы);
  • "система оценивания", которую можно "подключать" к агрегатору;
  • классы для реализации консольного интерфейса для тестирования того, что получилось.

Замечание: от агрегатора не требуется хранить сами оценки!

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

5 Голосовое меню

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

Разумеется, реализовывать синтез голоса от вас не требуется - достаточно вывести текст на экран (будем считать, что этот текст впоследствии направляется на "внешний" синтезатор голоса).

Разработанный набор классов должен обеспечивать следующие возможности:
  • вывод меню и чтение пользовательского выбора;
  • "навешивание" на пункты меню нового выбора - подменю (а также меню 3-го уровня и так далее);
  • операцию "вывод текстовой информации" (для "навешивания" на пункт меню);
  • операцию "проверить баланс" (для "навешивания" на пункт меню);
  • операцию "пополнить счет" (проблему взаимодействия с банком можно оставить в стороне) (для "навешивания" на пункт меню);
  • еще пару операций с абонентским аккаунтом (на ваш выбор).
Таким образом, пользуясь вашими классами, программисты на телефонной станции смогут согласно своим корпоративным требованиям построить меню для своих абонентов.

Для целей тестирования, постройте из этих классов свой небольшой (но похожий на реальный! - можно взять реальную структуру меню своего оператора) пример меню, демонстрирующий возможности всех ваших классов. Не забудьте "соединение с оператором"! ;)

На правах подсказки: классы, которые (вероятно) могут вам понадобиться (но окончательное решение за вами!):
  • абстрактный "пункт меню";
  • подменю (является "пунктом меню");
  • пункт меню "вывод текста", "пополнения счета" и т.п.;
  • классы для реализации текстового взаимодействия с пользователем.
Продумайте, как программисты телефонной компании смогут добавлять к вашему наборов классов "нестандартные" (т.е. не предусмотренные вами заранее) операции - вроде соединения с оператором или перечисления денег зоопарку.

Не забудьте, что ваши классы должны быть пригодны для использования в том числе в среде, в которой вообще отсутствуют System.in и System.out! - должно быть некоторое абстрагирование от конкретного формата взаимодействия с пользователем!

Почитайте про паттерн проектирования composite.

6 Крестики-нолики

Разработать игру в крестики-нолики 3x3 для игры против человека или компьютера с консольным интерфейсом.

Вывод игрового поля на экран можно сделать примерно следующим:

 |x|

-+-+-

0|x|

-+-+-

 |x|0

Для ввода своего хода игрок может использовать координаты: например, "2 2" - центр.

Реализовать возможность игры как "человек против компьютера", так и "человек против человека" и "компьютер против компьютера" (тут как раз появится полиморфизм).

На правах подсказки: классы, которые (вероятно) могут вам понадобиться (но окончательное решение за вами!):

  • поле;
  • игрок (и две различные его реализации);
  • классы для реализации текстового взаимодействия с пользователем.

Ваш ИИ должен играть не как попало, а хорошо!

Не забудьте, что ваши классы должны быть пригодны для использования в том числе в среде, в которой вообще отсутствуют System.in и System.out! - должно быть некоторое абстрагирование от конкретного формата взаимодействия с пользователем!

7 Компьютерная сеть

Разработать простой набор классов для демонстрации маршрутизации в сетях.

  • Сеть состоит из "узлов".
  • Каждый узел может быть либо конечным (компьютер), либо промежуточным (маршрутизатор).
  • Каждый узел имеет адрес (целое число) и название (для удобства). При желании названия можно использовать вместо адресов.
  • Каждый промежуточный может быть соединен двунаправленными каналами "точка-точка" или несколькими другими узлами. В пределах каждого узла эти каналы имеют локальную нумерацию 0,1,2 и т.д.
  • Конечные узлы подключаются ровно одним каналом ровно к одному из промежуточных узлов.
  • Каждый конечный узел может быть как инициатором отправки сообщения, так и его получателем. Промежуточные узлы используются только для переправки чужих сообщений.
  • На каждом промежуточном узле имеется таблица маршрутизации с двумя столбцами: "адрес назначения", "локальный номер канала для отправки".
  • Промежуточные узлы переправляют все полученные сообщения по тому каналу, который записан в его их таблице маршрутизации в ячейке, соответствующей адресу конечного получателя сообщения. Конечные узлы все сообщения отправляют по своему единственному каналу.
  • Каждое сообщение содержит (как минимум) три поля: адрес отправителя, адрес получателя, содержимое (обычно - текстовая строка).

Вам требуется разработать набор классов, из которых "в main'е" можно собрать сеть и настроить в ней таблицы маршрутизации. После чего отправить между некоторой парой конечных узлов сообщение - и увидеть на экране, как оно "двигалось" по сети (пример):

2: Sending message to 4.

3: Got message from 2, forwarding to 5.

5: Got message from 3, forwarding to 4.

4: Received message from 2: "Hello 4!".

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


Откуда картинка

На правах подсказки: классы, которые (вероятно) могут вам понадобиться (но окончательное решение за вами!):

  • абстрактный "узел" и две его разновидности;
  • таблица маршрутизации;
  • сообщение.

Замечание: интереснее, конечно, промоделировать не статическую, а динамическую маршрутизацию в протоколе RIP на основе распределенного алгоритма Беллмана-Форда.

8 Конвертор всего

Разработать набор классов для перевода единиц измерения.

  • градусы Цельсия в градусы Фаренгейта и обратно;
  • фунты в килограммы и обратно;
  • время в часах, минутах и секундах (три числа) в секунды (одно целое число), минуты (одно дробное) или часы (одно дробное) и обратно;
  • градусы, минуты и секунды (три числа) в градусы (одно дробное) и обратно;
  • футы и дюймы (два числа) в метры и обратно.

В этих же классах реализовать разбор текстовых строк с обозначениями составных величин: 05:28:14 (5 часов, 28 мин, 14 сек), 50 14' 47" (50 градусов, 14 мин, 47 сек), 4' 08" (4 фута и 8 дюймов).

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

Не забудьте сделать так, чтобы ваши классы можно было бы применять не только в консольных программах!

9 Расписание

Разработать упрощенный набор классов для работы с расписанием занятий на факультете.

Предусмотреть наличие "мигалок" а также проведение "общих" лекций - несколько групп в одной аудитории. Проверку непротиворечивости расписания (один и тот же преподаватель одновременно в разных местах, занятия по двум разным предметам одновременно в одной аудитории) делать не требуется. В расписании хранятся предметы, группы, преподаватели, дни недели, номера пар и аудиторий (разделение лекция/практика можно игнорировать).

На правах подсказки: классы, которые (вероятно) могут вам понадобиться (но окончательное решение за вами!):

  • расписание;
  • преподаватель;
  • ячейка расписания и три ее разновидности: пара с одной группой, "мигалка", пара с несколькими группами;
  • "день" расписания;
  • классы для реализации текстового взаимодействия с пользователем.

Рекомендация: расписание можно хранить как двумерный массив ДНИxГРУППЫ или как трехмерный ДНИxПАРЫxГРУППЫ.

В тестирующей программе предусмотреть просмотр расписания по всем группам в заданный день и по всем дням для заданной группы, редактирование ячеек расписания.

Сразу после запуска программа уже заполнена реальным расписанием 1 и 2 курса на пн, вт и ср.

10 Quiz

Разработать набор классов для конструирования тестов (для проверки знаний).

Тест - это упорядоченный набор вопросов. Вопросы бывают с единственным выбором, множественным выбором и со свободным ответом (вводится число или слово).

На правах подсказки: классы, которые (вероятно) могут вам понадобиться (но окончательное решение за вами!):

  • абстрактный вопрос и 3 его разновидности;
  • тест (как набор вопросов);
  • результат теста (как набор ответов) с вычислением оценки;
  • классы для реализации текстового взаимодействия с пользователем.

В целях демонстрации "зашить" в программу какой-либо реальный (можно со своими дополнениями) тест - чтобы его можно было пройти и увидеть свою оценку, а также посмотреть, какие из них были неправильными и каков правильный ответ на соответствующий вопрос.

Не забудьте сделать так, чтобы ваши классы можно было бы применять не только в консольных программах!

На 8 баллов

Задание

Разработать три класса – один базовый (может быть абстрактным классом или интерфейсом) и два производных от него – согласно своему варианту задания. Используя свой класс Vector из л.р.№3, адаптированный для хранения объектов этих классов, реализовать «программу-каталог» со следующими возможностями:

  1. Просмотр всего содержимого каталога.
  2. Добавление нового элемента в заданную позицию (со сдвигом остальных) – в том числе в конец.
  3. Удаление элемента в заданной позиции (со сдвигом остальных).
  4. Редактирование элемента в заданной позиции.
  5. Несколько вариантов разумного – на Ваш взгляд – поиска по каталогу (результат поиска – не всегда единственный элемент!).

Требования и рекомендации

  1. На хорошую оценку ваша программа должна уметь искать по одному "общему" критерию (который применим к обоим подклассам) и одному специфичному критерию - которй применим только к одному из подклассов.
  2. Каталог должен быть смешанным: одновременно в нем могут храниться объекты обоих производных классов (совет: для этого обычно хранят в векторе ссылки на базовый класс (или интерфейс)).
  3. Полиморфное поведение реализуется посредством переопределения (override) методов.
  4. Ввод с клавиатуры, вывод на экран, редактирование объекта – безусловно, являются операциями над объектами класса (т.е., скорее всего, станут его методами) (но если вас смущает потеря таким классом универсальности - т.е. его будет неудобно использовать в Android-приложении - напишите к каждому предметному классу по одному "классу ввода-вывода" в духе "ConsoleIOBus, ConsoleIOTruck" и т.п.).
  5. Использование enum'ов не требуется. Перечислимые по сути поля можно реализовывать как строки.
  6. См. также общие требования в начале страницы.

Варианты

1. Автомобиль.
Общие поля: фирма-производитель, год выпуска, цвет.
Вариативные поля: для грузовых – грузоподъемность в тоннах (вещественное), для легковых – тип кузова (например, седан, кабриолет, универсал, минивэн, купе).

2. Клиент парикмахерской.
Общие поля: Ф.И.О., возраст.
Вариативные поля: для мужчин – длина стрижки, для женщин – тип прически (например, свадебная, вечерняя, повседневная).

3. Диск.
Общие поля: название, год.
Вариативные поля: для аудио – количество треков, для видео – разрешение.

4. Печатное издание.
Общие поля: название, год, количество страниц.
Вариативные поля: для книг - автора, для журналов - № (номер).

5. Комнатное растение.
Общие поля: высота, тип стебля (например, плетущееся, куст), условия содержания (например, теплолюбивое, теневыносливое, засухоустойчивое).
Вариативные поля: для цветущих – цвет цветка, для декоративнолиственных – длина листа.

6. Компьютер.
Общие поля: модель, производитель, год выпуска.
Вариативные поля: для дэсктопа – модель материнской платы, для ноутбука – время автономной работы.

7. Государство.
Общие поля: расположение (континент), название, площадь.
Вариативные поля: для республики – количество депутатов в парламенте, для монархии – фамилия правителя.

8. Общественный транспорт.
Общие поля: название, год выпуска, длина маршрута.
Вариативные поля: для автобуса – количество потребляемого бензина, для трамвая – количество вагонов.

9. Самолет.
Общие поля: название, год выпуска.
Вариативные поля: для пассажирских – вместимость, для грузовых – грузоподъемность.

0. Медикаменты.
Общие поля: название, срок годности, производитель.
Вариативные поля: для таблеток – количество таблеток в упаковке, для ампул – объем.

На 5 баллов

Задание

  1. Разработать 2 класса - один наследник другого - для инкапсуляции понятий согласно своему варианту.
  2. В main'е создать ОДИН массив объектов и заполнить его ("в коде") несколькими объектами ОБОИХ классов.
  3. В цикле вывести массив на экран.
  4. После этого - найти и распечатать объект с минимальным (максимальным) значением какого-либо атрибута.

Требования и рекомендации

См. вверху страницы.

Варианты

  1. Программа для коллекционера посуды: Бутылка (объем, высота и т.п.) и ее разновидность - Термос (время сохранения воды горячей и т.п.).
  2. Программа для учета дел: Заметка (заголовок, текст) и ее разновидность - Напоминание (дата/время напоминания).
  3. Программа для прачечной в Индии: Утюг (НЕ электрический: характеристики придумайте сами) и его разновидность - Электрический утюг (макс. мощность, напряжение питания и т.п.).
  4. Программа для пункта проката велосипедов: Велосипед (характеристики придумайте сами) и его разновидность - Электровелосипед (характеристики придумайте сами).
  5. Программа для найма временных рабочих на стройку: Человек (характеристики придумайте сами) и его разновидность - Студент (характеристики придумайте сами).
  6. Домашняя библиотека: Книга (автор, год, количество страниц и т.п.) и ее разновидность - Электронная книга (в смысле файл на диске).
  7. Программа для пляжного киоска: Напиток (характеристики придумайте сами) и его разновидность - Алкогольный напиток (градус спирта).
  8. Программа для магазина "Алло": Моб.телефон (характеристики придумайте сами) и его разновидность - Смартфон (платформа:iPhone,Android,Windows и т.п.).
  9. Программа для домохозяек: Кастрюля (характеристики придумайте сами) и ее разновидность - Скороварка (рабочее давление).
  10. Программа для компьютерного магазина: "Мышь" (характеристики придумайте сами) и ее разновидность - Беспроводная мышь (радиус действия, тип радиоканала, тип батареек и время работы на них и т.п.).
Comments