s01done, s02started

This commit is contained in:
Ivan I. Ovchinnikov 2022-12-15 10:24:31 +03:00
parent d493adf10b
commit f4551ea09f
10 changed files with 281 additions and 148 deletions

View File

@ -186,9 +186,9 @@
С & Функции, манипулирующие данными & Задания, использующие ссылочные свойства массивов, перегрузку функций. Добавить бинарные арифметики, двоичные представления чисел\\
Л & Специализация: ООП & Инкапсуляция: Классы и объекты (static, private/public, final, интерфейс взаимодействия с объектом); Наследование: extends, Object (глобальное наследование), protected, преобразование типов, final; Полиморфизм: override, abstract, final;\\
С & Классы и объекты & Использование свойств статичности сущностей. Сложные случаи несоблюдения инкапсуляции, Демонстрация порядка работы конструкторов при наследовании, сложные случаи полиморфизма.\\
Л & ООП и исключения & внутренние классы, вложенные классы; перечисления (создание, конструкторы перечислений, объекты перечислений, дополнительные свойства); Механизм и понятие, введение в \textbf{многопоточность}, throw; Наследование и полиморфизм в исключениях; Способы обработки исключений (try/catch, throws, finally); try-with-resources, штатные и нештатные ситуации \\
С & Обработка исключений & Создание, выбрасывание и обработка исключений, обработка исключений в стиле «до захвата ресурса», проброс исключений\\
Л & Специализация: Тонкости работы & Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?\\
Л & ООП и исключения & внутренние классы, вложенные классы; перечисления (создание, конструкторы перечислений, объекты перечислений, дополнительные свойства); Механизм и понятие, введение в \textbf{многопоточность}, throw; Наследование и полиморфизм в исключениях; Способы обработки исключений (try/catch, throws, finally); try-with-resources, штатные и нештатные ситуации \\
С & Обработка исключений & Создание, выбрасывание и обработка исключений, обработка исключений в стиле «до захвата ресурса», проброс исключений\\
Л & Специализация: Тонкости работы & Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?\\
С & Внешний мир & Создание, отправка и принятие данных в общепринятых форматах. Сохранение и загрузка состояния программы между запусками, работа с большими текстами (поиск, замена, генерация)\\
\hline
\end{longtable}
@ -414,4 +414,3 @@ Bazel\\
\subsection{Часть сценария одной из лекций}
\end{document}

Binary file not shown.

Binary file not shown.

View File

@ -2,6 +2,7 @@
\usepackage{spreadtab}
\begin{document}
\sloppy
\section{Семинар: компиляция и интерпретация кода}
\subsection{Инструментарий}
\begin{itemize}
@ -75,7 +76,30 @@
\end{itemize}
\item \textbf{Вопросы и ответы:}
\begin{enumerate}
\item
\item Какой механизм используется для непосредственного исполнения скомпилированного кода? (3)
\begin{enumerate}
\item JDK;
\item JRE;
\item JVM.
\end{enumerate}
\item Какая сущность только объединяет классы по смыслу? (1)
\begin{enumerate}
\item Пакеты;
\item Библиотеки;
\item Фреймворки.
\end{enumerate}
\item Основная единица исходного кода программы - это? (2)
\begin{enumerate}
\item Функция;
\item Класс;
\item Файл.
\end{enumerate}
\item Какой ключ используется для указания папки назначения? (1)
\begin{enumerate}
\item \code{-d};
\item \code{-out};
\item \code{-to}.
\end{enumerate}
\end{enumerate}
\end{itemize}
@ -145,13 +169,25 @@ javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере пользователя, а второй забирать скомпилированные классы и исполнять их.
\textbf{Вариант решения}
Для упрощения был использован docker compose, вместо чистого Docker. Файлы, компилирующие и исполняющие программу представлены в листингах ниже. Оба эти файла запускаются из корня папки проекта командами
\begin{verbatim}
docker compose -f docker-compose-class.yml up
docker compose -f docker-compose-exec.yml up
\end{verbatim}
соответственно.
\lstinputlisting[style=CCodeStyle,caption={docker-compose-class.yml}]{src/s01-h04-docker-compose-class.yml}
\lstinputlisting[style=CCodeStyle,caption={docker-compose-exec.yml}]{src/s01-h04-docker-compose-exec.yml}
\end{itemize}
\end{itemize}
\subsubsection{Вопросы и ответы}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе.
\item \textbf{Тайминг} 5-15 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
@ -301,7 +337,7 @@ javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
\item \textbf{Задания}
\begin{enumerate}
\item Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
\item
\item Создать докер образ для формирования полной документации по проекту/
\end{enumerate}
\end{itemize}
@ -321,4 +357,3 @@ javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
\end{itemize}
\end{document}

