programming - title

Программирование

Programming lecture slides

programming - autumn

1-й семестр (осень)

Lab

Лабораторные работы

programming - lab1 - task

Первое занятие в классе (Лабораторная #0)

  1. Внимательно послушать, что скажет преподаватель практики.
  2. Если что-то не понятно, лучше сразу спросить.
  3. Получить свои учетные данные для подключения к серверу helios
  4. Материалы для подготовки к выполнению лабораторной #1.

Лабораторная работа #1

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

Требования к программе:

  1. Программа должна корректно запускаться, выполняться и выдавать результат. Программа не должна выдавать ошибки. Программа должна быть работоспособной именно во время проверки, то, что она работала 5 минут назад, дома или в параллельной вселенной оправданием не является.
  2. Выражение должно вычисляться в соответствии с правилами вычисления математических выражений (должен соблюдаться порядок выполнения действий и т.д.).
  3. Программа должна использовать математические функции из стандартной библиотеки Java.
  4. Вычисление очередного элемента двумерного массива должно быть реализовано в виде отдельного статического метода.
  5. Результат вычисления выражения должен быть выведен в стандартный поток вывода в виде матрицы с элементами в указанном в варианте формате. Вывод матрицы реализовать в виде отдельного статического метода.
  6. Программа должна быть упакована в исполняемый jar-архив.
  7. Выполнение программы необходимо продемонстрировать на сервере helios.

Примечания:

  1. В случае, если в варианте будут предложены одинаковые имена массивов, для одного из них к имени добавить "1".
  2. Если в результате вычислений иногда получается NaN - возможно так и должно быть.

pb-portlet-lab0

programming - lab1 - questions & requirements

Отчёт по лабораторной работе должен содержать:
  1. Текст задания.
  2. Исходный код программы.
  3. Результат работы программы.
  4. Выводы по работе.

Вопросы к защите лабораторной работы:

  1. Язык Java. Особенности языка.
  2. Средства разработки. JDK и JRE. Компиляция и выполнение программы. JAR-архивы.
  3. Примитивные типы данных в Java. Приведение типов.
  4. Работа с переменными. Декларация. Инициализация. Присваивание.
  5. Одномерные и двумерные массивы. Декларация и создание массивов. Доступ к элементам массива.
  6. Инструкции ветвления (if-else, switch) и циклов (do, while, for).
  7. Операторы и выражения в Java. Особенности вычисления, приоритеты операций.
  8. Математические функции в составе стандартной библиотеки Java. Класс java.lang.Math.
  9. Подпрограммы, методы, параметры и возвращаемые значения.
  10. Форматированный вывод числовых данных.

programming - lab2 - title

Лабораторная работа #2

На основе базового класса Pokemon написать свои классы для заданных видов покемонов. Каждый вид покемона должен иметь один или два типа и стандартные базовые характеристики:

  • очки здоровья (HP)
  • атака (attack)
  • защита (defense)
  • специальная атака (special attack)
  • специальная защита (special defense)
  • скорость (speed)

Классы покемонов должны наследоваться в соответствии с цепочкой эволюции покемонов. На основе базовых классов PhysicalMove, SpecialMove и StatusMove реализовать свои классы для заданных видов атак. Все разработанные классы, не имеющие наследников, должны быть реализованы таким образом, чтобы от них нельзя было наследоваться.

Атака должна иметь стандартные тип, силу (power) и точность (accuracy). Должны быть реализованы стандартные эффекты атаки. Назначить каждому виду покемонов атаки в соответствии с вариантом. Уровень покемона выбирается минимально необходимым для всех реализованных атак.

Используя класс симуляции боя Battle, создать 2 команды покемонов (каждый покемон должен иметь имя) и запустить бой.

Базовые классы и симулятор сражения находятся в jar-архиве (обновлен 9.10.2018, исправлен баг с добавлением атак и кодировкой). Документация в формате javadoc - здесь.

Информацию о покемонах, цепочках эволюции и атаках можно найти на сайтах http://poke-universe.ru, http://pokemondb.net, http://veekun.com/dex/pokemon

programming - lab2 - addinfo

Комментарии

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

Что надо сделать (краткое описание)

  1. Ознакомиться с документацией, обращая особое внимание на классы Pokemon и Move. При дальнейшем выполнении лабораторной работы читать документацию еще несколько раз.
  2. Скачать файл Pokemon.jar. Его необходимо будет использовать как для компиляции, так и для запуска программы. Распаковывать его не надо! Нужно научиться подключать внешние jar-файлы к своей программе.
  3. Написать минимально работающую программу и посмотреть как она работает.
    Battle b = new Battle();
    Pokemon p1 = new Pokemon("Чужой", 1);
    Pokemon p2 = new Pokemon("Хищник", 1);
    b.addAlly(p1);
    b.addFoe(p2);
    b.go();
    
  4. Создать один из классов покемонов для своего варианта. Класс должен наследоваться от базового класса Pokemon. В конструкторе нужно будет задать типы покемона и его базовые характеристики. После этого попробуйте добавить покемона в сражение.
  5. Создать один из классов атак для своего варианта (лучше всего начать с физической или специальной атаки). Класс должен наследоваться от класса PhysicalMove или SpecialMove. В конструкторе нужно будет задать тип атаки, ее силу и точность. После этого добавить атаку покемону и проверить ее действие в сражении. Не забудьте переопределить метод describe, чтобы выводилось нужное сообщение.
  6. Если действие атаки отличается от стандартного, например, покемон не промахивается, либо атакующий покемон также получает повреждение, то в классе атаки нужно дополнительно переопределить соответствующие методы (см. документацию). При реализации атак, которые меняют статус покемона (наследники StatusMove), скорее всего придется разобраться с классом Effect. Он позволяет на один или несколько ходов изменить состояние покемона или модификатор его базовых характеристик.
  7. Доделать все необходимые атаки и всех покемонов, распределить покемонов по командам, запустить сражение.

pb-portlet-lab1

Чтобы познакомиться со своими покемонами, введите номер варианта.

programming - lab2 - questions

Отчёт по работе должен содержать:

  1. Текст задания.
  2. Диаграмма классов реализованной объектной модели.
  3. Исходный код программы.
  4. Результат работы программы.
  5. Выводы по работе.

Вопросы к защите лабораторной работы:

  1. Объектно-ориентированное программирование. Основные понятия: объекты, наследование, полиморфизм, инкапсуляция.
  2. Понятие класса. Классы и объекты в Java.
  3. Члены класса. Поля, методы, конструкторы. Модификаторы доступа.
  4. Создание и инициализация объектов. Вызов методов.
  5. Области видимости переменных.
  6. Модификаторы final и static.
  7. Пакеты, инструкция import.

programming - lab4 - title

Лабораторная работа #3-4

В соответствии с выданным вариантом на основе предложенного текстового отрывка из литературного произведения создать объектную модель реального или воображаемого мира, описываемого данным текстом. Должны быть выделены основные персонажи и предметы со свойственным им состоянием и поведением. На основе модели написать программу на языке Java. 

pb-portlet-lab3

Чтобы увидеть описание объектной модели, введите свой номер варианта.

programming - lab4

Этапы выполнения работы:

  1. Получить вариант
  2. Нарисовать UML-диаграмму, представляющую классы и интерфейсы объектной модели и их взаимосвязи;
  3. Придумать сценарий, содержащий действия персонажей, аналогичные приведенным в исходном тексте;
  4. Согласовать диаграмму классов и сценарий с преподавателем;
  5. Написать программу на языке Java, реализующую разработанные объектную модель и сценарий взаимодействия и изменения состояния объектов. При запуске программа должна проигрывать сценарий и выводить в стандартный вывод текст, отражающий изменение состояния объектов, приблизительно напоминающий исходный текст полученного отрывка. 
  6. Продемонстрировать выполнение программы на сервере helios.
  7. Ответить на контрольные вопросы и выполнить дополнительное задание.

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

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

Требования к объектной модели, сценарию и программе:

  1. В модели должны быть представлены основные персонажи и предметы, описанные в исходном тексте. Они должны иметь необходимые атрибуты и характеристики (состояние) и уметь выполнять свойственные им действия (поведение), а также должны образовывать корректную иерархию наследования классов.
  2. Объектная модель должна реализовывать основные принципе ООП - инкапсуляцию, наследование и полиморфизм. Модель должна соответствовать принципам SOLID, быть расширяемой без глобального изменения структуры модели. 
  3. Сценарий должен быть вариативным, то есть при изменении начальных характеристик персонажей, предметов или окружающей среды, их действия могут изменяться и отклоняться от базового сценария, приведенного в исходном тексте. Кроме того, сценарий должен поддерживать элементы случайности (при генерации персонажей, при задании исходного состояния, при выполнении методов).
  4. Объектная модель должна содержать как минимум один корректно использованный элемент каждого типа из списка:
    •   абстрактный класс как минимум с одним абстрактным методом;
    •   интерфейс;
    •   перечисление (enum);
    •   запись (record);
    •   массив или ArrayList для хранения однотипных объектов;
    •   проверяемое исключение.
  5. В созданных классах основных персонажей и предметов должны быть корректно переопределены методы equals(), hashCode() и toString(). Для классов-исключений необходимо переопределить метод getMessage().
  6. Созданные в программе классы-исключения должны быть использованы и обработаны. Кроме того, должно быть использовано и обработано хотя бы одно unchecked исключение (можно свое, можно из стандартной библиотеки).
  7. При необходимости можно добавить внутренние, локальные и анонимные классы.

Содержание отчёта по работе:

  1. Текст задания.
  2. Диаграмма классов объектной модели.
  3. Исходный код программы (можно в виде ссылки на репозиторий).
  4. Результат работы программы.
  5. Выводы по работе.

Вопросы к защите лабораторной работы:

  1. Принципы объектно-ориентированного программирования SOLID и STUPID.
  2. Класс Object. Реализация его методов по умолчанию.
  3. Простое и множественное наследование. Особенности реализации наследования в Java.
  4. Понятие абстрактного класса. Модификатор abstract.
  5. Понятие интерфейса. Реализация интерфейсов в Java. Отличие интерфейсов от абстрактных классов.
  6. Модификаторы default, static и private для методов интерфейса.
  7. Перечисляемый тип данных (enum) в Java. Особенности реализации и использования.
  8. Тип запись (record) в Java. Особенности использования.
  9. Методы и поля с модификаторами static и final.
  10. Перегрузка и переопределение методов.
  11. Обработка исключительных ситуаций, три типа исключений.
  12. Стандартный массив и динамический массив (ArrayList). Основные различия. 
  13. Вложенные, локальные и анонимные классы.

programming - spring


2-й семестр (весна)

programming - lab5 - title

Лабораторная работа #5

pb-portlet-lab5

Чтобы узнать задание, введите свой номер варианта.

programming - lab5 - questions

Отчёт по работе должен содержать:

  1. Текст задания.
  2. Диаграмма классов разработанной программы.
  3. Исходный код программы.
  4. Выводы по работе.

Вопросы к защите лабораторной работы:

  1. Коллекции. Сортировка элементов коллекции. Интерфейсы java.util.Comparable и java.util.Comparator.
  2. Категории коллекций - списки, множества. Интерфейс java.util.Map и его реализации.
  3. Параметризованные типы. Создание параметризуемых классов. Wildcard-параметры.
  4. Классы-оболочки. Назначение, область применения, преимущества и недостатки. Автоупаковка и автораспаковка.
  5. Потоки ввода-вывода в Java. Байтовые и символьные потоки. "Цепочки" потоков (Stream Chains).
  6. Работа с файлами в Java. Класс java.io.File.
  7. Пакет java.nio - назначение, основные классы и интерфейсы.
  8. Утилита javadoc. Особенности автоматического документирования кода в Java.

programming - lab6 - title

Лабораторная работа #6

pb-portlet-lab6

Чтобы узнать задание, введите свой номер варианта.

programming - lab6 - questions

Отчёт по работе должен содержать:

  1. Текст задания.
  2. Диаграмма классов разработанной программы (как клиентского, так и серверного приложения).
  3. Исходный код программы.
  4. Выводы по работе.

Вопросы к защите лабораторной работы:

  1. Сетевое взаимодействие - клиент-серверная архитектура, основные протоколы, их сходства и отличия.
  2. Протокол TCP. Классы Socket и ServerSocket.
  3. Протокол UDP. Классы DatagramSocket и DatagramPacket.
  4. Отличия блокирующего и неблокирующего ввода-вывода, их преимущества и недостатки. Работа с сетевыми каналами.
  5. Классы SocketChannel и DatagramChannel.
  6. Передача данных по сети. Сериализация объектов.
  7. Интерфейс Serializable. Объектный граф, сериализация и десериализация полей и методов.
  8. Java Stream API. Создание конвейеров. Промежуточные и терминальные операции.
  9. Шаблоны проектирования: Decorator, Iterator, Factory method, Command, Flyweight, Interpreter, Singleton, Strategy, Adapter, Facade, Proxy.

programming - lab7 - title

Лабораторная работа #7

pb-portlet-lab7

Чтобы узнать задание, введите свой номер варианта.

programming - lab7 - questions

Порядок выполнения работы:

  1. В качестве базы данных использовать PostgreSQL.
  2. Для подключения к БД на кафедральном сервере использовать хост pg, имя базы данных - studs, имя пользователя/пароль совпадают с таковыми для подключения к серверу.

Отчёт по работе должен содержать:

  1. Текст задания.
  2. Диаграмма классов разработанной программы.
  3. Исходный код программы.
  4. Выводы по работе.

Вопросы к защите лабораторной работы:

  1. Многопоточность. Класс Thread, интерфейс Runnable. Модификатор synchronized.
  2. Методы wait(), notify() класса Object, интерфейсы Lock и Condition.
  3. Классы-сихронизаторы из пакета java.util.concurrent.
  4. Модификатор volatile. Атомарные типы данных и операции.
  5. Коллекции из пакета java.util.concurrent.
  6. Интерфейсы Executor, ExecutorService, Callable, Future
  7. Пулы потоков
  8. JDBC. Порядок взаимодействия с базой данных. Класс DriverManager. Интерфейс Connection
  9. Интерфейсы Statement, PreparedStatement, ResultSet, RowSet
  10. Шаблоны проектирования.

programming - lab8 - questions

Лабораторная работа #8

pb-portlet-lab8

Чтобы узнать задание, введите свой номер варианта.

lab8 - task

Доработать программу из лабораторной работы №7 следующим образом:

Заменить консольный клиент на клиент с графическим интерфейсом пользователя(GUI). 
В функционал клиента должно входить:

  1. Окно с авторизацией/регистрацией.
  2. Отображение текущего пользователя.
  3. Таблица, отображающая все объекты из коллекции
    1. Каждое поле объекта - отдельная колонка таблицы.
    2. Строки таблицы можно фильтровать/сортировать по значениям любой из колонок. Сортировку и фильтрацию значений столбцов реализовать с помощью Streams API.
  4. Поддержка всех команд из предыдущих лабораторных работ.
  5. Область, визуализирующую объекты коллекции
    1. Объекты должны быть нарисованы с помощью графических примитивов с использованием Graphics, Canvas или аналогичных средств графической библиотеки.
    2. При визуализации использовать данные о координатах и размерах объекта.
    3. Объекты от разных пользователей должны быть нарисованы разными цветами.
    4. При нажатии на объект должна выводиться информация об этом объекте.
    5. При добавлении/удалении/изменении объекта, он должен автоматически появиться/исчезнуть/измениться  на области как владельца, так и всех других клиентов. 
    6. При отрисовке объекта должна воспроизводиться согласованная с преподавателем анимация.
  6. Возможность редактирования отдельных полей любого из объектов (принадлежащего пользователю). Переход к редактированию объекта возможен из таблицы с общим списком объектов и из области с визуализацией объекта.
  7. Возможность удаления выбранного объекта (даже если команды remove ранее не было).

Перед непосредственной разработкой приложения необходимо согласовать прототип интерфейса с преподавателем. Прототип интерфейса должен быть создан с помощью средства для построения прототипов интерфейсов(mockplus, draw.io, etc.)

programming - lab8 - questions

Вопросы к защите лабораторной работы:

  1. Компоненты пользовательского интерфейса. Иерархия компонентов.
  2. Базовые классы ComponentContainerJComponent.
  3. Менеджеры компоновки.
  4. Модель обработки событий. Класс-слушатель и класс-событие.
  5. Технология JavaFX. Особенности архитектуры, отличия от AWT / Swing.
  6. Интернационализация. Локализация. Хранение локализованных ресурсов.
  7. Форматирование локализованных числовых данных, текста, даты и времени. Классы NumberFormatDateFormatMessageFormatChoiceFormat.