gb-java-devel/jtc2-02-workshop.tex

429 lines
28 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\documentclass[j-spec.tex]{subfiles}
\usepackage{spreadtab}
\begin{document}
\setcounter{section}{1}
\section{Семинар: данные и функции}
\subsection{Инструментарий}
\begin{itemize}
\item \href{https://docs.google.com/presentation/d/1GBiXN2dfVc0LlDi4AXpnJMcJZnvK4WHZnIY34Sd3EE0/edit}{Презентация} для преподавателя, ведущего семинар;
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
\item JDK любая 11 версии и выше;
\item \href{https://www.jetbrains.com/idea/download}{IntelliJ IDEA Community Edition} для практики и примеров используется IDEA.
\end{itemize}
\subsection{Цели семинара}
\begin{itemize}
\item Закрепить полученные на лекции знания, хранения примитивных и ссылочных типов данных;
\item Получить практический навык создания функций по описанию;
\item Попрактиковаться в написании простых функций, манипулирующих ссылочными данными.
\end{itemize}
\subsection{План-содержание}
\noindent
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
\hline
@ Что происходит & @ Время & @ Слайды & @ Описание \\
\hline
\endhead
@ Организационный момент & 5 tag(beg) & @ 1-5 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
\hline
@ Quiz & 5 & @ 6-18 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ лекции & 10 & @ 19-23 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 24 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 10 & @ 25-28 & @ Сравнить насколько разные могут быть прочтения одного и того же технического задания - одна функция для двух значений, возврат значений, возврат индекса, объявление исходного массива внутри функции поиска и др); \\
\hline
@ Задание 2 & 10 & @ 29-32 & @ Корректная манипуляция индексами, как следствие, сокращение числа возможных проходов по массиву и ускорение работы приложени \\
\hline
@ Перерыв (если нужен) & 5 & @ 33 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 3 & 20 & @ 34-37 & @ Формирование алгоритмического мышления при решении задач с описанием верхнего уровня \\
\hline
@ Задание 4 & 15 & @ 38-41 & @ Понимание внутренней механики работы фреймворка коллекций, повышение уровня абстракции написанного кода \\
\hline
@ Задание 5 (необязат) & 20 & @ 42-44 & @ Описание базовых алгоритмов манипуляции данными с применением вспомогательных массивов \\
\hline
@ Домашнее задание & 5 & @ 45-46 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ Рефлексия & 10 tag(end) & @ 47-48 & @ Преподаватель запрашивает обратную связь \\
\hline
@ Длительность & sum(cell(beg):cell(end)) & & \\
\hline
\end{spreadtab}
\subsection{Подробности}
\subsubsection{Организационный момент}
\begin{itemize}
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf{Тайминг:} 3-5 минут.
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Презентует название курса (первый раз) и семинара;
\item Рассказывает немного о себе;
\item Запрашивает активность от аудитории в чате;
\item Презентует цели курса и семинара;
\item Презентует краткий план семинара и что студент научится делать.
\end{itemize}
\end{itemize}
\subsubsection{Quiz}
\begin{itemize}
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
\item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
\end{itemize}
\item \textbf{Вопросы и ответы:}
\begin{enumerate}
\item Магическое число -- это: (1)
\begin{enumerate}
\item числовая константа без пояснений;
\item число, помогающее в вычислениях;
\item числовая константа, присваиваемая при объявлении переменной.
\end{enumerate}
\item Какое значение будет содержаться в переменной a после выполнения строки \code{int а = 10.0f/3.0f;} (3)
\item Сколько будет создано одномерных массивов при инициализации массива 3х3x3? (13)
\item \code{2 + 2 * 2 == 2 << 2 >> 1}? (false? 6 != 4)
\end{enumerate}
\end{itemize}
\subsubsection{Рассмотрение ДЗ}
\begin{itemize}
\item \textbf{Цель этапа:} Пояснить неочевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf{Тайминг:} 15-20 минут.
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
\item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
\end{itemize}
\item \textbf{Домашнее задание из лекции:}
\begin{itemize}
\item Написать метод «Шифр Цезаря», с булевым параметром зашифрования/расшифрования, и числовым ключом;
\textbf{Вариант решения}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Шифр Цезаря}]{src/s02-h1-caesar.java}
\item Написать метод, принимающий на вход массив чисел и параметр \code{n}. Метод должен осуществить циклический (последний элемент при сдвиге становится первым) сдвиг всех элементов массива на n позиций;
\textbf{Вариант решения}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Сдвиговый метод}]{src/s02-h2-shifter.java}
\item Написать метод, которому можно передать в качестве аргумента массив, состоящий строго из единиц и нулей (целые числа типа \code{int}). Метод должен заменить единицы в массиве на нули, а нули на единицы и не содержать ветвлений. Написать как можно больше вариантов метода
\textbf{Вариант решения}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Инверсия}]{src/s02-h3-inverse.java}
\end{itemize}
\end{itemize}
\subsubsection{Вопросы и ответы}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-15 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
\item Посоветовать литературу на тему заданного вопроса;
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
\end{itemize}
\end{itemize}
\subsubsection{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа} Базовая манипуляция данными внутри массива.
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Первые пять минут уклоняться от ответов на уточняющие вопросы
\item Пояснить студентам ценность опыта (сравнить насколько разные могут быть прочтения одного и того же технического задания - одна функция для двух значений, возврат значений, возврат индекса, объявление исходного массива внутри функции поиска и др);
\item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}:
\begin{itemize}
\item Задать одномерный массив. Написать методы поиска в нём минимального и максимального элемента;
\textbf{Вариант решения}
\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}
\item [$*_1$] Привести функции к корректному виду и дополнительно написать ещё две функции так, чтобы получились (четыре) функции поиска минимального и максимального как значения, так и индекса.
\textbf{Вариант решения}
\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{Ценность этапа} Оптимизация сложности алгоритмов при работе с многомерными массивами.
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (корректная манипуляция индексами, как следствие, сокращение числа возможных проходов по массиву и ускорение работы приложения);
\item Пояснить студентам в каком виде выполнять и сдавать задания;
\item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Создать квадратный целочисленный массив (количество строк и столбцов одинаковое), заполнить его диагональные элементы единицами, используя цикл(ы)
\textbf{Вариант решения}
\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$] дописать функцию вывода двумерного массива в консоль
\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{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\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 Написать метод, осуществляющий сортировку одномерного массива подсчётом. Важное ограничение состоит в том, что для этой сортировки диапазон значений исходного массива должен находиться в разумных пределах, например, не более 1000.
\textbf{Вариант решения}
\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 < arr.length; i++)
freq[arr[i] - min]++;
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}
\end{itemize}
\end{itemize}
\subsubsection{Домашнее задание}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-10 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам в каком виде выполнять и сдавать задания
\item Уточнить кто будет проверять работы (преподаватель или ревьювер)
\item Объяснить к кому обращаться за помощью и где искать подсказки
\item Объяснить где взять проект заготовки для дз
\end{itemize}
\item \textbf{Задания}
\begin{enumerate}
\item [5-25 мин] Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
Все варианты решения приведены в тексте семинара выше
\item [5-10 мин] Написать метод, возвращающий количество чётных элементов массива.
\begin{itemize}
\item [] \code{countEvens([2, 1, 2, 3, 4])} $\to$ \code{3}
\item [] \code{countEvens([2, 2, 0])} $\to$ \code{3}
\item [] \code{countEvens([1, 3, 5])} $\to$ \code{0}
\end{itemize}
\lstinputlisting[language=Java,style=JCodeStyle,caption={CountEvens.java}]{src/s02-hw2-count.java}
\item [10 мин] Написать функцию, возвращающую разницу между самым большим и самым маленьким элементами переданного не пустого массива.
\lstinputlisting[language=Java,style=JCodeStyle,caption={Spread.java}]{src/s02-hw2-spread.java}
\item [10 мин] Написать функцию, возвращающую истину, если в переданном массиве есть два соседних элемента, с нулевым значением.
\lstinputlisting[language=Java,style=JCodeStyle,caption={Zero2.java}]{src/s02-hw2-zeros.java}
\end{enumerate}
\end{itemize}
\subsubsection{Рефлексия и завершение семинара}
\begin{itemize}
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf{Тайминг:} 5-10 минут
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Запросить обратную связь от студентов.
\item Подчеркните то, чему студенты научились на занятии.
\item Дайте рекомендации по решению заданий, если в этом есть необходимость
\item Дайте краткую обратную связь студентам.
\item Поделитесь ощущением от семинара.
\item Поблагодарите за проделанную работу.
\end{itemize}
\end{itemize}
\end{document}