View File

@ -7,7 +7,6 @@
\begin{itemize}
\item Презентация для преподавателя, ведущего семинар;
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
\item \href{https://jupyter.org/install}{Jupyter Notebook} для практики и примеров используется Jupyter notebook (потребуется установить \href{https://www.python.org/downloads/}{Python} и ядро \href{https://github.com/SpencerPark/IJava}{IJava}) и любой терминал операционной системы (bash, zsh, cmd);
\item JDK любая 11 версии и выше;
\item \href{https://www.jetbrains.com/idea/download}{IntelliJ IDEA Community Edition} для практики и примеров используется IDEA.
\end{itemize}
@ -30,17 +29,21 @@
\hline
@ Quiz & 5 & @ 3-14 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ лекции & 15 & @ 15-18 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
@ Рассмотрение ДЗ лекции & 10 & @ 15-18 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 19 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 10 & @ 20-22 & @ Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки. Показать выполненные терминальные команды, результат компиляции. (* отделить исходный код от скомпилированных файлов, ** сложить исходный код в пакет) \\
@ Задание 1 & 10 & @ 20-22 & @ Сравнить насколько разные могут быть прочтения одного и того же технического задания - одна функция для двух значений, возврат значений, возврат индекса, объявление исходного массива внутри функции поиска и др); \\
\hline
@ Задание 2 & 10 & @ 23-25 & @ Корректная манипуляция индексами, как следствие, сокращение числа возможных проходов по массиву и ускорение работы приложени \\
\hline
@ Перерыв (если нужен) & 5 & @ 26 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 2 & 10 & @ 23-25 & @ Настроить окружение Jupyter Notebook с ядром Java, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown. (* осуществить форматированный вывод, ** сохранить форматирующую строку в ячейке с переменной) \\
@ Задание 3 & 20 & @ 27-29 & @ Формирование алгоритмического мышления при решении задач с описанием верхнего уровня \\
\hline
@ Задание 3 & 15 & @ 27-29 & @ К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать программную документацию. (* создать документацию на каждый пакет по отдельности) \\
@ Задание 4 & 15 & @ 27-29 & @ Понимание внутренней механики работы фреймворка коллекций, повышение уровня абстракции написанного кода \\
\hline
@ Задание 5 (необязат) & 20 & @ 27-29 & @ Описание базовых алгоритмов манипуляции данными с применением вспомогательных массивов \\
\hline
@ Домашнее задание & 5 & @ 39 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ -76,30 +79,7 @@
\end{itemize}
\item \textbf{Вопросы и ответы:}
\begin{enumerate}
\item Какой механизм используется для непосредственного исполнения скомпилированного кода? (3)
\begin{enumerate}
\item JDK;
\item JRE;
\item JVM.
\end{enumerate}
\item Сущность, объединяющая классы по смыслу (1)
\begin{enumerate}
\item Пакет;
\item Фреймворк;
\item Библиотека.
\end{enumerate}
\item Основная единица исходного кода программы. (1)
\begin{enumerate}
\item Класс;
\item Пакет;
\item Функция.
\end{enumerate}
\item Какой ключ используется для указания директории назначения в командах компилятора? (2)
\begin{enumerate}
\item \code{-out};
\item \code{-d};
\item \code{-classpath}
\end{enumerate}
\item
\end{enumerate}
\end{itemize}
@ -114,62 +94,24 @@
\end{itemize}
\item \textbf{Домашнее задание из лекции:}
\begin{itemize}
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю.
\item Написать метод «Шифр Цезаря», с булевым параметром зашифрования/расшифрования, и числовым ключом;
\textbf{Вариант решения}
\begin{figure}[H]
\centering
\includegraphics[width=100mm]{sem-01-struct.png}
\caption{Структура проекта}
\end{figure}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Шифр Цезаря}]{src/s02-h1-caesar.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код основного класса}]{src/s01-h01-Main.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код считающего класса}]{src/s01-h01-OtherClass.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код декоратора}]{src/s01-h01-Decorator.java}
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.
\item Написать метод, принимающий на вход массив чисел и параметр \code{n}. Метод должен осуществить циклический (последний элемент при сдвиге становится первым) сдвиг всех элементов массива на n позиций;
\textbf{Вариант решения}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
java -classpath ./out ru.gb.jcore.sample.Main
\end{lstlisting}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Сдвиговый метод}]{src/s02-h2-shifter.java}
\begin{figure}[H]
\centering
\includegraphics[width=60mm]{sem-01-hw2-compile.png}
\caption{Результат компиляции}
\end{figure}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команда создания документации}]
javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
\end{lstlisting}
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-hw2-doc.png}
\caption{Результат создания документации}
\end{figure}
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
\textbf{Вариант решения}\footnote{Обратите внимание, что все отступы сделаны не пробелами, а табуляцией, иначе Makefile не работает}
\lstinputlisting[style=CCodeStyle,caption={Makefile}]{src/s01-h03-Makefile}
\begin{figure}[H]
\centering
\includegraphics[width=80mm]{sem-01-hw03.png}
\caption{Результат выполнения тасков}
\end{figure}
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере пользователя, а второй забирать скомпилированные классы и исполнять их.
\item Написать метод, которому можно передать в качестве аргумента массив, состоящий строго из единиц и нулей (целые числа типа \code{int}). Метод должен заменить единицы в массиве на нули, а нули на единицы и не содержать ветвлений. Написать как можно больше вариантов метода
\textbf{Вариант решения}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Инверсия}]{src/s02-h3-inverse.java}
\end{itemize}
\end{itemize}
@ -189,125 +131,240 @@ javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
\subsubsection{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа} Создание, компиляция и запуск проектов без использования среды разработки.
\item \textbf{Тайминг} 10-20 минут.
\item \textbf{Ценность этапа} Базовая манипуляция данными внутри массива.
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (запуск приложений на сервере, в контейнерах, настройка CI/CD в пет-проектах);
\item Первые пять минут уклоняться от ответов на уточняющие вопросы
\item Пояснить студентам ценность опыта (сравнить насколько разные могут быть прочтения одного и того же технического задания - одна функция для двух значений, возврат значений, возврат индекса, объявление исходного массива внутри функции поиска и др);
\item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}:
\begin{itemize}
\item Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки.
\item Задать одномерный массив. Написать методы поиска в нём минимального и максимального элемента;
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Простейший проект}]
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Поиск минимального значения}]
private static int findMin(int[] a) { // returns the minimum value
int min = a[0];
for (int i = 1; i < a.length; i++) {
if (a[i] < min) {
min = a[i];
}
}
return min;
}
\end{lstlisting}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac Main.java
java Main
\end{lstlisting}
\item [$*_1$] отделить исходный код от скомпилированных файлов
\textbf{Вариант решения}
\begin{lstlisting}[style=ASMStyle]
javac -d out Main.java
java -classpath ./out Main
\end{lstlisting}
\item [$*_2$] сложить исходный код в пакет с глубиной иерархии не менее 3.
\item [$*_1$] Привести функции к корректному виду и дополнительно написать ещё две функции так, чтобы получились (четыре) функции поиска минимального и максимального как значения, так и индекса.
\textbf{Вариант решения}
Вручную создать соответствующие вложенные папки, переместить в них файл с исходным кодом \code{Main.java} и написать оператор \code{package} первой строкой файла \code{Main.java}.
\begin{lstlisting}[style=ASMStyle]
javac -d out ru/gb/jcore/Main.java
java -classpath ./out ru.gb.jcore.Main
\end{lstlisting}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Поиск индекса максимального значения}]
private static int findMax(int[] a) { // returns the maximum index
int max = 0;
for (int i = 1; i < a.length; i++) {
if (a[i] > a[max])
max = i;
}
return max;
}
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Настройка и изучение дополнительного инструментария для создания проектов и описания работы фрагментов кода в виде Jupyter notebook.
\item \textbf{Ценность этапа} Оптимизация сложности алгоритмов при работе с многомерными массивами.
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (использование скриптовых возможностей среды разработки, таких как написание простых фрагментов кода без необходимости создавать большой проект в тяжеловесной среде разработки);
\item Пояснить студентам ценность этого опыта (корректная манипуляция индексами, как следствие, сокращение числа возможных проходов по массиву и ускорение работы приложения);
\item Пояснить студентам в каком виде выполнять и сдавать задания;
\item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Настроить окружение Jupyter Notebook с ядром IJava, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown.
\item Создать квадратный целочисленный массив (количество строк и столбцов одинаковое), заполнить его диагональные элементы единицами, используя цикл(ы)
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-t2-1.png}
\caption{Вариант решения}
\end{figure}
\textbf{Вариант решения}
\item [$*_1$] осуществить форматированный вывод
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант решения (вторая ячейка)}]
System.out.print("Your number is " + a);
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Заполнение диагональных элементов}]
private static void fillDiagonal(int[][] a) {
for (int i = 0; i < a.length; i++) {
a[i][i] = 1;
a[i][a.length - 1 - i] = 1;
}
}
\end{lstlisting}
\item [$*_1$] дописать функцию вывода двумерного массива в консоль
\item [$*_1$] сохранить форматирующую строку в ячейке с переменной
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-t2-2.png}
\caption{Вариант решения}
\end{figure}
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вывод массива в терминал}]
private static void printTwoDimArray(int[][] a) {
for (int i = 0; i < a.length; i++) {
System.out.println(Arrays.toString(a[i]));
}
}
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 3}
\begin{itemize}
\item \textbf{Ценность этапа} Закрепление навыков создания стандартной программной документации.
\item \textbf{Ценность этапа} Формирование алгоритмического мышления при решении задач с описанием верхнего уровня.
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (описание пет-проектов для потенциальных соисполнителей, создание базы знаний по проекту на случай длительных пауз в работе)
\item Пояснить студентам ценность этого опыта (ТЗ довольно редко бывают чёткими и никогда не говорят программисту, что именно нужно написать);
\item Выдать задание группам студентов;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Написать метод, в который передается не пустой одномерный целочисленный массив, метод должен вернуть true если в массиве есть место, в котором сумма левой и правой части массива равны. Примеры:
\begin{itemize}
\item [] \code{checkBalance([1, 1, 1, || 2, 1])} $\to$ \code{true},
\item [] \code{checkBalance([2, 1, 1, 2, 1])} $\to$ \code{false},
\item [] \code{checkBalance([10, || 1, 2, 3, 4])} $\to$ \code{true}.
\end{itemize}
Абстрактная граница показана символами \code{||}, эти символы в массив не входят.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант со сложностью $O(n^2)$}]
private static boolean checkBalance(int[] a) {
int left = 0;
for (int i = 0; i < a.length - 1; i++) {
left += a[i];
int right = 0;
for (int j = i + 1; j < a.length; j++) {
right += a[j];
}
if (left == right) return true;
}
return false;
}
\end{lstlisting}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант со сложностью $O(2n)$}]
private static boolean checkBalance2(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
if (sum % 2 != 0) return false;
int left = 0;
for (int i = 0; i < a.length; i++) {
left += a[i];
sum -= a[i];
if (left == sum) return true;
}
return false;
}
\end{lstlisting}
\item [$*_1$] написать этот же метод таким образом, чтобы в нём использовался только один цикл.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={* Вариант со сложностью $O(n)$}]
private static boolean checkBalance3(int[] a) {
int lbound = 0;
int rbound = a.length - 1;
int left = 0;
int right = 0;
while (lbound <= rbound) {
if (left > right)
right += a[rbound--];
else
left += a[lbound++];
}
return left == right;
}
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 4}
\begin{itemize}
\item \textbf{Ценность этапа} Понимание внутренней механики работы фреймворка коллекций, повышение уровня абстракции написанного кода.
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (написание собственных функций, реализующих алгоритмы часто помогает в ситуациях, когда задача не решается стандартными средствами)
\item Выдать задание группам студентов
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\item Если нужно, через 7 минут после старта, дать подсказку для первой части задания (сигнатура функции должна содержать не только передаваемый массив, но и его текущее заполнение, которое нужно отслеживать самостоятельно)
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Написать функцию добавления элемента в конец массива таким образом, чтобы она расширяла массив при необходимости.
Здесь нет смысла показывать не лучшее, но самое популярное решение, поэтому можно продемонстрировать сразу вариант решения «со звёздочкой».
\item [$*_1$] Функция должна возвращать ссылку на вновь созданный внутри себя массив, а не использовать глобальный
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={* Вариант без глобального массива}]
int[] add(int[] arr, int current, int value) {
if (current == arr.length) {
int[] temp = new int[arr.length * 2];
System.arraycopy(arr, 0, temp, 0, arr.length);
arr = temp;
}
arr[current++] = value;
return arr;
}
// main
int[] array = {1,2};
int size = 2;
System.out.println(size + " = " + Arrays.toString(array));
array = add(array, size++, 6);
System.out.println(size + " = " + Arrays.toString(array));
array = add(array, size++, 6);
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 5 (необязательное)}
\begin{itemize}
\item \textbf{Ценность этапа} Описание базовых алгоритмов манипуляции данными с применением вспомогательных массивов.
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Объяснить студентам, в чём заключается алгоритм сортировки подсчётом. Для сортировки подсчётом алгоритм совершает проход по исходному массиву, подсчитывая количество повторений каждого значения, и записывая эту информацию в промежуточный (частотный) массив. Вторым шагом алгоритма совершается обход вспомогательного массива и запись нужного количества значений по возрастанию в исходный массив. Сложность сортировки $O(2n)$. Например:
\[ x[2,1,0,4,3,0,0,1,2] \to t[3(x_0),2(x_1),2(x_2),1(x_3),1(x_4)] \to x[0,0,0,1,1,2,2,3,4] \]
\item Выдать задание группам студентов
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции, и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать общую программную документацию.
\item Написать метод, осуществляющий сортировку одномерного массива подсчётом. Важное ограничение состоит в том, что для этой сортировки диапазон значений исходного массива должен находиться в разумных пределах, например, не более 1000.
\textbf{Вариант решения}
\begin{figure}[H]
\centering
\includegraphics[width=80mm]{sem-01-t3-1.png}
\caption{Иерархия получившегося проекта}
\end{figure}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основной класс}]{src/s01-t3-Simple.java}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Pigeonhole sort}]
void pigeon(int[] arr) {
final int min = getMin(arr);
final int max = getMax(arr);
int[] freq = new int[max - min + 1];
for (int i = 0; i < size; i++)
freq[arr[i] - min]++;
\lstinputlisting[language=Java,style=JCodeStyle,caption={Вспомогательный класс}]{src/s01-t3-Complex.java}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции и создания документации}]
javac -sourcepath . -d out ru/gb/Simple.java
java -classpath ./out ru.gb.Simple
javadoc -d doc -sourcepath . -cp ./out -subpackages ru
int arrIndex = 0;
for (int i = 0; i < freq.length; i++)
for (int elems = freq[i]; elems > 0; elems--)
arr[arrIndex++] = i + min;
}
\end{lstlisting}
\item [$*_1$] создать документацию на каждый пакет по отдельности
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Вариант решения}]
javadoc -d doc_gb -sourcepath . -cp ./out ru.gb
javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
\end{lstlisting}
\end{itemize}
\end{itemize}

