Домашнее задание 1. Hello World
- Установите JDK 21+.
-
Скопируйте исходный код
HelloWorld.javaиз архива с примерами к лекции intro.zip. -
Откомпилируйте
HelloWorld.javaи получитеHelloWorld.class. -
Запустите
HelloWorldи проверьте, что он выводитHello, World!. -
Создайте скрипт, компилирующий и запускающий
HelloWorldиз командной строки. Если вы не умеете писать скрипты, воспользуйтесь одной из инструкций: Windows, Linux, MacOS. -
Измените
HelloWorld.javaтак, чтобы он выводилHello, prog-intro!и проверьте это запуском вашего скрипта.
Домашнее задание 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, тогда он будет игнорироваться проверяющей программой.
Домашнее задание 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
Домашнее задание 4. Статистика слов
-
Разработайте класс
WordStat, подсчитывающий статистику встречаемости слов во входном файле. -
Словом называется непрерывная последовательность букв,
апострофов (
') и дефисов (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
Домашнее задание 5. Свой сканер
- Реализуйте свой аналог класса Scanner на основе Reader.
-
Примените разработанный
Scannerдля решения задания «Реверс». -
Примените разработанный
Scannerдля решения задания «Статистика слов». - Нужно использовать блочное чтение. Код, управляющий чтением, должен быть общим.
- Сложный вариант. Код, выделяющий числа и слова, должен быть общим.
-
Обратите внимание на:
- Обработку ошибок.
- Модификаторы доступа.
- Слова и числа, пересекающие границы блоков, особенно — больше одного раза.
Домашнее задание 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 10Monday'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
Домашнее задание 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__ -
Добавьте класс
Main, проверяющий выполнение предыдущего пункта. -
Разработанные классы должны находиться в пакете
markup.
Домашнее задание 8. Git
Загрузите решения домашних заданий (в том числе сданных) в ваш персональный git-репозиторий. Со следующей недели сдача домашних заданий будет производиться только через репозитории.
Персональные репозитории являются клонами этого репозитория. В нём вы можете ознакомиться с правилами ведения репозитория и рекомендациями по его настройке.
Персональные репозитории имеют URL
https://www.kgeorgiy.info/git-students/year2025/<USER>/prog-intro,
где <USER> — имя пользователя в PCMS
(пароль так же используется из PCMS).
Если у вас нет логина/пароля в PCMS, то
соберитесь группой и обратитесь к Николаю Викторовичу.
Домашнее задание 9. Markdown to HTML
- Разработайте конвертер из Markdown-разметки в HTML.
-
Конвертер должен поддерживать следующие возможности:
- Абзацы текста разделяются пустыми строками.
-
Элементы строчной разметки:
выделение (
*или_), сильное выделение (**или__), зачеркивание (--), код (`) -
Заголовки (
#* уровень заголовка)
-
Конвертер должен называться
md2html.Md2Htmlи принимать два аргумента: название входного файла с Markdown-разметкой и название выходного файла с 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, одиночные * и _ не означают выделение? Они так же могут быть заэкранированы при помощи обратного слэша: *.
Лишние пустые строки должны игнорироваться.
Любите ли вы вложенные выделения так, как
люблюих я?
-
Входной файл