Задания

Л.р.№1 Java Вводная

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

(4 балла)

Л.р.№2 Java Классы и наследование

Л.р.№5 прошлого семестра (про военную базу, Vehicle, Bus и Truck) переделать на Java. Создать гетерогенный массив из одного Vehicle'а, одного Bus'а и одного Truck'а и втроем приехать на базу. Объяснить, где здесь проявляется полиморфное поведение.

Альтернативное задание: любую лабу из прошлого семестра с наследованием и полиморфизмом переделать на Java. Продемонстрировать полиморфное поведение.

Подсказки:

  1. Вместо глобальных переменных вида "something"_on_base можно создать класс Base и статические переменные в нем (с теми же именами). В нем же написать функцию main().
  2. Закрытого наследования в Java не бывает.
  3. Для вызова унаследованного конструктрора или метода используйте ключевое слово super.
  4. Константных методов в Java нет. Константные поля называются "final".
  5. Функции min(), max(), random(), abs(), floor() - в классе Math.
  6. Для явного приведения double к int используйте следующий синтаксис: int i = (int)(somebody.getSomeDouble());
  7. delete в Java нет.
  8. Обязательно  загляните в учебник и документацию по платформе. Также могут быть полезны официальные уроки.

Ожидаемое время: 1 час.

(6 баллов)

Л.р.№3 Многопоточность

(версия "лайт"; на многопоточность будет еще одно задание - поинтереснее)

Реализовать многопоточную программу с якобы "тяжелыми вычислениями". В качестве "тяжелых вычислений" производить вычисление числа Пи с помощью ряда Лейбница: 4*(1-1/3+1/5-1/7+1/9-...). Примечание: этот ряд очень плохо сходится, поэтому чтобы достичь более-менее приличной точности, надо очень долго считать.

Программа предоставляет пользователю (в консоли) меню следующего вида:

  1. Продолжить вычисления.
  2. Приостановить вычисления.
  3. Посмотреть текущий результат.
  4. Узнать суммарное время, затраченное на вычисления.
  5. Выход.
Собственно вычисление ряда выполняет отдельный поток (в бесконечном цикле). Главный поток может его приостановить (для этого нужно заставить вычислительный поток выполнить вызов wait()), продолжить (notify()), показать текущий достигнутый результат вычислений (собственно, число Пи, но пока не очень точное). При приостановке загруженность процессора (в "диспетчере задач") должна падать  до небольшого значения около 0, при продолжении - возрастать до 100%. Когда вычисления приостановлены, операция "посмотреть текущий результат" при многократном ее выполнении должна показывать одно и то же (потому что текущее значение Пи не меняется); во время вычислений - соответственно - при каждом повторном просмотре Пи должно становиться все точнее и точнее.

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

В качестве примера см. ниже NewThread.class (запускать из консоли командой "java NewThread"). Надо сделать такое же, но без окошек!

(5 баллов)

Л.р.№4 Многопоточность (бонусная)

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

  • Объект класса "Заказ" сразу в конструкторе создает новый поток, который пытается "поселиться" в гостиницу. Поток блокируется, если в данный момент отсутствует подходящее количество свободных номеров. Когда у него наконец-то получится поселиться, он делает sleep() на время пропорциональное его времени проживания. Когда проснется - выселяется. После выселения одной группы жильцов гостиница может "поселить" один или несколько ожидающих заказов (соблюдение среди них очереди - не обязательно, но интересно).
  • В главном потоке происходит генерация заказов по приблизительно следующей схеме: сгенерировать заказ, поспать (как будто прошло время), сгенерировать еще один (или несколько) и т.д.
  • В процессе работы с клавиатуры ничего не считывается. Характеристики гостиницы и заказов (и времена их прибытия) задаются в коде. Или - вводятся с клавиатуры перед началом моделирования.

В процессе моделирования на экран выводятся сообщения о происходящих событиях: "День N: Заказ такой-то на сколько-то человек пришел", "День M: заказ такой-то на столько-то человек заселился", "День K: Заказ такой-то на столько-то дней выселился" и др.

За один день можно принять одну секунду.

Подсказки:

  1. "Поток блокируется" - значит он вызывает wait().Чтобы разбудить поток, надо вызвать notify().

Л.р.№5 Множественное наследование

Реализуйте на Java множественное наследование аналогично тому, как это описано в л.р.7plusB второго семестра.

Как проверить правильность Вашей архитектуры (когда все классы уже написаны):

  1. Создайте один Vehicle (объект №1), один Bus (объект №2), один Truck (объект №3) и один Expeditor (объект №4).
  2. Создайте массив из 4-ех ссылок на Vehicle'ы, массив из 2-ух ссылок на Bus'ы и массив из 2-ух ссылок на Tuck'и.
  3. Поместите в первый массив ссылки на объекты №№1-4, во второй - ссылки на объекты №2 и №4, в третий массив - ссылки на объекты №3 и №4.
  4. Для всех элементов 1-го массива должны работать операции приехать-уехать и узнать параметры бензобака (заполненность и объем), для всех объектов 2-го массива - то же плюс узнать количество людей и кресел, для всех объектов 3-го - то же, что в первом, плюс узнать загруженность и грузоподъемность.