View File

@ -0,0 +1,7 @@
services:
app:
image: bellsoft/liberica-openjdk-alpine:11.0.16.1-1
command: javac -sourcepath /app/src -d /app/out /app/src/ru/gb/jcore/sample/Main.java
volumes:
- ./bin:/app/out
- ./src:/app/src

View File

@ -0,0 +1,6 @@
services:
app:
image: bellsoft/liberica-openjdk-alpine:11.0.16.1-1
command: java -classpath /app/out ru.gb.jcore.sample.Main
volumes:
- ./bin:/app/out

View File

@ -0,0 +1,11 @@
private static String caesar(String in, int key, boolean encrypt) {
if (in == null || in.isEmpty())
return null;
final int len = in.length();
char[] out = new char[len];
for (int i = 0; i < len; ++i) {
out[i] = (char) (in.charAt(i) + ((encrypt) ? key : -key));
}
return new String(out);
}

View File

@ -0,0 +1,11 @@
private static void shifter(int[] a, int n) {
n %= a.length;
int shift = a.length + n;
shift %= a.length;
for (int i = 0; i < shift; i++) {
int temp = a[a.length - 1];
System.arraycopy(a, 0, a, 1, a.length - 1);
a[0] = temp;
}
}

View File

@ -0,0 +1,7 @@
private static void change(int[] a) {
for (int i = 0; i < a.length; i++) {
a[i] = 1 - a[i];
// a[i] = (a[i] - 1) * -1;
// a[i] = (a[i] + 1) % 2;
}
}