diff --git a/prog-draft.tex b/prog-draft.tex index fb353c1..b460712 100644 --- a/prog-draft.tex +++ b/prog-draft.tex @@ -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} - diff --git a/seminars/build/jtc1-01c.pdf b/seminars/build/jtc1-01c.pdf index 7fb03b6..62895e7 100644 Binary files a/seminars/build/jtc1-01c.pdf and b/seminars/build/jtc1-01c.pdf differ diff --git a/seminars/build/jtc1-02c.pdf b/seminars/build/jtc1-02c.pdf index 8d3b745..81660ba 100644 Binary files a/seminars/build/jtc1-02c.pdf and b/seminars/build/jtc1-02c.pdf differ diff --git a/seminars/jtc1-01c.tex b/seminars/jtc1-01c.tex index 6281f21..a84fc1d 100644 --- a/seminars/jtc1-01c.tex +++ b/seminars/jtc1-01c.tex @@ -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} - \ No newline at end of file diff --git a/seminars/jtc1-02c.tex b/seminars/jtc1-02c.tex index 02c05e2..e9f1b40 100644 --- a/seminars/jtc1-02c.tex +++ b/seminars/jtc1-02c.tex @@ -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} diff --git a/seminars/src/s01-h04-docker-compose-class.yml b/seminars/src/s01-h04-docker-compose-class.yml new file mode 100644 index 0000000..1a5f11c --- /dev/null +++ b/seminars/src/s01-h04-docker-compose-class.yml @@ -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 \ No newline at end of file diff --git a/seminars/src/s01-h04-docker-compose-exec.yml b/seminars/src/s01-h04-docker-compose-exec.yml new file mode 100644 index 0000000..e694126 --- /dev/null +++ b/seminars/src/s01-h04-docker-compose-exec.yml @@ -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 diff --git a/seminars/src/s02-h1-caesar.java b/seminars/src/s02-h1-caesar.java new file mode 100644 index 0000000..fc9a069 --- /dev/null +++ b/seminars/src/s02-h1-caesar.java @@ -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); +} diff --git a/seminars/src/s02-h2-shifter.java b/seminars/src/s02-h2-shifter.java new file mode 100644 index 0000000..0ba5588 --- /dev/null +++ b/seminars/src/s02-h2-shifter.java @@ -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; + } +} diff --git a/seminars/src/s02-h3-inverse.java b/seminars/src/s02-h3-inverse.java new file mode 100644 index 0000000..4c6f10a --- /dev/null +++ b/seminars/src/s02-h3-inverse.java @@ -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; + } +}