Л.р.№6 Апплеты

Сделать "открытку"/"рекламу", используя графику и картинки. См. примеры applet1.zip и applet2.zip.

Л.р.№7 Внутренние классы

Создать упрощенную реализацию на Java какого-нибудь последовательного контейнера (для хранения double'ов). Например, вектора фиксированного размера с возможностью добавления в конец и удаления из произвольной позиции. Для реализации функциональности своего класса можно, при желании, использовать какой-нибудь стандартный контейнер - например, ArrayList ("наследование реализации" через композицию).

В класс добавить два метода: iterator() и iterator(int), возвращающие, соответственно итераторы, указывающие на начало контейнера и перед i-ой позицией. Под итератором имеется ввиду некоторый класс, реализующий интерфейс java.util.Iterator<Double>. Вместо стандартного шаблонного интерфейса Iterator, чтобы не разбираться с дженериками, можно интерфейс итератор написать самому (с теми же методами). Но в обоих случаях обратите внимание: в Java итератор указывает не на элемент, а между элементами (см. картинку тут)!

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

В main'е протестировать свой контейнер, оба метода и итераторы, которые они возвращают: создать два итератора, один из которых указывает на 0-ой элемент, второй - на 5-ый элемент, и вызывая в цикле методы next() этих итераторов, распечатать элементы в следующем порядке: 0,5,1,6,2,7,3,8,4,9.

Примечания:
  1. В параметрах шаблона необходимо использовать оберточный класс Double (вместо примитивного double) - ибо так реализованы дженерики. Во всех остальных местах можно использовать обычный double - и это будет успешно работать совместно с итератором на основе Double, т.к. сработает авто- boxing & unboxing (см. гугль).
  2. В методе iterator(int) подразумевается, что объявленный внутри него класс будет использовать параметр этого метода при создании своих объектов. Для того, чтобы это было возможно, параметр должен быть объявлен final.
  3. О внутренних классах и всех их разновидностях см. стр. 282 Хорстманна и в туториале.

Л.р.№8 Коллекции

На собственном примере реализовать работу с отношением многие-ко-многим. Например - пользователи и группы "ВКонтакте".

Реализовать:
  • просмотр всех пользователей;
  • просмотр всех групп;
  • добавление/удаление пользователя;
  • добавление/удаление группы;
  • просмотр/редактирование детальной информации о пользователе;
  • просмотр/релактирование детальной информации о группе;
  • посмотреть, в каких группах состоит данный пользователь;
  • посмотреть, какие пользователи состоят в данной группе;
  • добавить/удалить пользователя в/из группу(ы).
(вернее, аналогичные операции в своем примере + другие кажущиеся Вам разумными и удобными операции)
Использовать для этих целей LinkedHashSet/LinkedHashMap

Например: пользователи и группы хранятся в Set'е, отношение многие-ко-многим хранится как два Map'а:
  • пользователь -> Set групп;
  • группа -> Set пользователей.

Замечания:

  1. Оцените асимптотическую сложность каждой операции (чтобы быть уверенными, что когда наша соц. сеть дорастет до размеров Фейсбука, она не перестанет работать).
  2. Операций со сложностью O(n), скорее всего, быть не должно: использование хешированных контейнеров становится бессмысленным, если их элементы перебирать в цикле!
  3. Везде, где это возможно, используйте интерфейсы Set, Map, Collection вместо самих классов (чтобы можно было в любой момент подменить реализацию).
  4. Обязательно попробуйте использовать в качестве ключей ассоциативных контейнеров собственные классы. В них для этого обязательно надо переопределить метод hashCode() (и equals()).

Л.р.№9 AWT

Сделать программу-калькулятор.

             

Л.р.№9+ AWT

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

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

2) Добавить к п.1 три CheckBox'а для изменения цвета панели (фон всего окна) и два RadioButton'а для изменения цвета текста надписи.

Л.р.№10+ Дазы Банных

(доп. балл)

Создать в базе одну таблицу. Сделать консольную программу для просмотра ее содержимого, добавления, удаления, редактирования элементов. Совет: не забудьте создать в таблице поле id типа longint с автоинкрементом и назначить его первичным ключом.
ċ
Applet1.zip
(416k)
Dima Litvinov,
4 мар. 2014 г., 7:04
ċ
NewThread.jar
(4k)
Dima Litvinov,
4 мар. 2014 г., 10:20
ċ
applet2.zip
(87k)
Dima Litvinov,
4 мар. 2014 г., 7:04
Comments