Часть 1. Java
Тем: 7
Тема 1. Введение
Содержание
- Структура курса
- Лекции
- Домашние задания
- Дифференцированный зачет
- Основные концепции Java
- Компилятор Java (javac)
- Байт-код и виртуальная машина Java (java)
- Java Runtime Environment
- JIT-компиляция
- Сборка мусора
- Редакции Java-платформы
- Micro Edition
- Standard Edition
- Enterprise Edition
- Соглашения об именовании
- Hello world
- Класс HelloWorld
- Метод класса main
- Минимальная версия
- Передача имени пользователя в командной строке
- Обработка нескольких имен пользователей
- Метод capitalizeFirst
Домашнее задание 1. Hello World
- Установите JDK 17+.
-
Скопируйте один из вариантов
HelloWorld
, рассмотренных на практике. -
Откомпилируйте
HelloWorld.java
и получитеHelloWorld.class
. -
Запустите
HelloWorld
и проверьте его работоспособность. -
Создайте скрипт, компилирующий и запускающий
HelloWorld
из командной строки.
Домашнее задание 2. Сумма чисел
-
Разработайте класс
Sum
, который при запуске из командной строки будет складывать переданные в качестве аргументов целые числа и выводить их сумму на консоль. -
Примеры запуска программы:
java Sum 1 2 3
- Результат: 6
java Sum 1 2 -3
- Результат: 0
java Sum "1 2 3"
- Результат: 6
java Sum "1 2" " 3"
- Результат: 6
java Sum " "
- Результат: 0
- цифры;
- знаки
+
и-
; - произвольные пробельные символы.
-
При выполнении задания можно считать, что для представления входных данных
и промежуточных результатов достаточен тип
int
. - Перед выполнением задания ознакомьтесь с документацией к классам String и Integer.
- Для отладочного вывода используйте System.err, тогда он будет игнорироваться проверяющей программой.
Примеры
zipЭкзаменационные вопросы
- Редакции платформы Java. Версии платформы и языка Java. JDK и JRE.
Практические навыки
- Компиляция и запуск программ на Java.
- Реализация простых программ на Java.
Библиография
- Основной сайт по Java
Короткий адрес: java.sun.com - Java Language and Virtual Machine Specifications
- Документация по Java Platform (версия 21)
- Документация по ядру стандартной библиотеки (версия 21)
- Code Conventions for the Java Programming Language
- The Java Tutorials
- Шилдт Г. Java. Полное руководство (12-е издание)
- Шилдт Г. Java 12. Руководство для начинающих (9-е издание)
- Эккель Б. Философия Java (4 издание)
Тема 2. Массивы и ссылки
Содержание
- Одномерные массивы
- Объявление
- Создание
- Длина массива
- Инициализаторы
- Инициализация по-умолчанию
- Итерация
- Многомерные массивы
- Объявление
- Полное и частичное создание
- Непрямоугольные массивы
- Ссылки на массивы
- Ссылки на массивы
- Передача ссылок
- Возврат ссылок
- Ссылки как значения
- Изменения значений по ссылке
- Классы
- Полные имена классов
- Импорт классов
- Создание объектов
- Сборка мусора и уничтожение объектов
- Scanner
- Источники данных
- Строка
- Стандартный ввод
- Получение данных
- Строки
- Числа
- Источники данных
Домашнее задание 3. Реверс
-
Разработайте класс
Reverse
, читающий числа из стандартного ввода и выводящий их на стандартный вывод в обратном порядке. -
В каждой строке входа содержится некоторое количество целых чисел
(возможно ноль).
Числа разделены пробелами.
Каждое число помещается в тип
int
. - Порядок строк в выходе должен быть обратным по сравнению с порядком строк во входе. Порядок чисел в каждой строке также должен быть обратным к порядку чисел во входе.
- Вход содержит не более 10⁶ чисел и строк.
- Для чтения чисел используйте класс Scanner.
-
Примеры работы программы:
Ввод Вывод 1 2 3
3 2 1
3 2 1
1 2 3
1 2 -3
-3 2 1
1 2 3 4
4 3 2 1
Примеры
zipЭкзаменационные вопросы
- Одномерные массивы
- Многомерные массивы
- Ссылки и работа с ними
Практические навыки
- Умение работать с массивами
Библиография
- Java Tutorial. Arrays
- The Java Language Specification. Arrays
- Шилдт Г. Java. Полное руководство (12-е издание) (глава 3)
- Эккель Б. Философия Java (4 издание) (глава 16)
Тема 3. Ввод-вывод и исключения
Содержание
- Исключения
- try-catch
- Проверяемые исключения, throws
- Обработка исключений
- Несколько catch-блоков
- Сообщения об ошибках
- Стек исполнения
- Ресурсы
- Закрытие и утечка ресурсов
- try-catch-finally
- Блок использования ресурса
- Использование нескольких ресурсов одновременно
- Кодировки
- Кодировка по-умолчанию
- Явное указание кодировки
- Readers
- Reader
- FileReader
- BufferedReader
- InputStreamReader
- InputStream
- Writers
- Writer
- FileWriter
- BufferedWriter
- OutputStreamWriter
- OutputStream
- PrintWriter
Домашнее задание 4. Статистика слов
-
Разработайте класс
WordStatInput
, подсчитывающий статистику встречаемости слов во входном файле. -
Словом называется непрерывная последовательность букв,
апострофов (
'
) и дефисов (Unicode category Punctuation, Dash). Для подсчета статистики слова приводятся к нижнему регистру. - Выходной файл должен содержать все различные слова, встречающиеся во входном файле, в порядке их появления. Для каждого слова должна быть выведена одна строка, содержащая слово и число его вхождений во входном файле.
- Имена входного и выходного файла задаются в качестве аргументов командной строки. Кодировка файлов: UTF-8.
- Чтение должно быть реализовано в блочном режиме с использованием Reader.
-
Примеры работы программы:
Входной файл Выходной файл To be, or not to be, that is the question:
to 2 be 2 or 1 not 1 that 1 is 1 the 1 question 1
Monday's child is fair of face. Tuesday's child is full of grace.
monday's 1 child 2 is 2 fair 1 of 2 face 1 tuesday's 1 full 1 grace 1
Шалтай-Болтай Сидел на стене. Шалтай-Болтай Свалился во сне.
шалтай-болтай 2 сидел 1 на 1 стене 1 свалился 1 во 1 сне 1
Примеры
zipПрактические навыки
- Обработка исключений
- Управление ресурсами
- Чтение текстовых файлов
- Запись текстовых файлов
Библиография
- Java Tutorial. Basic IO
- Шилдт Г. Java. Полное руководство (12-е издание) (главы 10 и 20)
- Шилдт Г. Java 12. Руководство для начинающих (9-е издание) (главы 9 и 10)
- Эккель Б. Философия Java (4 издание) (главы 12 и 18)
Тема 4. Классы и объекты
Содержание
- Неизменяемые объекты
- Определение
- Конструкторы
- Методы
- Статические методы
- Изменяемые объекты
- Определение
- Инкапсуляция
Домашнее задание 5. Свой сканер
- Реализуйте свой аналог класса Scanner на основе Reader.
-
Примените разработанный
Scanner
для решения задания «Реверс». -
Примените разработанный
Scanner
для решения задания «Статистика слов». - Нужно использовать блочное чтение. Код, управляющий чтением, должен быть общим.
- Сложный вариант. Код, выделяющий числа и слова, должен быть общим.
-
Обратите внимание на:
- Обработку ошибок.
- Модификаторы доступа.
- Слова и числа, пересекающие границы блоков, особенно — больше одного раза.
Примеры
zipЭкзаменационные вопросы
- Объекты-значения и объекты-сущности
- Поля, конструкторы, методы
Практические навыки
- Умение реализовывать простые неизменяемые объекты
- Умение реализовывать простые изменяемые объекты
Тема 5. Коллекции
Содержание
- Общие понятия
- Интерфейсы
- Параметры типов
- Равенство и equals()
- Хэширование и hashCode()
- Списки
- Класс ArrayList
- Класс LinkedList
- Интерфейс List
- Arrays.asList
- Добавление и удаление элементов
- Индексированный доступ
- Итерация
- Множества
- Класс (Linked)HashSet
- Интерфейс Set
- Добавление и удаление элементов
- Итерация
- Коллекции
- Отображения
- Класс (Linked)HashMap
- Класс TreeMap
- Интерфейс Map
- Отображения как ассоциативные массивы
- Упорядоченные коллекции
- Сравнение и compareTo(..)
- Компараторы
- Класс TreeSet и интерфейс NavigableSet
- Класс TreeMap и интерфейс NavigableMap
Домашнее задание 6. Статистика слов++
-
Разработайте класс
Wspp
, который будет подсчитывать статистику встречаемости слов во входном файле. -
Словом называется непрерывная последовательность букв,
апострофов (
'
) и дефисов (Unicode category Punctuation, Dash). Для подсчета статистики слова приводятся к нижнему регистру. - Выходной файл должен содержать все различные слова, встречающиеся во входном файле, в порядке их появления. Для каждого слова должна быть выведена одна строка, содержащая слово, число его вхождений во входной файл и номера вхождений этого слова среди всех слов во входном файле.
- Имена входного и выходного файла задаются в качестве аргументов командной строки. Кодировка файлов: UTF-8.
- Программа должна работать за линейное от размера входного файла время.
- Для реализации программы используйте Collections Framework.
- Сложный вариант.
Реализуйте и примените класс
IntList
, компактно хранящий список целых чисел. -
Примеры работы программы:
Входной файл Выходной файл To be, or not to be, that is the question:
to 2 1 5 be 2 2 6 or 1 3 not 1 4 that 1 7 is 1 8 the 1 9 question 1 10
Monday's child is fair of face. Tuesday's child is full of grace.
monday's 1 1 child 2 2 8 is 2 3 9 fair 1 4 of 2 5 11 face 1 6 tuesday's 1 7 full 1 10 grace 1 12
Шалтай-Болтай Сидел на стене. Шалтай-Болтай Свалился во сне.
шалтай-болтай 2 1 5 сидел 1 2 на 1 3 стене 1 4 свалился 1 6 во 1 7 сне 1 8
Примеры
zipПрактические навыки
- Базовые навыки в использовании стандартных коллекций
Тема 6. Наследование
Содержание
- Интерфейсы
- Определение
- Применение
- Реализация
- Наследование
- Синтаксис
- Применение
- Модификатор protected
- Пакеты
- Синтаксис
- Применение
Домашнее задание 7. Разметка
- Разработайте набор классов для текстовой разметки.
-
Класс
Paragraph
может содержать произвольное число других элементов разметки и текстовых элементов. -
Класс
Text
– текстовый элемент. -
Классы разметки
Emphasis
,Strong
,Strikeout
– выделение, сильное выделение и зачеркивание. Элементы разметки могут содержать произвольное число других элементов разметки и текстовых элементов. -
Все классы должны реализовывать метод
toMarkdown(StringBuilder)
, который должен генерировать Markdown-разметку по следующим правилам:- текстовые элементы выводятся как есть;
-
выделенный текст окружается символами '
*
'; -
сильно выделенный текст окружается символами '
__
'; -
зачеркнутый текст окружается символами '
~
'.
-
Следующий код должен успешно компилироваться:
Paragraph paragraph = new Paragraph(List.of( new Strong(List.of( new Text("1"), new Strikeout(List.of( new Text("2"), new Emphasis(List.of( new Text("3"), new Text("4") )), new Text("5") )), new Text("6") )) ));
Вызовparagraph.toMarkdown(new StringBuilder())
должен заполнять переданныйStringBuilder
следующим содержимым:__1~2*34*5~6__
-
Разработанные классы должны находиться в пакете
markup
.
Примеры
zipПрактические навыки
- Базовое понимание интерфейсов, наследования и связанных концепций
Тема 7. Синтаксис Java
Содержание
- Типы данных
- Примитивные типы данных
- Целочисленные типы
- Символьный тип
- Числа с плавающей точкой
- Обертки примитивных типов
- Ссылочные типы
- Массивы
- Объявления
- Литералы
- Как объекты
- Ковариантность
- Reification
- Объекты
- Класс String
- Метод toString
- Класс StringBuilder
- Массивы
- Примитивные типы данных
- Операции
- Приоритеты
- Ассоциативность
- Операторы
- Простые
- Ветвления
- Циклы
- Переходы
- Структура исходного кода
- Заголовок
- Классы
- Интерфейсы
- Поля
- Конструкторы
- Методы
- Инициализаторы
Домашнее задание 8. Git
Загрузите решения домашних заданий (в том числе сданных) в ваш персональный git-репозиторий. Со следующей недели сдача домашних заданий будет производиться только через репозитории.
Персональные репозитории являются клонами этого репозитория. В нём вы можете ознакомиться с правилами ведения репозитория и рекомендациями по его настройке.
Персональные репозитории имеют URL
https://www.kgeorgiy.info/git-students/year2024/<USER>/prog-intro
,
где <USER>
— имя пользователя в PCMS
(пароль так же используется из PCMS).
Если у вас нет логина/пароля в PCMS, то
cоберитесь группой и обратитесь к Николаю Викторовичу.
Домашнее задание 9. Markdown to HTML
- Разработайте конвертер из Markdown-разметки в HTML.
-
Конвертер должен поддерживать следующие возможности:
- Абзацы текста разделяются пустыми строками.
-
Элементы строчной разметки:
выделение (
*
или_
), сильное выделение (**
или__
), зачеркивание (--
), код (`
) -
Заголовки (
#
* уровень заголовка)
-
Конвертер должен называться
md2html.Md2Html
и принимать два аргумента: название входного файла с Markdown-разметкой и название выходного файла c HTML-разметкой. Оба файла должны иметь кодировку UTF-8. -
При выполнении этого ДЗ можно повторно использовать код
ДЗ
markup
. - Конвертер может хранить исходные и сконвертированные данные в памяти, в том числе одновременно.
-
Пример
-
Входной файл
# Заголовок первого уровня ## Второго ### Третьего ## уровня #### Четвертого # Все еще четвертого Этот абзац текста содержит две строки. # Может показаться, что это заголовок. Но нет, это абзац, начинающийся с `#`. #И это не заголовок. ###### Заголовки могут быть многострочными (и с пропуском заголовков предыдущих уровней) Мы все любим *выделять* текст _разными_ способами. **Сильное выделение**, используется гораздо реже, но __почему бы и нет__? Немного --зачеркивания-- еще никому не вредило. Код представляется элементом `code`. Обратите внимание, как экранируются специальные HTML-символы, такие как `<`, `>` и `&`. Знаете ли вы, что в Markdown, одиночные * и _ не означают выделение? Они так же могут быть заэкранированы при помощи обратного слэша: \*. Лишние пустые строки должны игнорироваться. Любите ли вы *вложенные __выделения__* так, как __--люблю--__ их я?
-
Выходной файл
<h1>Заголовок первого уровня</h1> <h2>Второго</h2> <h3>Третьего ## уровня</h3> <h4>Четвертого # Все еще четвертого</h4> <p>Этот абзац текста содержит две строки.</p> <p> # Может показаться, что это заголовок. Но нет, это абзац, начинающийся с <code>#</code>.</p> <p>#И это не заголовок.</p> <h6>Заголовки могут быть многострочными (и с пропуском заголовков предыдущих уровней)</h6> <p>Мы все любим <em>выделять</em> текст <em>разными</em> способами. <strong>Сильное выделение</strong>, используется гораздо реже, но <strong>почему бы и нет</strong>? Немного <s>зачеркивания</s> еще никому не вредило. Код представляется элементом <code>code</code>.</p> <p>Обратите внимание, как экранируются специальные HTML-символы, такие как <code><</code>, <code>></code> и <code>&</code>.</p> <p>Знаете ли вы, что в Markdown, одиночные * и _ не означают выделение? Они так же могут быть заэкранированы при помощи обратного слэша: *.</p> <p>Лишние пустые строки должны игнорироваться.</p> <p>Любите ли вы <em>вложенные <strong>выделения</strong></em> так, как <strong><s>люблю</s></strong> их я?</p>
-
Реальная разметка
Заголовок первого уровня
Второго
Третьего ## уровня
Четвертого # Все еще четвертого
Этот абзац текста содержит две строки.
# Может показаться, что это заголовок. Но нет, это абзац, начинающийся с
#
.#И это не заголовок.
Заголовки могут быть многострочными (и с пропуском заголовков предыдущих уровней)
Мы все любим выделять текст разными способами. Сильное выделение, используется гораздо реже, но почему бы и нет? Немного
зачеркиванияеще никому не вредило. Код представляется элементомcode
.Обратите внимание, как экранируются специальные HTML-символы, такие как
<
,>
и&
.Знаете ли вы, что в Markdown, одиночные * и _ не означают выделение? Они так же могут быть заэкранированы при помощи обратного слэша: *.
Лишние пустые строки должны игнорироваться.
Любите ли вы вложенные выделения так, как
люблюих я?
-
Входной файл
Домашнее задание 10. Чемпионат
- Решите как можно больше задач Чемпионата северо-запада России по программированию 2019.
-
Материалы соревнования:
- PCMS: Java. North-Western Russia Regional Contest - 2019
- Условия задач
- Разбор задач
-
Задачи для решения
Задача Тема Сложность A. Accurate Movement Формула 5 B. Bad Treap Циклы 10 C. Cross-Stitch Графы 40 D. Double Palindrome Массивы 40 E. Equidistant Деревья 30 H. High Load Database Массивы 20 I. Ideal Pyramid Циклы 15 J. Just the Last Digit Матрицы 20 K. King’s Children Массивы 40 M. Managing Difficulties Коллекции 10 - Рекомендуемое время выполнения задания: 3 часа.
- Дедлайн: вторник, 12 ноября, 9:00.
Экзаменационные вопросы
- Типы данных
- Операции
- Операторы
- Структура исходного кода
Практические навыки
- Реализация программ на Java с применением интерфейсов и абстрактных базовых классов
Часть 2. Объектно-ориентированное программирование
Тем: 4
Тема 8. Пример: крестики-нолики
Содержание
- Игрок
- Интерфейс
- Случайный
- Последовательный
- Живой
- Доска
- Интерфейс игрока
- Интерфейс игры
- Реализация
- Игра
- Игроки и ходы
- Результаты
- Реализация
Примеры
zipДомашнее задание 11. Игра m,n,k
В этом домашнем задании вы можете пользоваться кодом, написанным на лекции. Он есть на сайте курса.
- Реализуйте игру m,n,k (k в ряд на доске m×n).
- Добавьте обработку ошибок ввода пользователя. В случае ошибочного хода пользователь должен иметь возможность сделать другой ход.
- Добавьте обработку ошибок игроков. В случае ошибки игрок автоматически проигрывает.
- Простая версия. Доска может производить обработку хода за O(nmk).
- Сложная версия.
- Доска должна производить обработку хода (проверку корректности, изменение состояния и определение результата) за O(k).
-
Предотвратите жульничество: у игрока не должно быть
возможности достать
Board
изPosition
.
- Бонусная версия.
Реализуйте
Winner
— игрок, который выигрывает всегда, когда это возможно (против любого соперника). -
Код должен находиться в пакете
game
.
Экзаменационные вопросы
- Пример гибкого дизайна на основе ООП
Практические навыки
- Умение модифицировать существующие ОО-приложения
Тема 9. Введение в ОО дизайн
Содержание
- SOLID
- SRP: Принцип единственной ответственности
- OCP: Принцип открытости/закрытости
- LSP: Принцип подстановки Лисков
- ISP: Принцип разделения интерфейса
- DIP: Принцип инверсии зависимостей
- Квадрат и прямоугольник
- Постановка задачи
- Источник проблем
- Возможные решения
- Отказ от изменений
- Возврат нового значения
- Возврат флага
- Исключения
- Отказ от наследования
- Полный
- Выделение общего базового класса
- Дополнительные действия
- Выделение модифицируемых сущностей
- Отказ от квадратов
- Отказ от изменений
- Равенство
- Свойства равенства
- Метод equals
- Метод hashCode
- Взаимодействие с наследованием
- Наиваная реализация
- Использование сравнения предка
- Сегрегация сравнения
Домашнее задание 12. Выражения
-
Разработайте классы
Const
,Variable
,Add
,Subtract
,Multiply
,Divide
для вычисления выражений с одной переменной в типеint
(интерфейсExpression
). -
Классы должны позволять составлять выражения вида
new Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) ).evaluate(5)
При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра методуevaluate
. Таким образом, результатом вычисления приведенного примера должно стать число 7. -
Метод
toString
должен выдавать запись выражения в полноскобочной форме. Напримерnew Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) ).toString()
должен выдавать((2 * x) - 3)
. - Сложный вариант.
Метод
toMiniString
(интерфейсToMiniString
) должен выдавать выражение с минимальным числом скобок. Напримерnew Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) ).toMiniString()
должен выдавать2 * x - 3
. -
Реализуйте метод
equals
, проверяющий, что два выражения совпадают. Например,new Multiply(new Const(2), new Variable("x")) .equals(new Multiply(new Const(2), new Variable("x")))
должно выдаватьtrue
, аnew Multiply(new Const(2), new Variable("x")) .equals(new Multiply(new Variable("x"), new Const(2)))
должно выдаватьfalse
. -
Для тестирования программы должен быть создан класс
Main
, который вычисляет значение выраженияx2−2x+1
, дляx
, заданного в командной строке. -
При выполнении задания следует обратить внимание на:
- Выделение общего интерфейса создаваемых классов.
- Выделение абстрактного базового класса для бинарных операций.
Экзаменационные вопросы
- Принципы SOLID
- Проблема квадрата и прямоугольника
- Равенство объектов
Практические навыки
- Умение определять необходимость наследования
- Умение реализовывать корректное сравнение объектов на равенство
Библиография
- Robert C. M. Design Principles and Design Patterns
- Wikipedia Wikipedia: SOLID
- Robert C. M. The Liskov Substitution Principle
- Wikipedia Circle-Ellipse problem
- Odersky M., Spoon L., Venners B. How to Write an Equality Method in Java
Тема 10. Разбор текста
Содержание
- База
- Источники
- test, take и expect
- Генерация ошибок
- Тестирование
- Метод рекурсивного спуска
- Разбор вариантов
- Рекурсия
- JSON
- Строки
- Числа
- Массивы
- Объекты
Примеры
zipБиблиография
Тема 11. Обработка ошибок и исключения
Содержание
- Методы обработки ошибок
- Не обрабатывать
- Коды возврата
- Установка флага ошибки
- Метод обработки ошибки
- Завершение программы
- Исключения
- Пример исключения
- Классификация исключений
- Проверяемые исключения
- Непроверяемые исключения
- Ошибки
- try-catch-finally
- Применение исключений
- Управление ресурсами
- Управление на исключениях
- Игнорирование исключений
- Разработка исключений
- Проверяемое или не проверяемое?
- Техника обертывания
- Исключения в Java 7+
- Try с ресурсами
- Обработка нескольких исключений одновременно
- Гарантии безопасности
- Отсутствие гарантий
- Отсутствие утечек
- Слабые гарантии
- Сильные гарантии
- Гарантия отсутствия исключений
Часть 3. Разное
Тем: 5
Тема 12. Generics
Содержание
- Введение в Generics
- Полиморфизм и его типы
- Generics и templates
- Применение Generics
- Реализация Generics
- Wildcards и ограниченные wildcards
- Параметры типов и ограниченные параметры типов
- Ограничения Generics и reifables
- Generics и вариантность
- Ко- и контрвариантность
- Источники и приемники
- Правило выбора extends и super
- Смешение Generic и не Generic кода
- Стирание информации о типе и сырые типы
- Добавление информации о типе и UncheckedWarning
Тема 13. Перечисления
Содержание
- Классы перечислений
- Операции с перечислениями
- Коллекции для перечислений
Тема 14. Улучшения языка
Содержание
- Функциональные интерфейсы (8+)
- Вывод типа переменной (10+)
- Запуск исходного кода (11+)
- Switch-выражения (14+)
- Текстовые блоки (15+)
- Записи (16+)
- Сопоставление с образцом (16+)
- Закрытые классы (17+)
Тема 15. Система контроля версий Git
Содержание
- Введение в системы контроля версии
- Git Workflow
- clone
- add / remove
- commit
- pull
- merge
- push
- Ветки
- Feature branch branch
- Release branch
- Ветки в git
Библиография
Тема 16. Регулярные выражения
Содержание
- Выражения
- Символы и классы символов
- Границы
- Квантификаторы
- Типы квантификаторов
- Жадность квантификаторов
- Группы
- Lookahead/begind
- Специальные конструкции